Bergabunglah dengan Empire Hacking Slack
- Diskusi dan Dukungan
Slither adalah kerangka analisis statis Solidity & Vyper yang ditulis dengan Python3. Ini menjalankan serangkaian pendeteksi kerentanan, mencetak informasi visual tentang detail kontrak, dan menyediakan API untuk menulis analisis khusus dengan mudah. Slither memungkinkan pengembang menemukan kerentanan, meningkatkan pemahaman kode mereka, dan dengan cepat membuat prototipe analisis khusus.
Jalankan Slither pada aplikasi Hardhat/Foundry/Dapp/Brownie:
slither .
Ini adalah pilihan yang lebih disukai jika proyek Anda memiliki ketergantungan karena Slither bergantung pada kerangka kompilasi yang mendasarinya untuk mengkompilasi kode sumber.
Namun, Anda dapat menjalankan Slither pada satu file yang tidak mengimpor dependensi:
slither tests/uninitialized.sol
Catatan
Meluncur membutuhkan Python 3.8+. Jika Anda tidak ingin menggunakan salah satu kerangka kompilasi yang didukung, Anda memerlukan solc, compiler Solidity; kami merekomendasikan penggunaan solc-select untuk beralih antar versi solc dengan mudah.
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
Kami merekomendasikan penggunaan lingkungan virtual Python, sebagaimana dijelaskan secara rinci dalam Petunjuk Instalasi Pengembang, jika Anda lebih suka menginstal Slither melalui git.
Gunakan gambar buruh pelabuhan eth-security-toolbox
. Ini mencakup semua alat keamanan kami dan setiap versi utama Solidity dalam satu gambar. /home/share
akan dipasang ke /share
di dalam container.
docker pull trailofbits/eth-security-toolbox
Untuk berbagi direktori dalam wadah:
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
dengan tag asli) - 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/
(ganti ORG
, REPO
, COMMIT
) Nomor | Detektor | Apa yang Dideteksinya | Dampak | Kepercayaan diri |
---|---|---|---|---|
1 | abiencoderv2-array | Array penyimpanan abiencoderv2 | Tinggi | Tinggi |
2 | arbitrary-send-erc20 | transferFrom menggunakan sewenang-wenang from | Tinggi | Tinggi |
3 | array-by-reference | Memodifikasi array penyimpanan berdasarkan nilai | Tinggi | Tinggi |
4 | encode-packed-collision | Tabrakan Terkemas yang dikodekan ABI | Tinggi | Tinggi |
5 | incorrect-shift | Urutan parameter dalam instruksi shift salah. | Tinggi | Tinggi |
6 | multiple-constructors | Beberapa skema konstruktor | Tinggi | Tinggi |
7 | name-reused | Nama kontrak digunakan kembali | Tinggi | Tinggi |
8 | protected-vars | Variabel yang tidak dilindungi terdeteksi | Tinggi | Tinggi |
9 | public-mappings-nested | Pemetaan publik dengan variabel bersarang | Tinggi | Tinggi |
10 | rtlo | Karakter kontrol Right-To-Left-Override digunakan | Tinggi | Tinggi |
11 | shadowing-state | Variabel status membayangi | Tinggi | Tinggi |
12 | suicidal | Fungsi yang memungkinkan siapa pun untuk menghancurkan kontrak | Tinggi | Tinggi |
13 | uninitialized-state | Variabel status yang tidak diinisialisasi | Tinggi | Tinggi |
14 | uninitialized-storage | Variabel penyimpanan yang tidak diinisialisasi | Tinggi | Tinggi |
15 | unprotected-upgrade | Kontrak yang dapat diupgrade tanpa perlindungan | Tinggi | Tinggi |
16 | codex | Gunakan Codex untuk menemukan kerentanan. | Tinggi | Rendah |
17 | arbitrary-send-erc20-permit | transferFrom menggunakan sewenang-wenang dari dengan izin | Tinggi | Sedang |
18 | arbitrary-send-eth | Fungsi yang mengirim Ether ke tujuan sembarang | Tinggi | Sedang |
19 | controlled-array-length | Penetapan panjang array tercemar | Tinggi | Sedang |
20 | controlled-delegatecall | Tujuan panggilan delegasi yang dikontrol | Tinggi | Sedang |
21 | delegatecall-loop | Fungsi hutang menggunakan delegatecall di dalam satu lingkaran | Tinggi | Sedang |
22 | incorrect-exp | Eksponensial salah | Tinggi | Sedang |
23 | incorrect-return | Jika return salah digunakan dalam mode perakitan. | Tinggi | Sedang |
24 | msg-value-loop | pesan.nilai di dalam satu lingkaran | Tinggi | Sedang |
25 | reentrancy-eth | Kerentanan masuk kembali (pencurian eter) | Tinggi | Sedang |
26 | return-leave | Jika return digunakan sebagai ganti leave . | Tinggi | Sedang |
27 | storage-array | Bug kompiler array bilangan bulat penyimpanan yang ditandatangani | Tinggi | Sedang |
28 | unchecked-transfer | Transfer token tidak dicentang | Tinggi | Sedang |
29 | weak-prng | PRNG lemah | Tinggi | Sedang |
30 | domain-separator-collision | Mendeteksi token ERC20 yang memiliki fungsi yang tanda tangannya bertabrakan dengan DOMAIN_SEPARATOR() EIP-2612 | Sedang | Tinggi |
31 | enum-conversion | Deteksi konversi enum yang berbahaya | Sedang | Tinggi |
32 | erc20-interface | Antarmuka ERC20 salah | Sedang | Tinggi |
33 | erc721-interface | Antarmuka ERC721 salah | Sedang | Tinggi |
34 | incorrect-equality | Persamaan ketat yang berbahaya | Sedang | Tinggi |
35 | locked-ether | Kontrak yang mengunci eter | Sedang | Tinggi |
36 | mapping-deletion | Penghapusan pada pemetaan yang mengandung struktur | Sedang | Tinggi |
37 | shadowing-abstract | Nyatakan variabel yang membayangi kontrak abstrak | Sedang | Tinggi |
38 | tautological-compare | Membandingkan variabel dengan dirinya sendiri selalu menghasilkan nilai benar atau salah, bergantung pada perbandingan | Sedang | Tinggi |
39 | tautology | Tautologi atau kontradiksi | Sedang | Tinggi |
40 | write-after-write | Tulisan yang tidak terpakai | Sedang | Tinggi |
41 | boolean-cst | Penyalahgunaan konstanta Boolean | Sedang | Sedang |
42 | constant-function-asm | Fungsi konstan menggunakan kode perakitan | Sedang | Sedang |
43 | constant-function-state | Fungsi konstan mengubah keadaan | Sedang | Sedang |
44 | divide-before-multiply | Urutan operasi aritmatika yang tidak tepat | Sedang | Sedang |
45 | out-of-order-retryable | Transaksi yang dapat dicoba ulang di luar pesanan | Sedang | Sedang |
46 | reentrancy-no-eth | Kerentanan masuk kembali (tidak ada pencurian eter) | Sedang | Sedang |
47 | reused-constructor | Konstruktor dasar yang digunakan kembali | Sedang | Sedang |
48 | tx-origin | Penggunaan tx.origin yang berbahaya | Sedang | Sedang |
49 | unchecked-lowlevel | Panggilan tingkat rendah tidak dicentang | Sedang | Sedang |
50 | unchecked-send | Pengiriman tidak dicentang | Sedang | Sedang |
51 | uninitialized-local | Variabel lokal yang tidak diinisialisasi | Sedang | Sedang |
52 | unused-return | Nilai pengembalian yang tidak digunakan | Sedang | Sedang |
53 | incorrect-modifier | Pengubah yang dapat mengembalikan nilai default | Rendah | Tinggi |
54 | shadowing-builtin | Bayangan simbol bawaan | Rendah | Tinggi |
55 | shadowing-local | Variabel lokal membayangi | Rendah | Tinggi |
56 | uninitialized-fptr-cst | Panggilan penunjuk fungsi yang tidak diinisialisasi dalam konstruktor | Rendah | Tinggi |
57 | variable-scope | Variabel lokal digunakan sebelum deklarasinya | Rendah | Tinggi |
58 | void-cst | Konstruktor dipanggil tidak diimplementasikan | Rendah | Tinggi |
59 | calls-loop | Beberapa panggilan dalam satu lingkaran | Rendah | Sedang |
60 | events-access | Kontrol Akses Acara Hilang | Rendah | Sedang |
61 | events-maths | Aritmatika Acara yang Hilang | Rendah | Sedang |
62 | incorrect-unary | Ekspresi unary yang berbahaya | Rendah | Sedang |
63 | missing-zero-check | Validasi Alamat Nol Hilang | Rendah | Sedang |
64 | reentrancy-benign | Kerentanan masuk kembali yang jinak | Rendah | Sedang |
65 | reentrancy-events | Kerentanan masuk kembali yang menyebabkan Peristiwa rusak | Rendah | Sedang |
66 | return-bomb | Callee tingkat rendah dapat mengkonsumsi semua gas penelepon secara tidak terduga. | Rendah | Sedang |
67 | timestamp | Penggunaan block.timestamp yang berbahaya | Rendah | Sedang |
68 | assembly | Penggunaan perakitan | Informasional | Tinggi |
69 | assert-state-change | Tegaskan perubahan status | Informasional | Tinggi |
70 | boolean-equal | Perbandingan dengan konstanta boolean | Informasional | Tinggi |
71 | cyclomatic-complexity | Mendeteksi fungsi dengan kompleksitas siklomatik tinggi (> 11). | Informasional | Tinggi |
72 | deprecated-standards | Standar Soliditas yang Tidak Digunakan Lagi | Informasional | Tinggi |
73 | erc20-indexed | Parameter peristiwa ERC20 yang tidak diindeks | Informasional | Tinggi |
74 | function-init-state | Fungsi menginisialisasi variabel keadaan | Informasional | Tinggi |
75 | incorrect-using-for | Mendeteksi penggunaan pernyataan penggunaan-untuk ketika tidak ada fungsi dari perpustakaan tertentu yang cocok dengan tipe tertentu | Informasional | Tinggi |
76 | low-level-calls | Panggilan tingkat rendah | Informasional | Tinggi |
77 | missing-inheritance | Warisan yang hilang | Informasional | Tinggi |
78 | naming-convention | Kesesuaian dengan konvensi penamaan Soliditas | Informasional | Tinggi |
79 | pragma | Jika arahan pragma yang berbeda digunakan | Informasional | Tinggi |
80 | redundant-statements | Pernyataan yang berlebihan | Informasional | Tinggi |
81 | solc-version | Versi Soliditas salah | Informasional | Tinggi |
82 | unimplemented-functions | Fungsi yang tidak diimplementasikan | Informasional | Tinggi |
83 | unused-import | Mendeteksi impor yang tidak digunakan | Informasional | Tinggi |
84 | unused-state | Variabel status yang tidak digunakan | Informasional | Tinggi |
85 | costly-loop | Operasi mahal dalam satu putaran | Informasional | Sedang |
86 | dead-code | Fungsi yang tidak digunakan | Informasional | Sedang |
87 | reentrancy-unlimited-gas | Kerentanan masuk kembali melalui pengiriman dan transfer | Informasional | Sedang |
88 | too-many-digits | Kesesuaian dengan praktik terbaik notasi numerik | Informasional | Sedang |
89 | cache-array-length | for loop yang menggunakan anggota length beberapa array penyimpanan dalam kondisi loopnya dan tidak mengubahnya. | Optimasi | Tinggi |
90 | constable-states | Menyatakan variabel yang dapat dinyatakan konstan | Optimasi | Tinggi |
91 | external-function | Fungsi publik yang dapat dinyatakan eksternal | Optimasi | Tinggi |
92 | immutable-states | Nyatakan variabel yang dapat dinyatakan tidak dapat diubah | Optimasi | Tinggi |
93 | var-read-using-this | Kontrak membaca variabelnya sendiri menggunakan this | Optimasi | Tinggi |
Untuk informasi lebih lanjut, lihat
human-summary
: Cetak ringkasan kontrak yang dapat dibaca manusiainheritance-graph
: Ekspor grafik warisan setiap kontrak ke file titikcontract-summary
: Cetak ringkasan kontrakloc
: Hitung jumlah total baris kode (LOC), baris kode sumber (SLOC), dan baris kode komentar (CLOC) yang ditemukan dalam file sumber (SRC), dependensi (DEP), dan file pengujian (TEST).call-graph
: Ekspor grafik panggilan kontrak ke file titikcfg
: Ekspor CFG setiap fungsifunction-summary
: Cetak ringkasan fungsivars-and-auth
: Cetak variabel status tertulis dan otorisasi fungsinyanot-pausable
: Fungsi pencetakan yang tidak menggunakan pengubah whenNotPaused
. Untuk menjalankan printer, gunakan --print
dan daftar printer yang dipisahkan koma.
Lihat dokumentasi Printer untuk daftar lengkap.
slither-check-upgradeability
: Tinjau kemampuan upgrade berbasis delegatecall
slither-prop
: Pengujian unit otomatis dan pembuatan propertislither-flat
: Meratakan basis kodeslither-check-erc
: Periksa kesesuaian ERCslither-format
: Pembuatan patch otomatisslither-read-storage
: Membaca nilai penyimpanan dari kontrakslither-interface
: Menghasilkan antarmuka untuk kontrakLihat dokumentasi Alat untuk alat tambahan.
Hubungi kami untuk mendapatkan bantuan dalam membuat alat khusus.
Dokumentasi internal Slither tersedia di sini.
Silakan mampir ke saluran Slack kami (#ethereum) untuk mendapatkan bantuan dalam menggunakan atau memperluas Slither.
Dokumentasi Printer menjelaskan informasi yang mampu divisualisasikan Slither untuk setiap kontrak.
Dokumentasi Detektor menjelaskan cara menulis analisis kerentanan baru.
Dokumentasi API menjelaskan metode dan objek yang tersedia untuk analisis khusus.
Dokumentasi SlithIR menjelaskan representasi perantara SlithIR.
Bagaimana cara mengecualikan tiruan atau tes?
Bagaimana cara memperbaiki masalah "file tidak dikenal" atau kompilasi?
slither contract.sol
akan gagal. Sebagai gantinya, gunakan slither .
di direktori induk contracts/
(Anda akan melihat contracts/
saat menjalankan ls
). Jika Anda memiliki folder node_modules/
, folder tersebut harus berada di direktori yang sama dengan contracts/
. Untuk memverifikasi bahwa masalah ini terkait dengan slither, jalankan perintah kompilasi untuk framework yang Anda gunakan misalnya npx hardhat compile
. Itu harus berhasil; jika tidak, mesin kompilasi slither, kompilasi crytic, tidak dapat menghasilkan AST. Slither dilisensikan dan didistribusikan di bawah lisensi AGPLv3. Hubungi kami jika Anda mencari pengecualian terhadap persyaratan ini.
Judul | Penggunaan | Penulis | Lokasi | Kode |
---|---|---|---|---|
Penolakan: Metode Deteksi Kerentanan Masuk Kembali Berbasis AST | Analisis berbasis AST dibangun di atas Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
MPro: Menggabungkan Analisis Statis dan Simbolik untuk Pengujian Kontrak Cerdas yang Dapat Diskalakan | Manfaatkan ketergantungan data melalui Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
ETHPLOIT: Dari Fuzzing hingga Generasi Eksploitasi yang Efisien terhadap Kontrak Cerdas | Manfaatkan ketergantungan data melalui Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | LEBIH WAJAR 20 | - |
Verifikasi Kontrak Cerdas Ethereum: Pendekatan Pemeriksaan Model | Eksekusi simbolis dibangun di atas CFG Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
Perbaikan Kontrak Cerdas | Andalkan pendeteksi kerentanan Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | Perbaikan SC |
Mengungkap Perulangan dalam Kontrak Cerdas | Manfaatkan ketergantungan data melalui Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
Estimasi Loop Gas Dinamis Berbasis Jejak dalam Kontrak Cerdas | Gunakan CFG Slither untuk mendeteksi loop | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Buka J. Komputasi. sosial. 1 (2020) | - |
SAILFISH: Memeriksa Bug Inkonsistensi Status Kontrak Cerdas dalam Hitungan Detik | Andalkan SlithIR untuk membuat grafik ketergantungan penyimpanan | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, dan Giovanni Vigna | S&P 22 | Ikan layar |
SolType: Jenis Penyempurnaan untuk Luapan Aritmatika dalam Soliditas | Gunakan Slither sebagai frontend untuk membangun sistem tipe penyempurnaan | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
Jangan Rug on Me: Memanfaatkan Teknik Pembelajaran Mesin untuk Deteksi Penipuan Otomatis | Gunakan Slither untuk mengekstrak fitur token (dapat dibuat, dapat dijeda, ..) | Mazorra, Bruno, Victor Adan, dan Vanesa Daza | Matematika 10.6 (2022) | - |
MANDO: Penyematan Grafik Heterogen Multi-Level untuk Deteksi Detail Kerentanan Kontrak Cerdas | Gunakan Slither untuk mengekstrak CFG dan grafik panggilan | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan dan Lingxiao Jiang | Konferensi Internasional IEEE ke-9 tentang Ilmu Data dan Analisis Tingkat Lanjut (DSAA, 2022) | ge-sc |
Audit Otomatis terhadap Kerentanan TOD yang Mencungkil Harga dalam Kontrak Cerdas | Gunakan Slither untuk mengekstrak CFG dan dependensi data | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, dan Fan Long | Konferensi Internasional IEEE 2022 tentang Blockchain dan Cryptocurrency (ICBC) | Perbaikan Kontrak Cerdas |
Pemodelan dan Penegakan Kebijakan Kontrol Akses untuk Kontrak Cerdas | Perluas ketergantungan data Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | Konferensi Internasional IEEE tentang Aplikasi dan Infrastruktur Terdesentralisasi (DAPPS), 2022 | Penegakan SolidityAccessControl |
Deteksi Kerentanan Kontrak Cerdas Berdasarkan Pembelajaran Mendalam dan Penggabungan Keputusan Multimodal | Gunakan Slither untuk mengekstrak CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, dan Xuan Hu | Sensor 2023, 23, 7246 | - |
Grafik Pengetahuan Kode yang diperkaya semantik untuk Mengungkap Hal yang Tidak Diketahui dalam Penggunaan Kembali Kode Kontrak Cerdas | Gunakan Slither untuk mengekstrak fitur kode (CFG, fungsi, tipe parameter, ..) | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | Transaksi ACM pada Rekayasa dan Metodologi Perangkat Lunak, 2023 | - |
Eksekusi Paralel Kontrak Cerdas dengan Akses Negara Terperinci | Gunakan Slither untuk membuat grafik akses negara | Xiaodong Qi, Jiao Jiao, Yi Li | Konferensi Internasional tentang Sistem Komputasi Terdistribusi (ICDCS), 2023 | - |
Apel Buruk: Memahami Risiko Keamanan Terpusat di Ekosistem Terdesentralisasi | Menerapkan analisis internal di atas Slither | Kailun Yan, Jilian Zhang, Xiangyu Liu, Wenrui Diao, Shanqing Guo | Konferensi Web ACM April 2023 | - |
Mengidentifikasi Kerentanan dalam Kontrak Cerdas menggunakan Analisis Interval | Buat 4 detektor di atas Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | DARI 2023 | - |
Analisis Status Penyimpanan dan Ekstraksi Kontrak Cerdas Ethereum Blockchain (tidak ada PDF dalam akses terbuka) | Andalkan CFG dan AST Slither | Maha Ayub, Tania Saleem, Muhammad Janjua, Talha Ahmad | TOSEM 2023 | SmartMuv |
Jika Anda menggunakan Slither pada karya akademis, pertimbangkan untuk mendaftar ke Crytic $10k Research Prize.