Treten Sie dem Empire Hacking Slack bei
- Diskussionen und Support
Slither ist ein in Python3 geschriebenes statisches Analyse-Framework von Solidity & Vyper. Es führt eine Reihe von Schwachstellendetektoren aus, druckt visuelle Informationen zu Vertragsdetails und bietet eine API zum einfachen Schreiben benutzerdefinierter Analysen. Slither ermöglicht es Entwicklern, Schwachstellen zu finden, ihr Codeverständnis zu verbessern und schnell Prototypen für benutzerdefinierte Analysen zu erstellen.
Führen Sie Slither auf einer Hardhat-/Foundry-/Dapp-/Brownie-Anwendung aus:
slither .
Dies ist die bevorzugte Option, wenn Ihr Projekt Abhängigkeiten aufweist, da Slither zum Kompilieren des Quellcodes auf das zugrunde liegende Kompilierungsframework angewiesen ist.
Sie können Slither jedoch für eine einzelne Datei ausführen, die keine Abhängigkeiten importiert:
slither tests/uninitialized.sol
Notiz
Slither erfordert Python 3.8+. Wenn Sie nicht eines der unterstützten Kompilierungsframeworks verwenden möchten, benötigen Sie solc, den Solidity-Compiler; Wir empfehlen die Verwendung von Solc-Select, um bequem zwischen Solc-Versionen zu wechseln.
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
Wir empfehlen die Verwendung einer virtuellen Python-Umgebung, wie in den Installationsanweisungen für Entwickler beschrieben, wenn Sie Slither lieber über Git installieren möchten.
Verwenden Sie das Docker-Image eth-security-toolbox
. Es enthält alle unsere Sicherheitstools und alle wichtigen Versionen von Solidity in einem einzigen Image. /home/share
wird im Container nach /share
gemountet.
docker pull trailofbits/eth-security-toolbox
So geben Sie ein Verzeichnis im Container frei:
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
durch ein echtes Tag). - 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/
(ersetzen Sie ORG
, REPO
, COMMIT
) Num | Detektor | Was es erkennt | Auswirkungen | Vertrauen |
---|---|---|---|---|
1 | abiencoderv2-array | Speicher abiencoderv2-Array | Hoch | Hoch |
2 | arbitrary-send-erc20 | transferFrom verwendet ein beliebiges from | Hoch | Hoch |
3 | array-by-reference | Ändern des Speicherarrays nach Wert | Hoch | Hoch |
4 | encode-packed-collision | ABI encodePacked Collision | Hoch | Hoch |
5 | incorrect-shift | Die Reihenfolge der Parameter in einer Schichtanweisung ist falsch. | Hoch | Hoch |
6 | multiple-constructors | Mehrere Konstruktorschemata | Hoch | Hoch |
7 | name-reused | Der Name des Vertrags wurde wiederverwendet | Hoch | Hoch |
8 | protected-vars | Ungeschützte Variablen erkannt | Hoch | Hoch |
9 | public-mappings-nested | Öffentliche Zuordnungen mit verschachtelten Variablen | Hoch | Hoch |
10 | rtlo | Es wird das Steuerzeichen „Right-To-Left-Override“ verwendet | Hoch | Hoch |
11 | shadowing-state | Zustandsvariablen-Shadowing | Hoch | Hoch |
12 | suicidal | Funktionen, die es jedem ermöglichen, den Vertrag zu zerstören | Hoch | Hoch |
13 | uninitialized-state | Nicht initialisierte Zustandsvariablen | Hoch | Hoch |
14 | uninitialized-storage | Nicht initialisierte Speichervariablen | Hoch | Hoch |
15 | unprotected-upgrade | Ungeschützter aktualisierbarer Vertrag | Hoch | Hoch |
16 | codex | Verwenden Sie Codex, um Schwachstellen zu finden. | Hoch | Niedrig |
17 | arbitrary-send-erc20-permit | transferFrom verwendet ein beliebiges Formular mit Genehmigung | Hoch | Medium |
18 | arbitrary-send-eth | Funktionen, die Ether an beliebige Ziele senden | Hoch | Medium |
19 | controlled-array-length | Beeinträchtigte Array-Längenzuweisung | Hoch | Medium |
20 | controlled-delegatecall | Kontrolliertes Delegatecall-Ziel | Hoch | Medium |
21 | delegatecall-loop | Zahlbare Funktionen mit delegatecall innerhalb einer Schleife | Hoch | Medium |
22 | incorrect-exp | Falsche Potenzierung | Hoch | Medium |
23 | incorrect-return | Wenn eine return im Montagemodus fälschlicherweise verwendet wird. | Hoch | Medium |
24 | msg-value-loop | msg.value innerhalb einer Schleife | Hoch | Medium |
25 | reentrancy-eth | Wiedereintrittsschwachstellen (Diebstahl von Ethern) | Hoch | Medium |
26 | return-leave | Wenn ein return anstelle eines leave verwendet wird. | Hoch | Medium |
27 | storage-array | Fehler beim Compiler für vorzeichenbehaftete Speicher-Integer-Arrays | Hoch | Medium |
28 | unchecked-transfer | Ungeprüfter Tokentransfer | Hoch | Medium |
29 | weak-prng | Schwaches PRNG | Hoch | Medium |
30 | domain-separator-collision | Erkennt ERC20-Tokens, die eine Funktion haben, deren Signatur mit EIP-2612s DOMAIN_SEPARATOR() kollidiert. | Medium | Hoch |
31 | enum-conversion | Erkennen Sie gefährliche Enum-Konvertierungen | Medium | Hoch |
32 | erc20-interface | Falsche ERC20-Schnittstellen | Medium | Hoch |
33 | erc721-interface | Falsche ERC721-Schnittstellen | Medium | Hoch |
34 | incorrect-equality | Gefährliche strikte Gleichheit | Medium | Hoch |
35 | locked-ether | Verträge, die Ether sperren | Medium | Hoch |
36 | mapping-deletion | Löschung bei Mapping, das eine Struktur enthält | Medium | Hoch |
37 | shadowing-abstract | Zustandsvariablen, die aus abstrakten Verträgen stammen | Medium | Hoch |
38 | tautological-compare | Der Vergleich einer Variablen mit sich selbst gibt je nach Vergleich immer „true“ oder „false“ zurück | Medium | Hoch |
39 | tautology | Tautologie oder Widerspruch | Medium | Hoch |
40 | write-after-write | Unbenutztes Schreiben | Medium | Hoch |
41 | boolean-cst | Missbrauch der Booleschen Konstante | Medium | Medium |
42 | constant-function-asm | Konstante Funktionen mit Assembler-Code | Medium | Medium |
43 | constant-function-state | Konstante Funktionen, die den Zustand ändern | Medium | Medium |
44 | divide-before-multiply | Ungenaue Reihenfolge der arithmetischen Operationen | Medium | Medium |
45 | out-of-order-retryable | Wiederholbare Transaktionen außerhalb der Reihenfolge | Medium | Medium |
46 | reentrancy-no-eth | Wiedereintrittsschwachstellen (kein Diebstahl von Ethern) | Medium | Medium |
47 | reused-constructor | Wiederverwendeter Basiskonstruktor | Medium | Medium |
48 | tx-origin | Gefährliche Verwendung von tx.origin | Medium | Medium |
49 | unchecked-lowlevel | Ungeprüfte Low-Level-Anrufe | Medium | Medium |
50 | unchecked-send | Ungeprüfter Versand | Medium | Medium |
51 | uninitialized-local | Nicht initialisierte lokale Variablen | Medium | Medium |
52 | unused-return | Unbenutzte Rückgabewerte | Medium | Medium |
53 | incorrect-modifier | Modifikatoren, die den Standardwert zurückgeben können | Niedrig | Hoch |
54 | shadowing-builtin | Integrierte Symbolschattierung | Niedrig | Hoch |
55 | shadowing-local | Schatten lokaler Variablen | Niedrig | Hoch |
56 | uninitialized-fptr-cst | Nicht initialisierte Funktionszeigeraufrufe in Konstruktoren | Niedrig | Hoch |
57 | variable-scope | Lokale Variablen, die vor ihrer Deklaration verwendet werden | Niedrig | Hoch |
58 | void-cst | Der aufgerufene Konstruktor ist nicht implementiert | Niedrig | Hoch |
59 | calls-loop | Mehrere Anrufe in einer Schleife | Niedrig | Medium |
60 | events-access | Zugriffskontrolle für fehlende Ereignisse | Niedrig | Medium |
61 | events-maths | Arithmetik fehlender Ereignisse | Niedrig | Medium |
62 | incorrect-unary | Gefährliche unäre Ausdrücke | Niedrig | Medium |
63 | missing-zero-check | Fehlende Null-Adressvalidierung | Niedrig | Medium |
64 | reentrancy-benign | Unbedenkliche Wiedereintrittsschwachstellen | Niedrig | Medium |
65 | reentrancy-events | Wiedereintrittsschwachstellen, die zu Ereignissen außerhalb der Reihenfolge führen | Niedrig | Medium |
66 | return-bomb | Ein Angerufener mit niedrigem Level kann unerwartet das Benzin aller Anrufer verbrauchen. | Niedrig | Medium |
67 | timestamp | Gefährliche Verwendung von block.timestamp | Niedrig | Medium |
68 | assembly | Assembly-Nutzung | Informativ | Hoch |
69 | assert-state-change | Zustandsänderung geltend machen | Informativ | Hoch |
70 | boolean-equal | Vergleich mit boolescher Konstante | Informativ | Hoch |
71 | cyclomatic-complexity | Erkennt Funktionen mit hoher (> 11) zyklomatischer Komplexität | Informativ | Hoch |
72 | deprecated-standards | Veraltete Soliditätsstandards | Informativ | Hoch |
73 | erc20-indexed | Nicht indizierte ERC20-Ereignisparameter | Informativ | Hoch |
74 | function-init-state | Funktion zum Initialisieren von Zustandsvariablen | Informativ | Hoch |
75 | incorrect-using-for | Erkennt die Verwendung von using-for-Anweisungen, wenn keine Funktion aus einer bestimmten Bibliothek mit einem bestimmten Typ übereinstimmt | Informativ | Hoch |
76 | low-level-calls | Anrufe auf niedrigem Niveau | Informativ | Hoch |
77 | missing-inheritance | Fehlende Vererbung | Informativ | Hoch |
78 | naming-convention | Konformität mit den Namenskonventionen von Solidity | Informativ | Hoch |
79 | pragma | Wenn unterschiedliche Pragma-Direktiven verwendet werden | Informativ | Hoch |
80 | redundant-statements | Redundante Aussagen | Informativ | Hoch |
81 | solc-version | Falsche Solidity-Version | Informativ | Hoch |
82 | unimplemented-functions | Nicht implementierte Funktionen | Informativ | Hoch |
83 | unused-import | Erkennt ungenutzte Importe | Informativ | Hoch |
84 | unused-state | Unbenutzte Zustandsvariablen | Informativ | Hoch |
85 | costly-loop | Kostspielige Vorgänge in einer Schleife | Informativ | Medium |
86 | dead-code | Funktionen, die nicht verwendet werden | Informativ | Medium |
87 | reentrancy-unlimited-gas | Wiedereintrittsschwachstellen durch Senden und Übertragen | Informativ | Medium |
88 | too-many-digits | Konformität mit Best Practices für die numerische Notation | Informativ | Medium |
89 | cache-array-length | Erkennt for Schleifen, die in ihrer Schleifenbedingung das length eines Speicherarrays verwenden und es nicht ändern. | Optimierung | Hoch |
90 | constable-states | Zustandsvariablen, die als konstant deklariert werden könnten | Optimierung | Hoch |
91 | external-function | Öffentliche Funktion, die als extern deklariert werden könnte | Optimierung | Hoch |
92 | immutable-states | Zustandsvariablen, die als unveränderlich deklariert werden könnten | Optimierung | Hoch |
93 | var-read-using-this | Der Vertrag liest this seine eigene Variable | Optimierung | Hoch |
Weitere Informationen finden Sie unter
human-summary
: Drucken Sie eine für Menschen lesbare Zusammenfassung der Verträgeinheritance-graph
: Exportieren Sie das Vererbungsdiagramm jedes Vertrags in eine Dot-Dateicontract-summary
: Drucken Sie eine Zusammenfassung der Verträgeloc
: Zählt die Gesamtzahl der Codezeilen (LOC), Quellcodezeilen (SLOC) und Kommentarzeilen des Codes (CLOC), die in Quelldateien (SRC), Abhängigkeiten (DEP) und Testdateien (TEST) gefunden werden.call-graph
: Exportieren Sie den Call-Graph der Verträge in eine Dot-Dateicfg
: Exportieren Sie die CFG jeder Funktionfunction-summary
: Drucken Sie eine Zusammenfassung der Funktionenvars-and-auth
: Drucken Sie die geschriebenen Statusvariablen und die Autorisierung der Funktionennot-pausable
: Druckfunktionen, die den Modifikator whenNotPaused
nicht verwenden. Um einen Drucker auszuführen, verwenden Sie --print
und eine durch Kommas getrennte Liste von Druckern.
Die vollständigen Listen finden Sie in der Druckerdokumentation.
slither-check-upgradeability
: Überprüfen Sie die auf delegatecall
basierende Aktualisierbarkeitslither-prop
: Automatischer Komponententest und Eigenschaftsgenerierungslither-flat
: Reduziert eine Codebasisslither-check-erc
: Überprüfen Sie die Konformität des ERCslither-format
: Automatische Patch-Generierungslither-read-storage
: Speicherwerte aus Verträgen lesenslither-interface
: Generieren Sie eine Schnittstelle für einen VertragWeitere Tools finden Sie in der Tool-Dokumentation.
Kontaktieren Sie uns, um Hilfe beim Erstellen benutzerdefinierter Tools zu erhalten.
Eine Dokumentation zu Slithers Interna finden Sie hier.
Schauen Sie gerne in unserem Slack-Kanal (#ethereum) vorbei, um Hilfe bei der Nutzung oder Erweiterung von Slither zu erhalten.
Die Druckerdokumentation beschreibt die Informationen, die Slither für jeden Vertrag visualisieren kann.
In der Detector-Dokumentation wird beschrieben, wie eine neue Schwachstellenanalyse geschrieben wird.
Die API-Dokumentation beschreibt die Methoden und Objekte, die für benutzerdefinierte Analysen verfügbar sind.
Die SlithIR-Dokumentation beschreibt die SlithIR-Zwischendarstellung.
Wie schließe ich Mocks oder Tests aus?
Wie behebe ich „unbekannte Dateien“ oder Kompilierungsprobleme?
slither contract.sol
fehl. Verwenden Sie stattdessen slither .
im übergeordneten Verzeichnis von contracts/
(Sie sollten contracts/
sehen, wenn Sie ls
ausführen). Wenn Sie einen Ordner node_modules/
haben, muss dieser sich im selben Verzeichnis wie contracts/
befinden. Um zu überprüfen, ob dieses Problem mit Slither zusammenhängt, führen Sie den Kompilierungsbefehl für das Framework aus, das Sie verwenden, z. B. npx hardhat compile
. Das muss erfolgreich funktionieren; Andernfalls kann die Kompilierungs-Engine von Slither, Crytic-Compile, den AST nicht generieren. Slither wird unter der AGPLv3-Lizenz lizenziert und vertrieben. Kontaktieren Sie uns, wenn Sie eine Ausnahme von den Bedingungen wünschen.
Titel | Verwendung | Autoren | Veranstaltungsort | Code |
---|---|---|---|---|
ReJection: Eine AST-basierte Methode zur Wiedereintrittsschwachstellenerkennung | AST-basierte Analyse basierend auf Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
MPro: Kombination statischer und symbolischer Analyse zum skalierbaren Testen von Smart Contracts | Nutzen Sie die Datenabhängigkeit durch Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
ETHPLOIT: Vom Fuzzing zur effizienten Exploit-Generierung gegen Smart Contracts | Nutzen Sie die Datenabhängigkeit durch Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
Verifizierung von Ethereum Smart Contracts: Ein Ansatz zur Modellprüfung | Symbolische Ausführung basierend auf Slithers CFG | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
Intelligente Vertragsreparatur | Verlassen Sie sich auf die Schwachstellendetektoren von Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCReparatur |
Entmystifizierung von Schleifen in Smart Contracts | Nutzen Sie die Datenabhängigkeit durch Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
Spurenbasierte dynamische Gasschätzung von Schleifen in Smart Contracts | Verwenden Sie Slithers CFG, um Schleifen zu erkennen | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
SAILFISH: Überprüfung von Fehlern in Bezug auf die Zustandsinkonsistenz von Smart Contracts in Sekundenschnelle | Verlassen Sie sich auf SlithIR, um ein Speicherabhängigkeitsdiagramm zu erstellen | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel und Giovanni Vigna | S&P 22 | Segelfisch |
SolType: Verfeinerungstypen für arithmetischen Überlauf in Solidity | Verwenden Sie Slither als Frontend, um ein Verfeinerungstypsystem zu erstellen | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
Machen Sie mir nichts vor: Nutzung maschineller Lerntechniken zur automatisierten Betrugserkennung | Verwenden Sie Slither, um die Funktionen von Token zu extrahieren (prägbar, pausierbar usw.) | Mazorra, Bruno, Victor Adan und Vanesa Daza | Mathematik 10.6 (2022) | - |
MANDO: Mehrstufige heterogene Diagrammeinbettungen zur feinkörnigen Erkennung von Schwachstellen bei Smart Contracts | Verwenden Sie Slither, um das CFG zu extrahieren und das Diagramm aufzurufen | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan und Lingxiao Jiang | IEEE 9. Internationale Konferenz für Datenwissenschaft und fortgeschrittene Analytik (DSAA, 2022) | ge-sc |
Automatisierte Prüfung von Preistreiber-TOD-Schwachstellen in Smart Contracts | Verwenden Sie Slither, um die CFG- und Datenabhängigkeiten zu extrahieren | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris und Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Reparatur |
Modellierung und Durchsetzung von Zugriffskontrollrichtlinien für Smart Contracts | Erweitern Sie die Datenabhängigkeiten von Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reußner | Internationale IEEE-Konferenz zu dezentralen Anwendungen und Infrastrukturen (DAPPS), 2022 | SolidityAccessControlEnforcement |
Erkennung intelligenter Vertragsschwachstellen basierend auf Deep Learning und multimodaler Entscheidungsfusion | Verwenden Sie Slither, um das CFG zu extrahieren | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng und Xuan Hu | Sensoren 2023, 23, 7246 | - |
Semantisch angereicherter Code-Wissensgraph zur Aufdeckung von Unbekannten bei der Wiederverwendung intelligenter Vertragscodes | Verwenden Sie Slither, um die Codefunktionen (CFG, Funktion, Parametertypen usw.) zu extrahieren. | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | ACM-Transaktionen zu Software-Engineering und -Methodik, 2023 | - |
Intelligente Vertragsparallele Ausführung mit feinkörnigen Zustandszugriffen | Verwenden Sie Slither, um Zustandszugriffsdiagramme zu erstellen | Xiaodong Qi, Jiao Jiao, Yi Li | Internationale Konferenz über verteilte Computersysteme (ICDCS), 2023 | - |
Schlechte Äpfel: Die zentralisierten Sicherheitsrisiken in dezentralen Ökosystemen verstehen | Implementieren Sie eine interne Analyse zusätzlich zu Slither | Kailun Yan, Jilian Zhang, Xiangyu Liu, Wenrui Diao, Shanqing Guo | ACM-Webkonferenz April 2023 | - |
Identifizieren von Schwachstellen in Smart Contracts mithilfe der Intervallanalyse | Erstellen Sie 4 Detektoren auf Slither | Stefan-Claudiu Susan, Andrei Arusoaie | AB 2023 | - |
Speicherzustandsanalyse und Extraktion von Ethereum Blockchain Smart Contracts (kein PDF im Open Access) | Verlassen Sie sich auf CFG und AST von Slither | Maha Ayub, Tania Saleem, Muhammad Janjua, Talha Ahmad | TOSEM 2023 | SmartMuv |
Wenn Sie Slither für eine wissenschaftliche Arbeit verwenden, sollten Sie sich für den Crytic-Forschungspreis in Höhe von 10.000 US-Dollar bewerben.