
Rustle เป็นเครื่องวิเคราะห์แบบคงที่อัตโนมัติสำหรับสัญญาอัจฉริยะใกล้กับ Rust มันสามารถช่วยค้นหาช่องโหว่ที่แตกต่างกันหลายสิบในสัญญาสมาร์ทใกล้ จากข้อมูลของ Defillama ในบรรดา 10 อันดับแรกของ Dapps ใกล้ 8 ได้รับการตรวจสอบโดย blocksec ด้วยประสบการณ์การตรวจสอบที่หลากหลายและความเข้าใจอย่างลึกซึ้งเกี่ยวกับโปรโตคอลใกล้เราสร้างเครื่องมือนี้และแบ่งปันกับชุมชน
ติดตั้งชุดเครื่องมือที่ต้องการด้วยคำสั่งต่อไปนี้สำหรับ Rustle ใน Linux คำสั่งถูกทดสอบใน 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 คำสั่งต่อไปนี้สำหรับผู้ใช้ที่ใช้ macOS พวกเขาจะถูกทดสอบเฉพาะใน Apple Silicon Mac เท่านั้นดังนั้นใช้ด้วยความระมัดระวัง
# 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 rustfiltเราให้บริการโซลูชันนักเทียบท่า
# 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 : เส้นทางไปยังแหล่งที่มาสัญญาtg_dir : เส้นทางไปยังเป้าหมายการสร้างสัญญา ค่าเริ่มต้นที่จะเหมือนกับ src_dirdetector : รายการเครื่องตรวจจับ มันสามารถใช้ในการผ่าน เครื่องตรวจ จับหรือ กลุ่ม หลายกลุ่มคั่นด้วย , ค่าเริ่มต้นสำหรับ allall เพื่อเปิดใช้งานเครื่องตรวจจับทั้งหมดhigh medium low และ info เพื่อเปิดใช้งานกลุ่มเครื่องตรวจจับที่มีความรุนแรงแตกต่างกัน (อ้างอิงจากเครื่องตรวจจับ)nep-ft , nep-storage และ nep-nft เพื่อเปิดใช้งานเครื่องตรวจจับที่ใช้สำหรับ NEP ที่ระบุ (ดูกลุ่มเครื่องตรวจจับ NEP)output : เส้นทางที่รายงานการตรวจสอบจะถูกสร้างขึ้นในค่าเริ่มต้นเป็น ./audit-result การตรวจสอบ หมายเหตุ: หากรหัสบิตเป้าหมาย ( .bc ไบนารี) ที่สร้างโดยสินค้าไม่ได้อยู่ใน $src_dir ให้ใช้ -t|--tg_dir เพื่อตั้งค่าไดเรกทอรีของเป้าหมายหรือจะถูกตั้งค่าเป็น $src_dir โดยค่าเริ่มต้น
คำสั่งด้านล่างแสดงตัวอย่างของการวิเคราะห์เชิงเส้น
# 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-reportรายงาน CSV-format จะถูกสร้างขึ้นในไดเรกทอรี "./audit-result"
ช่องโหว่ทั้งหมด Rustle สามารถหาได้
| ID ตรวจจับ | คำอธิบาย | ความรุนแรง |
|---|---|---|
unhandled-promise | ค้นหา Promises ที่ไม่ได้รับการจัดการ | สูง |
non-private-callback | ขาดมาโคร #[private] สำหรับฟังก์ชั่นการโทรกลับ | สูง |
reentrancy | ค้นหาฟังก์ชั่นที่มีความเสี่ยงต่อการโจมตีอีกครั้ง | สูง |
unsafe-math | ขาดการตรวจสอบล้นสำหรับการดำเนินการทางคณิตศาสตร์ | สูง |
self-transfer | การตรวจสอบ sender != receiver | สูง |
incorrect-json-type | ประเภทไม่ถูกต้องที่ใช้ในพารามิเตอร์หรือค่าส่งคืน | สูง |
unsaved-changes | การเปลี่ยนแปลงของคอลเลกชันจะไม่ถูกบันทึกไว้ | สูง |
nft-approval-check | ค้นหา nft_transfer โดยไม่ต้องตรวจสอบ approval id | สูง |
nft-owner-check | ค้นหาฟังก์ชั่นอนุมัติหรือเพิกถอนโดยไม่ต้องตรวจสอบเจ้าของ | สูง |
div-before-mul | การสูญเสียที่แม่นยำเนื่องจากคำสั่งการดำเนินการที่ไม่ถูกต้อง | ปานกลาง |
round | การปัดเศษโดยไม่ต้องระบุเพดานหรือพื้น | ปานกลาง |
lock-callback | ความตื่นตระหนกในฟังก์ชั่นการโทรกลับอาจล็อคสัญญา | ปานกลาง |
yocto-attach | ไม่มี assert_one_yocto ในฟังก์ชันที่ได้รับการยกเว้น | ปานกลาง |
dup-collection-id | ใช้ ID ซ้ำในคอลเลกชัน | ปานกลาง |
unregistered-receiver | ไม่มีความตื่นตระหนกในการรับโอนที่ไม่ได้ลงทะเบียน | ปานกลาง |
nep${id}-interface | ค้นหาอินเทอร์เฟซ NEP ที่ไม่ได้ใช้งานทั้งหมด | ปานกลาง |
prepaid-gas | ขาดการตรวจสอบก๊าซเติมเงินใน ft_transfer_call | ต่ำ |
non-callback-private | มาโคร #[private] ใช้ในฟังก์ชั่นที่ไม่ใช่การโทรกลับ | ต่ำ |
unused-ret | ฟังก์ชั่นผลลัพธ์ไม่ได้ใช้หรือตรวจสอบ | ต่ำ |
upgrade-func | ไม่มีฟังก์ชั่นการอัพเกรดในสัญญา | ต่ำ |
tautology | Tautology ที่ใช้ในสาขาเงื่อนไข | ต่ำ |
storage-gas | การตรวจสอบความสมดุลที่ขาดหายไปสำหรับการขยายการจัดเก็บข้อมูล | ต่ำ |
unclaimed-storage-fee | ตรวจสอบความสมดุลที่ขาดหายไปก่อนที่จะไม่ลงทะเบียน | ต่ำ |
inconsistency | การใช้สัญลักษณ์ที่คล้ายกัน แต่แตกต่างกันเล็กน้อย | ข้อมูล |
timestamp | ค้นหาการใช้เวลาทั้งหมดของ timestamp | ข้อมูล |
complex-loop | ค้นหาลูปทั้งหมดที่มีตรรกะที่ซับซ้อนซึ่งอาจนำไปสู่ DOS | ข้อมูล |
ext-call | ค้นหาการเรียกร้องข้ามสัญญาทั้งหมด | ข้อมูล |
promise-result | ค้นหาการใช้ผลตามสัญญาทั้งหมด | ข้อมูล |
transfer | ค้นหาการถ่ายโอนทั้งหมด | ข้อมูล |
public-interface | ค้นหาส่วนต่อประสานสาธารณะทั้งหมด | ข้อมูล |
นอกเหนือจากกลุ่มตามระดับความรุนแรงแล้ว Rustle ยังให้กลุ่มเครื่องตรวจจับบางกลุ่มโดย NEP ที่สอดคล้องกัน ปัจจุบัน Rustle รองรับกลุ่มต่อไปนี้
| คนโง่ | ID กลุ่มตรวจจับ | รหัสตรวจจับ |
|---|---|---|
| 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 และชื่อไปยังรายการเครื่องตรวจจับและกลุ่มความรุนแรงในสคริปต์ ./rustle rustleaudit.py )Rustle สามารถใช้ในกระบวนการพัฒนาเพื่อสแกนสัญญาที่ชาญฉลาดใกล้เคียงกันซ้ำ ๆ สิ่งนี้สามารถประหยัดความพยายามด้วยตนเองได้อย่างมากและลดปัญหาที่อาจเกิดขึ้น อย่างไรก็ตามช่องโหว่ในตรรกะที่ซับซ้อนหรือที่เกี่ยวข้องกับความหมายยังคงเป็นข้อ จำกัด ของ rustle การค้นหาปัญหาความหมายที่ซับซ้อนต้องใช้ผู้เชี่ยวชาญใน BlockSec เพื่อทำการตรวจสอบอย่างละเอียดและละเอียดถี่ถ้วน ติดต่อเราสำหรับบริการตรวจสอบ
โครงการนี้อยู่ภายใต้ใบอนุญาต AGPLV3 ดูไฟล์ใบอนุญาตสำหรับข้อความใบอนุญาตเต็มรูปแบบ