
Le bruissement est un analyseur statique automatique pour les contrats proches de la rouille. Il peut aider à localiser des dizaines de différentes vulnérabilités dans des contrats presque intelligents. Selon Defillama, parmi les 10 meilleurs DAPP de près, 8 sont audités par BlockSec. Avec une riche expérience d'audit et une compréhension approfondie du protocole proche, nous construisons cet outil et le partageons avec la communauté.
Installez les boîtes à outils requises avec les commandes suivantes pour le bruissement dans Linux. Les commandes sont testées dans 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 Les commandes suivantes sont destinées aux utilisateurs utilisant MacOS, ils sont testés uniquement sur Apple Silicon Mac, alors utilisez-les avec prudence.
# 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 rustfiltNous fournissons une solution 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 : Chemin vers la source du contrat.tg_dir : chemin vers la cible de construction du contrat. Les défauts sont les mêmes que src_dir .detector : la liste des détecteurs. Il peut être utilisé pour transmettre plusieurs détecteurs ou groupes séparés par , . Par défaut à all .all les groupes pour activer tous les détecteurs.high , medium , low et info pour permettre aux groupes de détecteurs avec une gravité différente (voir les détecteurs)nep-ft , nep-storage et nep-nft pour permettre aux détecteurs implémentés pour les groupes de détecteur NEP spécifiés (voir les groupes de détecteur NEP)output : chemin où les rapports d'audit seront générés en. Par défaut ./audit-result . Remarque: Si le code de bit cible ( .bc binaire) construit par cargo n'est pas dans le $src_dir , utilisez -t|--tg_dir pour définir le répertoire de la cible, ou il sera défini sur $src_dir par défaut.
La commande ci-dessous montre un exemple d'analyse de la linéaire.
# 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-reportUn rapport CSV-Format sera généré dans le répertoire "./audit-result".
Toutes les vulnérabilités se bruissent .
| ID du détecteur | Description | Gravité |
|---|---|---|
unhandled-promise | trouver Promises qui ne sont pas traitées | Haut |
non-private-callback | Macro #[private] manquant pour les fonctions de rappel | Haut |
reentrancy | Trouver des fonctions vulnérables à l'attaque de réentrance | Haut |
unsafe-math | Manque de chèque de débordement pour l'opération arithmétique | Haut |
self-transfer | Vérification manquante de sender != receiver | Haut |
incorrect-json-type | type incorrect utilisé dans les paramètres ou les valeurs de retour | Haut |
unsaved-changes | Les modifications apportées aux collections ne sont pas enregistrées | Haut |
nft-approval-check | Trouver nft_transfer sans vérification de approval id | Haut |
nft-owner-check | Trouvez des fonctions d'approbation ou de révocation sans vérifier le propriétaire | Haut |
div-before-mul | Perte de précision due à un ordre de fonctionnement incorrect | Moyen |
round | Arrondi sans spécifier le plafond ou le sol | Moyen |
lock-callback | La panique dans la fonction de rappel peut verrouiller le contrat | Moyen |
yocto-attach | pas assert_one_yocto en fonction privilégiée | Moyen |
dup-collection-id | Les utilisations d'identification en double dans les collections | Moyen |
unregistered-receiver | pas de panique sur les récepteurs de transfert non enregistrés | Moyen |
nep${id}-interface | Trouver toute l'interface NEP non implémentée | Moyen |
prepaid-gas | Vérification manquante du gaz prépayé dans ft_transfer_call | Faible |
non-callback-private | macro #[private] Utilisé dans la fonction non-Callback | Faible |
unused-ret | Résultat de la fonction non utilisé ou vérifié | Faible |
upgrade-func | Aucune fonction de mise à niveau dans le contrat | Faible |
tautology | Tautologie utilisée dans la branche conditionnelle | Faible |
storage-gas | Vérification de l'équilibre manquant pour l'expansion de stockage | Faible |
unclaimed-storage-fee | Vérification de l'équilibre manquant avant le stockage | Faible |
inconsistency | Utilisation d'un symbole similaire mais légèrement différent | Informations |
timestamp | Trouver toutes les utilisations de timestamp | Informations |
complex-loop | Trouvez toutes les boucles avec une logique complexe qui peut conduire à DOS | Informations |
ext-call | Trouver toutes les invocations transversales | Informations |
promise-result | Trouver toutes les utilisations du résultat de promesses | Informations |
transfer | Trouvez toutes les actions de transfert | Informations |
public-interface | Trouvez toutes les interfaces publiques | Informations |
Outre les groupes par niveau de gravité, le bruissement fournit certains groupes de détecteurs par la NEP correspondante. Actuellement, le bruissement soutient les groupes suivants.
| NEP | ID de groupe de détecteur | ID du détecteur |
|---|---|---|
| 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 et de son nom à la liste des détecteurs et aux groupes de gravité dans le script ./rustle .audit.py ).Le bruissement peut être utilisé dans le processus de développement pour scanner les contrats presque intelligents de manière itérative. Cela peut économiser beaucoup d'efforts manuels et atténuer une partie des problèmes potentiels. Cependant, les vulnérabilités dans la logique complexe ou liées à la sémantique sont toujours la limitation du bruissement . La localisation des problèmes sémantiques complexes nécessite que les experts de BlockSEC effectuent des examens exhaustifs et approfondis. Contactez-nous pour le service d'audit.
Ce projet est sous la licence AGPLV3. Voir le fichier de licence pour le texte complet de licence.