
Rustle é um analisador estático automático para contratos quase inteligentes em ferrugem. Pode ajudar a localizar dezenas de diferentes vulnerabilidades em contratos quase inteligentes. Segundo Defillama, entre os 10 principais Dapps em perto, 8 são auditados pelo BlockSec. Com rica experiência de auditoria e uma profunda compreensão do protocolo próximo, construímos essa ferramenta e a compartilhamos com a comunidade.
Instale os kits de ferramentas necessários com os seguintes comandos para Rustle no Linux. Os comandos são testados no Ubuntu 20.04 LTS.
# install Rust Toolchain
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# install LLVM 15
sudo bash -c " $( wget -O - https://apt.llvm.org/llvm.sh ) " 15
# install Python toolchain
sudo apt install python3 python3-pip # requires python >= 3.8
pip3 install -r utils/requirements.txt # you need to clone this repo first
# add WASM target
rustup target add wasm32-unknown-unknown
# install other components
sudo apt install figlet
cargo install rustfilt
# [optional] useful tools for developing
LLVM_VERSION=
sudo apt install clangd- $LLVM_VERSION clang-format- $LLVM_VERSION clang-tidy- $LLVM_VERSION Os seguintes comandos são para usuários que usam macOS, eles são testados apenas no Apple Silicon Mac; portanto, use -os com cautela.
# install Rust Toolchain
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# install LLVM 15
brew install llvm@15
# install Python packages
pip3 install -r utils/requirements.txt # you need to clone this repo first
# using macOS default python3
# add WASM target
rustup target add wasm32-unknown-unknown
# install other components
brew install figlet coreutils gsed
cargo install rustfiltNós fornecemos uma solução do Docker.
# build the image
docker build --build-arg UID= ` id -u ` --build-arg GID= ` id -g ` -t rustle .
# run a container from the image
docker run --name rustle -it -v ` pwd ` :/rustle -w /rustle rustle bash
# exec the container
docker start rustle
docker exec -it -w /rustle rustle bash./rustle [-t | --tg_dir < tg_dir > ] [-d | --detector < detector_list > ] [-o | --output < output_dir > ] [-h | --help] < src_dir >src_dir : caminho para a fonte do contrato.tg_dir : caminho para a meta de construção do contrato. Os padrões são os mesmos que src_dir .detector : a lista de detector. Pode ser usado para passar vários detectores ou grupos separados por , . Padrões para all .all o grupo para permitir todos os detectores.high , medium , low e info para ativar grupos detectores com gravidade diferente (consulte os detectores)nep-ft , nep-storage e nep-nft para permitir que os detectores implementados para o NEP especificado (consulte os grupos de detectores NEP)output : Caminho em que os relatórios de auditoria serão gerados. Padrões para ./audit-result . Nota: Se o código de bit de destino ( .bc binário) construído por carga não estiver no $src_dir , use -t|--tg_dir para definir o diretório do destino ou será definido como $src_dir por padrão.
O comando abaixo mostra um exemplo de análise do linear.
# clone LiNEAR
git clone https://github.com/linear-protocol/LiNEAR.git ~ /near-repo/LiNEAR
# run Rustle
./rustle -t ~ /near-repo/LiNEAR ~ /near-repo/LiNEAR/contracts/linear
# [optional] run Rustle on specified detectors or severity groups and save audit reports in `~/linear-report`
./rustle -t ~ /near-repo/LiNEAR ~ /near-repo/LiNEAR/contracts/linear -d high,medium,complex-loop -o ~ /linear-reportUm relatório de formato de CSV será gerado no diretório "./audit-sult".
Todas as vulnerabilidades Rustle podem encontrar.
| ID do detector | Descrição | Gravidade |
|---|---|---|
unhandled-promise | Encontre Promises que não são tratadas | Alto |
non-private-callback | Macro ausente #[private] para funções de retorno de chamada | Alto |
reentrancy | Encontre funções vulneráveis ao ataque de reentrada | Alto |
unsafe-math | Falta de transbordamento Verifique a operação aritmética | Alto |
self-transfer | Verificação ausente do sender != receiver | Alto |
incorrect-json-type | Tipo incorreto usado em parâmetros ou valores de retorno | Alto |
unsaved-changes | Alterações nas coleções não são salvas | Alto |
nft-approval-check | Encontre nft_transfer sem verificação de approval id | Alto |
nft-owner-check | Encontre as funções Aprovar ou Revogar sem Verificação do Proprietário | Alto |
div-before-mul | perda de precisão devido a uma ordem de operação incorreta | Médio |
round | arredondando sem especificar teto ou piso | Médio |
lock-callback | pânico na função de retorno de chamada pode bloquear o contrato | Médio |
yocto-attach | sem assert_one_yocto em função privilegiada | Médio |
dup-collection-id | O ID duplicado usa em coleções | Médio |
unregistered-receiver | Sem pânico nos receptores de transferência não registrados | Médio |
nep${id}-interface | Encontre toda a interface NEP não implementada | Médio |
prepaid-gas | Verificação ausente do gás pré -pago em ft_transfer_call | Baixo |
non-callback-private | Macro #[private] usado na função não-calçada | Baixo |
unused-ret | Resultado da função não usado ou verificado | Baixo |
upgrade-func | Nenhuma função de atualização no contrato | Baixo |
tautology | tautologia usada no ramo condicional | Baixo |
storage-gas | Equilíbrio ausente Verifique a expansão de armazenamento | Baixo |
unclaimed-storage-fee | Falta de balanço verificação antes do armazenamento não registro | Baixo |
inconsistency | uso de símbolo semelhante, mas ligeiramente diferente | Informações |
timestamp | Encontre todos os usos do timestamp | Informações |
complex-loop | Encontre todos os loops com lógica complexa que pode levar a DOS | Informações |
ext-call | Encontre todas as invocações de contrato cruzado | Informações |
promise-result | Encontre todos os usos do resultado da promessa | Informações |
transfer | Encontre todas as ações de transferência | Informações |
public-interface | Encontre todas as interfaces públicas | Informações |
Além dos grupos por nível de gravidade, Rustle fornece alguns grupos de detectores pela NEP correspondente. Atualmente, Rustle suporta os seguintes grupos.
| Nep | ID do grupo detector | IDs de detector |
|---|---|---|
| NEP-141 | nep-ft | nep141-interface , self-transfer , unregistered-receiver |
| NEP-145 | nep-storage | nep145-interface , unclaimed-storage-fee |
| NEP-171, NEP-178 | nep-nft | nep171-interface , nft-approval-check , nft-owner-check |
audit e seu nome à lista de detector e grupos de gravidade no script ./rustle .audit.py ).Rustle pode ser usado no processo de desenvolvimento para digitalizar os contratos quase inteligentes iterativamente. Isso pode economizar muito esforço manual e mitigar parte de questões em potencial. No entanto, as vulnerabilidades em lógica complexa ou relacionadas à semântica ainda são a limitação do farfalhe . A localização de problemas semânticos complicados exige que os especialistas no BlockSec conduzam revisões exaustivas e completas. Entre em contato conosco para o serviço de auditoria.
Este projeto está sob a licença AGPLV3. Consulte o arquivo de licença para obter o texto completo da licença.