
Rustle adalah penganalisa statis otomatis untuk kontrak pintar dekat karat. Ini dapat membantu menemukan puluhan kerentanan yang berbeda di dekat kontrak pintar. Menurut DeFillama, di antara 10 dapp teratas di dekat, 8 diaudit oleh Blocksec. Dengan pengalaman audit yang kaya dan pemahaman yang mendalam tentang protokol dekat, kami membangun alat ini dan membaginya dengan komunitas.
Instal toolkit yang diperlukan dengan perintah berikut untuk gemerisik di Linux. Perintah diuji dalam 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 Perintah berikut adalah untuk pengguna yang menggunakan macOS, mereka hanya diuji pada Apple Silicon Mac, jadi gunakan dengan hati -hati.
# 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 rustfiltKami memberikan solusi 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 : Jalur ke sumber kontrak.tg_dir : Jalur ke target pembuatan kontrak. Default menjadi sama dengan src_dir .detector : Daftar Detektor. Ini dapat digunakan untuk melewati beberapa detektor atau kelompok yang dipisahkan oleh , . Default untuk all .all kelompok untuk mengaktifkan semua detektor.high , medium , low dan info untuk memungkinkan kelompok detektor dengan tingkat keparahan yang berbeda (lihat detektor)nep-ft , nep-storage dan nep-nft untuk memungkinkan detektor yang diimplementasikan untuk NEP yang ditentukan (lihat kelompok detektor NEP)output : jalur di mana laporan audit akan dihasilkan. Default ke ./audit-result . CATATAN: Jika kode bit target ( .bc biner) yang dibangun oleh kargo tidak ada dalam $src_dir , gunakan -t|--tg_dir untuk mengatur direktori target, atau akan diatur ke $src_dir secara default.
Perintah di bawah ini menunjukkan contoh menganalisis linier.
# 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-reportLaporan format CSV akan dihasilkan di direktori "./audit-result".
Semua kerentanan dapat ditemukan.
| ID Detektor | Keterangan | Kerasnya |
|---|---|---|
unhandled-promise | Temukan Promises yang tidak ditangani | Tinggi |
non-private-callback | Makro yang hilang #[private] untuk fungsi panggilan balik | Tinggi |
reentrancy | Temukan fungsi yang rentan terhadap serangan reentrancy | Tinggi |
unsafe-math | Kurangnya cek overflow untuk operasi aritmatika | Tinggi |
self-transfer | cek yang hilang dari sender != receiver | Tinggi |
incorrect-json-type | Jenis salah yang digunakan dalam parameter atau nilai pengembalian | Tinggi |
unsaved-changes | Perubahan koleksi tidak disimpan | Tinggi |
nft-approval-check | Temukan nft_transfer tanpa pemeriksaan approval id | Tinggi |
nft-owner-check | Temukan Fungsi Menyetujui atau mencabut tanpa cek pemilik | Tinggi |
div-before-mul | kerugian presisi karena perintah operasi yang salah | Sedang |
round | pembulatan tanpa menentukan langit -langit atau lantai | Sedang |
lock-callback | Panik dalam fungsi panggilan balik dapat mengunci kontrak | Sedang |
yocto-attach | no assert_one_yocto dalam fungsi istimewa | Sedang |
dup-collection-id | duplikat ID digunakan dalam koleksi | Sedang |
unregistered-receiver | Tidak ada kepanikan pada penerima transfer yang tidak terdaftar | Sedang |
nep${id}-interface | Temukan semua antarmuka NEP yang tidak diimplementasikan | Sedang |
prepaid-gas | Periksa gas prabayar yang hilang di ft_transfer_call | Rendah |
non-callback-private | Makro #[private] yang digunakan dalam fungsi non-callback | Rendah |
unused-ret | Hasil fungsi tidak digunakan atau diperiksa | Rendah |
upgrade-func | Tidak ada fungsi peningkatan dalam kontrak | Rendah |
tautology | Tautologi digunakan dalam cabang bersyarat | Rendah |
storage-gas | cek saldo yang hilang untuk ekspansi penyimpanan | Rendah |
unclaimed-storage-fee | cek saldo yang hilang sebelum penyimpanan lepaskan | Rendah |
inconsistency | penggunaan simbol yang serupa tetapi sedikit berbeda | Info |
timestamp | Temukan semua penggunaan timestamp | Info |
complex-loop | Temukan semua loop dengan logika kompleks yang dapat menyebabkan DOS | Info |
ext-call | Temukan semua doa lintas-kontrak | Info |
promise-result | Temukan semua penggunaan hasil janji | Info |
transfer | Temukan semua tindakan transfer | Info |
public-interface | Temukan semua antarmuka publik | Info |
Terlepas dari kelompok dengan tingkat keparahan, Rustle menyediakan beberapa kelompok detektor dengan NEP yang sesuai. Saat ini, Rustle mendukung kelompok -kelompok berikut.
| Nep | ID Grup Detektor | ID Detektor |
|---|---|---|
| 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 dan namanya ke daftar detektor dan grup keparahan di ./rustle Script.audit.py ).Rustle dapat digunakan dalam proses pengembangan untuk memindai kontrak pintar yang dekat secara iteratif. Ini dapat menghemat banyak upaya manual dan mengurangi bagian dari masalah potensial. Namun, kerentanan dalam logika kompleks atau terkait dengan semantik masih merupakan batasan gemerisik . Menemukan masalah semantik yang rumit mengharuskan para ahli di Blocksec untuk melakukan tinjauan lengkap dan menyeluruh. Hubungi kami untuk layanan audit.
Proyek ini berada di bawah lisensi AGPLV3. Lihat file lisensi untuk teks lisensi lengkap.