
Analyseur statique pour Solidity et Vyper
Rejoignez le Slack Empire Hacking
- Discussions et Support
Slither est un framework d'analyse statique pour Solidity et Vyper écrit en Python3. Il exécute une suite de détecteurs de vulnérabilités, affiche des informations visuelles sur les détails des contrats, et fournit une API pour écrire 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 :```console slither .
C'est l'option préférée si votre projet a 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 :```console
slither tests/uninitialized.sol
Remarque Slither nécessite Python 3.10+. Si vous n'utilisez pas l'un des frameworks de compilation pris en charge, vous avez besoin de solc, le compilateur Solidity ; nous recommandons d'utiliser solc-select pour basculer facilement entre les versions de solc.
uv est un gestionnaire de paquets Python rapide qui est 10 à 100 fois plus rapide que pip.```console
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install slither-analyzer
uvx --from slither-analyzer slither
Pour mettre à niveau:```console
uv tool upgrade slither-analyzer
python3 -m pip install slither-analyzer
Pour mettre à niveau :```console
python3 -m pip install --upgrade slither-analyzer
brew install slither-analyzer
### Utilisation de Git (Développement)```bash
git clone https://github.com/crytic/slither.git && cd slither
# Install as editable for development
uv tool install -e .
# Or use uv run for testing without installation
uv run slither <target>
Le drapeau -e installe en mode éditable, ce qui signifie que les modifications du code source sont immédiatement appliquées sans réinstallation.
Utilisez l'image docker eth-security-toolbox. Elle inclut tous nos outils de sécurité et chaque version majeure de Solidity dans une seule image. /home/share sera monté sur /share dans le conteneur.```bash
docker pull trailofbits/eth-security-toolbox
Pour partager un répertoire dans le conteneur :```bash
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG par le vrai tag) ```YAML
slither [target] --checklist.slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/ (remplacez ORG, REPO, COMMIT)| Num | Détecteur | Ce qu'il détecte | Impact | Confiance |
|---|---|---|---|---|
| 1 | abiencoderv2-array | Stockage du tableau abiencoderv2 | Élevé | Élevée |
| 2 | arbitrary-send-erc20 | transferFrom utilise un from arbitraire | Élevé | Élevée |
| 3 | array-by-reference | Modification du tableau de stockage par valeur | Élevé | Élevée |
| 4 | encode-packed-collision | Collision ABI encodePacked | Élevé | Élevée |
| 5 | incorrect-shift | L'ordre des paramètres dans une instruction de décalage est incorrect | Élevé | Élevée |
| 6 | multiple-constructors | Schémas de constructeurs multiples | Élevé | Élevée |
| 7 | name-reused | Nom de contrat réutilisé | Élevé | Élevée |
| 8 | protected-vars | Variables non protégées détectées | Élevé | Élevée |
| 9 | public-mappings-nested | Mappings publics avec variables imbriquées |
Pour plus d'informations, voir
human-summary : Imprime un résumé lisible des contratsinheritance-graph : Exporte le graphe d'héritage de chaque contrat vers un fichier dotcontract-summary : Imprime un résumé des contratsloc : Compte le nombre total de lignes de code (LOC), de lignes de code source (SLOC) et de lignes de commentaire (CLOC) trouvées dans les fichiers sources (SRC), les dépendances (DEP) et les fichiers de test (TEST).entry-points : Imprime toutes les fonctions de point d'entrée modifiant l'état et leurs variables des contratscall-graph: Exporter le graphe d'appel des contrats vers un fichier dotcfg: Exporter le CFG de chaque fonctionfunction-summary: Afficher un résumé des fonctionsvars-and-auth: Afficher les variables d'état écrites et l'autorisation des fonctionsnot-pausable: Afficher 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 des imprimantes pour la liste complète.
slither-check-upgradeability: Vérifier la mise à niveau basée sur delegatecallslither-prop: Génération automatique de tests unitaires et de propriétésslither-flat: Aplatir une base de codeslither-check-erc: Vérifier la conformité ERCslither-read-storage: Lire les valeurs de stockage des contratsslither-interface: Générer une interface pour un contratConsultez la documentation des outils pour des outils supplémentaires.
Contactez-nous pour obtenir de l'aide sur la construction d'outils personnalisés.
La documentation sur les internes de Slither est disponible ici.
N'hésitez pas à passer sur notre canal Slack (#ethereum) pour obtenir de l'aide sur l'utilisation ou l'extension de Slither.
La documentation des imprimantes décrit les informations que Slither est capable de visualiser pour chaque contrat.
La documentation des détecteurs décrit comment écrire une nouvelle analyse de vulnérabilité.
La documentation de l'API décrit les méthodes et objets disponibles pour les analyses personnalisées.
La documentation SlithIR décrit la représentation intermédiaire SlithIR.
Comment exclure les mocks ou les tests ?
Comment corriger 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 | Utilisation | Auteurs | Conférence/Publication | Code |
|---|---|---|---|---|
| ReJection: A AST-Based Reentrancy Vulnerability Detection Method | Analyse basée sur l'AST construite au-dessus de Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
| MPro: Combining Static and Symbolic Analysis for Scalable Testing of Smart Contract | Exploiter la dépendance de données via Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
| ETHPLOIT: From Fuzzing to Efficient Exploit Generation against Smart Contracts | Exploiter la dépendance de données via Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
| Verification of Ethereum Smart Contracts: A Model Checking Approach | Exécution symbolique construite au-dessus du CFG de Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
| Smart Contract Repair | S'appuyer sur les détecteurs de vulnérabilités de Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
| Demystifying Loops in Smart Contracts | Exploiter la dépendance de données via Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
| Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts | Utiliser 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: Vetting Smart Contract State-Inconsistency Bugs in Seconds |
Si vous utilisez Slither dans un travail académique, envisagez de postuler au Crytic $10k Research Prize.
| Élevé |
| Élevée |
| 10 | rtlo | Caractère de contrôle Right-To-Left Override utilisé | Élevé | Élevée |
| 11 | shadowing-state | Variables d'état masquées | Élevé | Élevée |
| 12 | suicidal | Fonctions permettant à quiconque de détruire le contrat | Élevé | Élevée |
| 13 | uninitialized-state | Variables d'état non initialisées | Élevé | Élevée |
| 14 | uninitialized-storage | Variables de stockage non initialisées | Élevé | Élevée |
| 15 | unprotected-upgrade | Contrat évolutif non protégé | Élevé | Élevée |
| 16 | arbitrary-send-erc20-permit | transferFrom utilise un from arbitraire avec permit | Élevé | Moyenne |
| 17 | arbitrary-send-eth | Fonctions qui envoient de l'Ether vers des destinations arbitraires | Élevé | Moyenne |
| 18 | controlled-array-length | Affectation de longueur de tableau contaminée | Élevé | Moyenne |
| 19 | controlled-delegatecall | Destination delegatecall contrôlée | Élevé | Moyenne |
| 20 | delegatecall-loop | Fonctions payables utilisant delegatecall dans une boucle | Élevé | Moyenne |
| 21 | incorrect-exp | Exponentiation incorrecte | Élevé | Moyenne |
| 22 | incorrect-return | Si un return est utilisé incorrectement en mode assembly | Élevé | Moyenne |
| 23 | msg-value-loop | msg.value dans une boucle | Élevé | Moyenne |
| 24 | reentrancy-eth | Vulnérabilités de réentrance (vol d'Ether) | Élevé | Moyenne |
| 25 | reentrancy-balance | Vulnérabilités de réentrance entraînant des vérifications de solde obsolètes | Élevé | Moyenne |
| 26 | return-leave | Si un return est utilisé à la place d'un leave | Élevé | Moyenne |
| 27 | storage-array | Bogue du compilateur pour les tableaux d'entiers signés en stockage | Élevé | Moyenne |
| 28 | unchecked-transfer | Transfert de jetons non vérifié | Élevé | Moyenne |
| 29 | weak-prng | PRNG faible | Élevé | Moyenne |
| 30 | domain-separator-collision | Détecte les jetons ERC20 dont une fonction a une signature en collision avec DOMAIN_SEPARATOR() d'EIP-2612 | Moyen | Élevée |
| 31 | enum-conversion | Conversion d'enum dangereuse | Moyen | Élevée |
| 32 | erc20-interface | Interfaces ERC20 incorrectes | Moyen | Élevée |
| 33 | erc721-interface | Interfaces ERC721 incorrectes | Moyen | Élevée |
| 34 | incorrect-equality | Égalités strictes dangereuses | Moyen | Élevée |
| 35 | locked-ether | Contrats qui bloquent de l'Ether | Moyen | Élevée |
| 36 | mapping-deletion | Suppression sur un mapping contenant une structure | Moyen | Élevée |
| 37 | pyth-deprecated-functions | Détecter les fonctions Pyth obsolètes | Moyen | Élevée |
| 38 | pyth-unchecked-confidence | Détecter lorsque le niveau de confiance d'un prix Pyth n'est pas vérifié | Moyen | Élevée |
| 39 | pyth-unchecked-publishtime | Détecter lorsque le publishTime d'un prix Pyth n'est pas vérifié | Moyen | Élevée |
| 40 | shadowing-abstract | Variables d'état masquées depuis des contrats abstraits | Moyen | Élevée |
| 41 | tautological-compare | Comparer une variable à elle-même retourne toujours vrai ou faux, selon la comparaison | Moyen | Élevée |
| 42 | tautology | Tautologie ou contradiction | Moyen | Élevée |
| 43 | write-after-write | Écriture inutilisée | Moyen | Élevée |
| 44 | boolean-cst | Mauvais usage d'une constante booléenne | Moyen | Moyenne |
| 45 | chronicle-unchecked-price | Détecter lorsque le prix Chronicle n'est pas vérifié | Moyen | Moyenne |
| 46 | constant-function-asm | Fonctions constantes utilisant du code assembly | Moyen | Moyenne |
| 47 | constant-function-state | Fonctions constantes modifiant l'état | Moyen | Moyenne |
| 48 | divide-before-multiply | Ordre des opérations arithmétiques imprécises | Moyen | Moyenne |
| 49 | gelato-unprotected-randomness | Appel à _requestRandomness dans une fonction non protégée | Moyen | Moyenne |
| 50 | out-of-order-retryable | Transactions retryables désordonnées | Moyen | Moyenne |
| 51 | reentrancy-no-eth | Vulnérabilités de réentrance (sans vol d'Ether) | Moyen | Moyenne |
| 52 | reused-constructor | Constructeur de base réutilisé | Moyen | Moyenne |
| 53 | tx-origin | Usage dangereux de tx.origin | Moyen | Moyenne |
| 54 | unchecked-lowlevel | Appels bas niveau non vérifiés | Moyen | Moyenne |
| 55 | unchecked-send | Send non vérifié | Moyen | Moyenne |
| 56 | uninitialized-local | Variables locales non initialisées | Moyen | Moyenne |
| 57 | unused-return | Valeurs de retour inutilisées | Moyen | Moyenne |
| 58 | chainlink-feed-registry | Détecter l'utilisation du registre de flux Chainlink | Faible | Élevée |
| 59 | incorrect-modifier | Modificateurs pouvant retourner la valeur par défaut | Faible | Élevée |
| 60 | optimism-deprecation | Détecter lorsqu'un predeploy ou une fonction Obsolète d'Optimism est utilisé | Faible | Élevée |
| 61 | shadowing-builtin | Masquage de symbole intégré | Faible | Élevée |
| 62 | shadowing-local | Masquage de variables locales | Faible | Élevée |
| 63 | uninitialized-fptr-cst | Appels à des pointeurs de fonction non initialisés dans les constructeurs | Faible | Élevée |
| 64 | variable-scope | Variables locales utilisées avant leur déclaration | Faible | Élevée |
| 65 | void-cst | Constructeur appelé non implémenté | Faible | Élevée |
| 66 | calls-loop | Appels multiples dans une boucle | Faible | Moyenne |
| 67 | events-access | Contrôle d'accès aux événements manquants | Faible | Moyenne |
| 68 | events-maths | Événements arithmétiques manquants | Faible | Moyenne |
| 69 | incorrect-unary | Expressions unaires dangereuses | Faible | Moyenne |
| 70 | missing-zero-check | Validation d'adresse zéro manquante | Faible | Moyenne |
| 71 | reentrancy-benign | Vulnérabilités de réentrance bénignes | Faible | Moyenne |
| 72 | reentrancy-events | Vulnérabilités de réentrance entraînant des événements désordonnés | Faible | Moyenne |
| 73 | return-bomb | Un appelé bas niveau peut consommer tout le gaz de l'appelant de manière inattendue | Faible | Moyenne |
| 74 | timestamp | Usage dangereux de block.timestamp | Faible | Moyenne |
| 75 | assembly | Usage de l'assembly | Informative | Élevée |
| 76 | assert-state-change | Changement d'état dans un assert | Informative | Élevée |
| 77 | boolean-equal | Comparaison à une constante booléenne | Informative | Élevée |
| 78 | cyclomatic-complexity | Détecte les fonctions avec une complexité cyclomatique élevée (> 11) | Informative | Élevée |
| 79 | deprecated-standards | Standards Solidity obsolètes | Informative | Élevée |
| 80 | erc20-indexed | Paramètres d'événement ERC20 non indexés | Informative | Élevée |
| 81 | function-init-state | Fonction initialisant des variables d'état | Informative | Élevée |
| 82 | incorrect-using-for | Détecte l'utilisation d'une déclaration using-for lorsqu'aucune fonction d'une bibliothèque donnée ne correspond à un type donné | Informative | Élevée |
| 83 | low-level-calls | Appels bas niveau | Informative | Élevée |
| 84 | missing-inheritance | Héritage manquant | Informative | Élevée |
| 85 | naming-convention | Conformité aux conventions de nommage Solidity | Informative | Élevée |
| 86 | pragma | Si différentes directives pragma sont utilisées | Informative | Élevée |
| 87 | redundant-statements | Instructions redondantes | Informative | Élevée |
| 88 | solc-version | Version de Solidity incorrecte | Informative | Élevée |
| 89 | unimplemented-functions | Fonctions non implémentées | Informative | Élevée |
| 90 | unindexed-event-address | Événements avec paramètres d'adresse mais aucun paramètre indexé | Informative | Élevée |
| 91 | unused-state | Variables d'état inutilisées | Informative | Élevée |
| 92 | costly-loop | Opérations coûteuses dans une boucle | Informative | Moyenne |
| 93 | dead-code | Fonctions qui ne sont pas utilisées | Informative | Moyenne |
| 94 | reentrancy-unlimited-gas | Vulnérabilités de réentrance via send et transfer | Informative | Moyenne |
| 95 | too-many-digits | Conformité aux bonnes pratiques de notation numérique | Informative | Moyenne |
| 96 | cache-array-length | Détecte les boucles for qui utilisent le membre length d'un tableau de stockage dans leur condition de boucle et ne le modifient pas | Optimisation | Élevée |
| 97 | constable-states | Variables d'état qui pourraient être déclarées constantes | Optimisation | Élevée |
| 98 | external-function | Fonction publique qui pourrait être déclarée externe | Optimisation | Élevée |
| 99 | immutable-states | Variables d'état qui pourraient être déclarées immutables | Optimisation | Élevée |
| 100 | var-read-using-this | Le contrat lit sa propre variable en utilisant this | Optimisation | Élevée |
| S'appuyer sur SlithIR pour construire un graphe de dépendance de stockage |
| Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna |
| S&P 22 |
| Sailfish |
| SolType: Refinement Types for Arithmetic Overflow in Solidity | Utiliser Slither comme frontal pour construire un système de types raffinés | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
| Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection | Utiliser Slither pour extraire les caractéristiques des tokens (mintable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
| MANDO: Multi-Level Heterogeneous Graph Embeddings for Fine-Grained Detection of Smart Contract Vulnerabilities | Utiliser Slither pour extraire le CFG et le graphe d'appel | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan and Lingxiao Jiang | IEEE 9th International Conference on Data Science and Advanced Analytics (DSAA, 2022) | ge-sc |
| Automated Auditing of Price Gouging TOD Vulnerabilities in Smart Contracts | Utiliser Slither pour extraire le CFG et les dépendances de données | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Repair |
| Modeling and Enforcing Access Control Policies for Smart Contracts | Étendre les dépendances de données de Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | IEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022 | SolidityAccessControlEnforcement |
| Smart Contract Vulnerability Detection Based on Deep Learning and Multimodal Decision Fusion | Utiliser Slither pour extraire le CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan Hu | Sensors 2023, 23, 7246 | - |
| Semantic-enriched Code Knowledge Graph to Reveal Unknowns in Smart Contract Code Reuse | Utiliser Slither pour extraire les caractéristiques du code (CFG, fonction, types de paramètres, ..) | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | ACM Transactions on Software Engineering and Methodology, 2023 | - |
| Smart Contract Parallel Execution with Fine-Grained State Accesses | Utiliser Slither pour construire des graphes d'accès aux états | Xiaodong Qi, Jiao Jiao, Yi Li | International Conference on Distributed Computing Systems (ICDCS), 2023 | - |
| Bad Apples: Understanding the Centralized Security Risks in Decentralized Ecosystems | Implémenter une analyse interne au-dessus de Slither | Kailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing Guo | ACM Web Conference April 2023 | - |
| Identifying Vulnerabilities in Smart Contracts using Interval Analysis | Créer 4 détecteurs au-dessus de Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | FROM 2023 | - |
| Storage State Analysis and Extraction of Ethereum Blockchain Smart Contracts (no PDF in open access) | S'appuyer sur le CFG et l'AST de Slither | Maha Ayub , Tania Saleem , Muhammad Janjua , Talha Ahmad | TOSEM 2023 | SmartMuv |