
Rustle هو محلل ثابت تلقائي للعقود الذكية القريبة في الصدأ. يمكن أن يساعد في تحديد موقع عشرات نقاط الضعف المختلفة في العقود الذكية القريبة. وفقًا لـ Defillama ، من بين أفضل 10 DAPPs في القرب ، يتم تدقيق 8 بواسطة Blocksec. من خلال تجربة التدقيق الغنية وفهم عميق للبروتوكول القريب ، نقوم ببناء هذه الأداة ونشاركها مع المجتمع.
قم بتثبيت مجموعات الأدوات المطلوبة مع الأوامر التالية لـ Ratle في 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 ، يتم اختبارها فقط على MAC 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نحن نقدم حل 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 : مسار إلى مصدر العقد.tg_dir : مسار إلى هدف بناء العقد. الافتراضيات لتكون نفس src_dir .detector : قائمة الكاشف. يمكن استخدامه لتمرير أجهزة كاشف أو مجموعات متعددة مفصولة , . الإعدادات الافتراضية all .all المجموعات لتمكين جميع الكشف.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 في الدليل ".
جميع نقاط الضعف التي يمكن أن تجدها.
| معرف الكاشف | وصف | خطورة |
|---|---|---|
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 | يستخدم معرف مكرر في المجموعات | واسطة |
unregistered-receiver | لا فزع على أجهزة الاستقبال غير المسجلة | واسطة |
nep${id}-interface | ابحث عن جميع واجهة NEP غير المنفعة | واسطة |
prepaid-gas | فحص مفقود للغاز المدفوع مسبقًا في ft_transfer_call | قليل |
non-callback-private | الماكرو #[private] المستخدم في وظيفة غير متابعة | قليل |
unused-ret | نتيجة الوظيفة لم يتم استخدامها أو فحصها | قليل |
upgrade-func | لا وظيفة ترقية في العقد | قليل |
tautology | التوت المستخدمة في الفرع الشرطي | قليل |
storage-gas | فحص الرصيد المفقود لتوسيع التخزين | قليل |
unclaimed-storage-fee | التحقق من الرصيد المفقود قبل التخزين unregister | قليل |
inconsistency | استخدام رمز مماثل ولكن مختلف قليلاً | معلومات |
timestamp | ابحث عن جميع استخدامات timestamp | معلومات |
complex-loop | ابحث عن جميع الحلقات ذات المنطق المعقد والتي قد تؤدي إلى DOS | معلومات |
ext-call | ابحث عن جميع دعوات العقد عبر | معلومات |
promise-result | ابحث عن جميع استخدامات الوعد | معلومات |
transfer | ابحث عن جميع إجراءات النقل | معلومات |
public-interface | ابحث عن جميع الواجهات العامة | معلومات |
بصرف النظر عن المجموعات حسب مستوى الشدة ، يوفر Ratle بعض مجموعات الكاشف عن طريق NEP المقابلة. حاليا ، rastle يدعم المجموعات التالية.
| نيب | معرف مجموعة الكاشف | معرفات الكاشف |
|---|---|---|
| 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 script.audit.py ).يمكن استخدام Restle في عملية التطوير لمسح العقود الذكية القريبة بشكل متكرر. هذا يمكن أن يوفر الكثير من الجهد اليدوي والتخفيف من جزء من القضايا المحتملة. ومع ذلك ، لا تزال نقاط الضعف في المنطق المعقد أو المتعلقة بالدلالات هي قيود الصرع . يتطلب تحديد موقع القضايا الدلالية المعقدة من الخبراء في Blocksec إجراء مراجعات شاملة وشاملة. اتصل بنا لخدمة التدقيق.
هذا المشروع تحت رخصة AGPLV3. راجع ملف الترخيص لنص الترخيص الكامل.