Rejoignez l'Empire Hacking Slack
- Discussions et assistance
Slither est un framework d'analyse statique Solidity & Vyper écrit en Python3. Il exécute une suite de détecteurs de vulnérabilité, imprime des informations visuelles sur les détails du contrat et fournit une API pour rédiger facilement des analyses personnalisées. Slither permet aux développeurs de trouver des vulnérabilités, d'améliorer leur compréhension du code et de prototyper rapidement des analyses personnalisées.
Exécutez Slither sur une application Hardhat/Foundry/Dapp/Brownie :
slither .
C'est l'option préférée si votre projet comporte des dépendances, car Slither s'appuie sur le framework de compilation sous-jacent pour compiler le code source.
Cependant, vous pouvez exécuter Slither sur un seul fichier qui n'importe pas de dépendances :
slither tests/uninitialized.sol
Note
Slither nécessite Python 3.8+. Si vous n'utilisez pas l'un des frameworks de compilation pris en charge, vous avez besoin de solc, le compilateur Solidity ; nous vous recommandons d'utiliser solc-select pour basculer facilement entre les versions de solc.
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
Nous vous recommandons d'utiliser un environnement virtuel Python, comme détaillé dans les instructions d'installation du développeur, si vous préférez installer Slither via git.
Utilisez l'image Docker eth-security-toolbox
. Il comprend tous nos outils de sécurité et toutes les versions majeures de Solidity dans une seule image. /home/share
sera monté sur /share
dans le conteneur.
docker pull trailofbits/eth-security-toolbox
Pour partager un répertoire dans le conteneur :
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
par une vraie balise) - repo : https://github.com/crytic/slither
rev : $GIT_TAG
hooks :
- id : slither
slither [target] --checklist
.slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/
(remplacez ORG
, REPO
, COMMIT
) Numéro | Détecteur | Ce qu'il détecte | Impact | Confiance |
---|---|---|---|---|
1 | abiencoderv2-array | Tableau de stockage abiencoderv2 | Haut | Haut |
2 | arbitrary-send-erc20 | transferFrom utilise from | Haut | Haut |
3 | array-by-reference | Modification d'une matrice de stockage par valeur | Haut | Haut |
4 | encode-packed-collision | ABI encodePacked Collision | Haut | Haut |
5 | incorrect-shift | L'ordre des paramètres dans une instruction de décalage est incorrect. | Haut | Haut |
6 | multiple-constructors | Schémas de constructeurs multiples | Haut | Haut |
7 | name-reused | Nom du contrat réutilisé | Haut | Haut |
8 | protected-vars | Variables non protégées détectées | Haut | Haut |
9 | public-mappings-nested | Mappages publics avec des variables imbriquées | Haut | Haut |
10 | rtlo | Le caractère de contrôle Right-To-Left-Override est utilisé | Haut | Haut |
11 | shadowing-state | Observation des variables d'état | Haut | Haut |
12 | suicidal | Fonctions permettant à quiconque de détruire le contrat | Haut | Haut |
13 | uninitialized-state | Variables d'état non initialisées | Haut | Haut |
14 | uninitialized-storage | Variables de stockage non initialisées | Haut | Haut |
15 | unprotected-upgrade | Contrat évolutif non protégé | Haut | Haut |
16 | codex | Utilisez le Codex pour trouver les vulnérabilités. | Haut | Faible |
17 | arbitrary-send-erc20-permit | transferFrom utilise arbitrairement avec permis | Haut | Moyen |
18 | arbitrary-send-eth | Fonctions qui envoient Ether vers des destinations arbitraires | Haut | Moyen |
19 | controlled-array-length | Attribution de la longueur du tableau entaché | Haut | Moyen |
20 | controlled-delegatecall | Destination d'appel délégué contrôlée | Haut | Moyen |
21 | delegatecall-loop | Fonctions payantes utilisant delegatecall dans une boucle | Haut | Moyen |
22 | incorrect-exp | Exponentiation incorrecte | Haut | Moyen |
23 | incorrect-return | Si un return est utilisé de manière incorrecte en mode assemblage. | Haut | Moyen |
24 | msg-value-loop | msg.value dans une boucle | Haut | Moyen |
25 | reentrancy-eth | Vulnérabilités de réentrée (vol d’éthers) | Haut | Moyen |
26 | return-leave | Si un return est utilisé à la place d'un leave . | Haut | Moyen |
27 | storage-array | Bogue du compilateur de tableau d'entiers de stockage signé | Haut | Moyen |
28 | unchecked-transfer | Transfert de jetons non contrôlé | Haut | Moyen |
29 | weak-prng | PRNG faible | Haut | Moyen |
30 | domain-separator-collision | Détecte les jetons ERC20 qui ont une fonction dont la signature entre en collision avec DOMAIN_SEPARATOR() d'EIP-2612 | Moyen | Haut |
31 | enum-conversion | Détecter les conversions d'énumération dangereuses | Moyen | Haut |
32 | erc20-interface | Interfaces ERC20 incorrectes | Moyen | Haut |
33 | erc721-interface | Interfaces ERC721 incorrectes | Moyen | Haut |
34 | incorrect-equality | Des égalités strictes et dangereuses | Moyen | Haut |
35 | locked-ether | Contrats qui bloquent l'éther | Moyen | Haut |
36 | mapping-deletion | Suppression sur mapping contenant une structure | Moyen | Haut |
37 | shadowing-abstract | Variables d'état masquées à partir de contrats abstraits | Moyen | Haut |
38 | tautological-compare | Comparer une variable à elle-même renvoie toujours vrai ou faux, selon la comparaison | Moyen | Haut |
39 | tautology | Tautologie ou contradiction | Moyen | Haut |
40 | write-after-write | Écriture inutilisée | Moyen | Haut |
41 | boolean-cst | Utilisation abusive de la constante booléenne | Moyen | Moyen |
42 | constant-function-asm | Fonctions constantes utilisant le code assembleur | Moyen | Moyen |
43 | constant-function-state | Fonctions constantes changeant l'état | Moyen | Moyen |
44 | divide-before-multiply | Ordre des opérations arithmétiques imprécises | Moyen | Moyen |
45 | out-of-order-retryable | Transactions réessayables dans le désordre | Moyen | Moyen |
46 | reentrancy-no-eth | Vulnérabilités de réentrée (pas de vol d’éthers) | Moyen | Moyen |
47 | reused-constructor | Constructeur de base réutilisé | Moyen | Moyen |
48 | tx-origin | Utilisation dangereuse de tx.origin | Moyen | Moyen |
49 | unchecked-lowlevel | Appels de bas niveau non vérifiés | Moyen | Moyen |
50 | unchecked-send | Envoi non coché | Moyen | Moyen |
51 | uninitialized-local | Variables locales non initialisées | Moyen | Moyen |
52 | unused-return | Valeurs de retour inutilisées | Moyen | Moyen |
53 | incorrect-modifier | Modificateurs pouvant renvoyer la valeur par défaut | Faible | Haut |
54 | shadowing-builtin | Ombrage de symboles intégré | Faible | Haut |
55 | shadowing-local | Observation des variables locales | Faible | Haut |
56 | uninitialized-fptr-cst | Appels de pointeur de fonction non initialisé dans les constructeurs | Faible | Haut |
57 | variable-scope | Variables locales utilisées avant leur déclaration | Faible | Haut |
58 | void-cst | Constructeur appelé non implémenté | Faible | Haut |
59 | calls-loop | Plusieurs appels en boucle | Faible | Moyen |
60 | events-access | Contrôle d'accès aux événements manquants | Faible | Moyen |
61 | events-maths | Arithmétique des événements manquants | Faible | Moyen |
62 | incorrect-unary | Expressions unaires dangereuses | Faible | Moyen |
63 | missing-zero-check | Validation d'adresse zéro manquante | Faible | Moyen |
64 | reentrancy-benign | Vulnérabilités bénignes de réentrée | Faible | Moyen |
65 | reentrancy-events | Vulnérabilités de réentrée conduisant à des événements dans le désordre | Faible | Moyen |
66 | return-bomb | Un appelé de faible niveau peut consommer du gaz de tous les appelants de manière inattendue. | Faible | Moyen |
67 | timestamp | Utilisation dangereuse de block.timestamp | Faible | Moyen |
68 | assembly | Utilisation de l'assemblage | Informatif | Haut |
69 | assert-state-change | Affirmer un changement d'état | Informatif | Haut |
70 | boolean-equal | Comparaison avec la constante booléenne | Informatif | Haut |
71 | cyclomatic-complexity | Détecte les fonctions avec une complexité cyclomatique élevée (> 11) | Informatif | Haut |
72 | deprecated-standards | Normes de solidité obsolètes | Informatif | Haut |
73 | erc20-indexed | Paramètres d'événement ERC20 non indexés | Informatif | Haut |
74 | function-init-state | Fonction initialisant les variables d'état | Informatif | Haut |
75 | incorrect-using-for | Détecte l'utilisation de l'instruction using-for lorsqu'aucune fonction d'une bibliothèque donnée ne correspond à un type donné | Informatif | Haut |
76 | low-level-calls | Appels de bas niveau | Informatif | Haut |
77 | missing-inheritance | Héritage manquant | Informatif | Haut |
78 | naming-convention | Conformité aux conventions de dénomination Solidity | Informatif | Haut |
79 | pragma | Si différentes directives pragma sont utilisées | Informatif | Haut |
80 | redundant-statements | Déclarations redondantes | Informatif | Haut |
81 | solc-version | Version Solidité incorrecte | Informatif | Haut |
82 | unimplemented-functions | Fonctions non implémentées | Informatif | Haut |
83 | unused-import | Détecte les importations inutilisées | Informatif | Haut |
84 | unused-state | Variables d'état inutilisées | Informatif | Haut |
85 | costly-loop | Des opérations coûteuses en boucle | Informatif | Moyen |
86 | dead-code | Fonctions non utilisées | Informatif | Moyen |
87 | reentrancy-unlimited-gas | Vulnérabilités de réentrée via l'envoi et le transfert | Informatif | Moyen |
88 | too-many-digits | Conformité aux meilleures pratiques en matière de notation numérique | Informatif | Moyen |
89 | cache-array-length | Détecte for boucles qui utilisent le membre length d'un tableau de stockage dans leur condition de boucle et ne le modifient pas. | Optimisation | Haut |
90 | constable-states | Variables d'état qui pourraient être déclarées constantes | Optimisation | Haut |
91 | external-function | Fonction publique pouvant être déclarée externe | Optimisation | Haut |
92 | immutable-states | Variables d'état qui pourraient être déclarées immuables | Optimisation | Haut |
93 | var-read-using-this | Le contrat lit sa propre variable en utilisant this | Optimisation | Haut |
Pour plus d'informations, voir
human-summary
: Imprimer un résumé lisible des contratsinheritance-graph
: Exporter le graphe d'héritage de chaque contrat vers un fichier dotcontract-summary
: Imprimer un récapitulatif des contratsloc
: Comptez le nombre total de lignes de code (LOC), de lignes de code source (SLOC) et de lignes de code de commentaires (CLOC) trouvées dans les fichiers source (SRC), les dépendances (DEP) et les fichiers de test (TEST).call-graph
: Exporter le call-graph des contrats vers un fichier dotcfg
: Exporte le CFG de chaque fonctionfunction-summary
: Imprimer un résumé des fonctionsvars-and-auth
: Affiche les variables d'état écrites et l'autorisation des fonctionsnot-pausable
: Imprimer les fonctions qui n'utilisent pas le modificateur whenNotPaused
. Pour exécuter une imprimante, utilisez --print
et une liste d'imprimantes séparées par des virgules.
Consultez la documentation de l'imprimante pour les listes complètes.
slither-check-upgradeability
: Examiner la mise à niveau basée sur delegatecall
slither-prop
: Test unitaire automatique et génération de propriétésslither-flat
: Aplatir une base de codeslither-check-erc
: Vérifier la conformité de l'ERCslither-format
: génération automatique de patchsslither-read-storage
: Lire les valeurs de stockage des contratsslither-interface
: Générer une interface pour un contratConsultez la documentation de l'outil pour des outils supplémentaires.
Contactez-nous pour obtenir de l'aide sur la création d'outils personnalisés.
La documentation sur les composants internes de Slither est disponible ici.
N'hésitez pas à vous arrêter sur notre chaîne Slack (#ethereum) pour obtenir de l'aide sur l'utilisation ou l'extension de Slither.
La documentation de l'imprimante décrit les informations que Slither est capable de visualiser pour chaque contrat.
La documentation du Detector décrit comment rédiger une nouvelle analyse de vulnérabilité.
La documentation de l'API décrit les méthodes et les objets disponibles pour les analyses personnalisées.
La documentation SlithIR décrit la représentation intermédiaire SlithIR.
Comment exclure les simulations ou les tests ?
Comment puis-je résoudre les problèmes de « fichier inconnu » ou de compilation ?
slither contract.sol
échouera. Utilisez plutôt slither .
dans le répertoire parent de contracts/
(vous devriez voir contracts/
lorsque vous exécutez ls
). Si vous avez un dossier node_modules/
, il doit se trouver dans le même répertoire que contracts/
. Pour vérifier que ce problème est lié à Slither, exécutez la commande de compilation pour le framework que vous utilisez, par exemple npx hardhat compile
. Cela doit fonctionner avec succès ; sinon, le moteur de compilation de Slither, crytic-compile, ne peut pas générer l'AST. Slither est sous licence et distribué sous la licence AGPLv3. Contactez-nous si vous recherchez une exception aux conditions.
Titre | Usage | Auteurs | Lieu | Code |
---|---|---|---|---|
Rejection : une méthode de détection de vulnérabilité de réentrée basée sur AST | Analyse basée sur AST construite sur Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS19 | - |
MPro : combiner l'analyse statique et symbolique pour des tests évolutifs de contrats intelligents | Tirez parti de la dépendance aux données via Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISRE 2019 | MPro |
ETHPLOIT : Du fuzzing à la génération efficace d'exploits contre les contrats intelligents | Tirez parti de la dépendance aux données via Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
Vérification des contrats intelligents Ethereum : une approche de vérification de modèle | Exécution symbolique construite sur le CFG de Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC20 | - |
Réparation de contrat intelligent | Fiez-vous aux détecteurs de vulnérabilités de Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSME 20 | SCRéparation |
Démystifier les boucles dans les contrats intelligents | Tirez parti de la dépendance aux données via Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ACE 20 | - |
Estimation dynamique des gaz basée sur les traces dans les contrats intelligents | Utilisez le CFG de Slither pour détecter les boucles | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
SAILFISH : Vérification des bogues d'incohérence d'état des contrats intelligents en quelques secondes | Fiez-vous à SlithIR pour créer un graphique de dépendance au stockage | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel et Giovanni Vigna | S&P22 | Voilier |
SolType : types de raffinement pour le débordement arithmétique dans Solidity | Utilisez Slither comme interface pour créer un système de type de raffinement | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL22 | - |
Ne me moquez pas : tirer parti des techniques d'apprentissage automatique pour une détection automatisée des arnaques | Utilisez Slither pour extraire les fonctionnalités des jetons (minable, pauseable, ..) | Mazorra, Bruno, Victor Adan et Vanesa Daza | Mathématiques 10.6 (2022) | - |
MANDO : intégration de graphiques hétérogènes à plusieurs niveaux pour une détection fine des vulnérabilités des contrats intelligents | Utilisez Slither pour extraire le CFG et le graphique d'appel | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan et Lingxiao Jiang | 9e conférence internationale de l'IEEE sur la science des données et l'analyse avancée (DSAA, 2022) | ge-sc |
Audit automatisé des vulnérabilités TOD de hausse des prix dans les contrats intelligents | Utilisez Slither pour extraire le CFG et les dépendances de données | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris et Fan Long | Conférence internationale IEEE 2022 sur la blockchain et la crypto-monnaie (ICBC) | Smart-Contrat-Réparation |
Modélisation et application des politiques de contrôle d'accès pour les contrats intelligents | Étendre les dépendances de données de Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | Conférence internationale de l'IEEE sur les applications et infrastructures décentralisées (DAPPS), 2022 | SolidityAccessControlEnforcement |
Détection des vulnérabilités des contrats intelligents basée sur l'apprentissage profond et la fusion de décisions multimodales | Utilisez Slither pour extraire le CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng et Xuan Hu | Capteurs 2023, 23, 7246 | - |
Graphe de connaissances du code enrichi en sémantique pour révéler les inconnues dans la réutilisation du code des contrats intelligents | Utilisez Slither pour extraire les fonctionnalités du code (CFG, fonction, types de paramètres, ..) | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | Transactions ACM sur le génie logiciel et la méthodologie, 2023 | - |
Exécution parallèle de contrats intelligents avec accès à l'état à granularité fine | Utilisez Slither pour créer des graphiques d'accès à l'état | Xiaodong Qi, Jiao Jiao, Yi Li | Conférence internationale sur les systèmes informatiques distribués (ICDCS), 2023 | - |
Pommes pourries : comprendre les risques de sécurité centralisés dans les écosystèmes décentralisés | Implémenter une analyse interne au-dessus de Slither | Kailun Yan, Jilian Zhang, Xiangyu Liu, Wenrui Diao, Shanqing Guo | Conférence Web ACM avril 2023 | - |
Identifier les vulnérabilités des contrats intelligents à l'aide de l'analyse d'intervalle | Créez 4 détecteurs au-dessus de Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | À PARTIR DE 2023 | - |
Analyse de l'état de stockage et extraction des contrats intelligents Ethereum Blockchain (pas de PDF en libre accès) | Faites confiance aux CFG et AST de Slither | Maha Ayub, Tania Saleem, Muhammad Janjua, Talha Ahmad | TOSEM 2023 | SmartMuv |
Si vous utilisez Slither dans le cadre d'un travail universitaire, envisagez de postuler au prix de recherche Crytic de 10 000 $.