تحذير
لم يتم الحفاظ على Regast منذ مارس 2023. إذا كنت تحاول تشغيله ، فمن المحتمل أن يرمي خطأ أثناء مرحلة التحليل.
ومع ذلك ، لا تتردد في النظر من خلال الكود للحصول على فكرة عن كيفية تنفيذ المحلل الثابت الخاص بك.
Regast هو محلل ثابت لتحديد ثغرات الأمن وتحسين الغاز في قواعد الرمز.
إنه مستوحى بشدة من أدوات مثل Slither و Solstat و 4Naly3er ، ولكن لديه الاختلافات التالية:
يتطلب regast python 3.10 أو أعلى.
أولاً ، استنساخ هذا المستودع وفيروساته الفرعية:
git clone --recurse-submodules https://github.com/MiloTruck/regast.git
cd regast تثبيت regast باستخدام إما pip أو setuptools :
# Using pip
pip3 install .
# Using setuptools
python3 setup.py installبعد التثبيت ، يمكن حذف المستودع:
cd ..
rm -r regast يمكن استخدام أمر regast على ملف .sol أو مجلد يحتوي على ملفات صلابة:
$ regast --help
usage: __main__.py [-h] [-d <detector>] [-c <classifications>] [-s <scope>] [-r <filename>] <contract>
Scan for vulnerabilities based on regex or AST queries.
positional arguments:
<contract> .sol file or folder containing .sol files to scan
options:
-h, --help show this help message and exit
-d <detector>, --detectors <detector>
.py file or folder containing .py files which implement detectors
-c <classifications>, --classifications <classifications>
Comma-separated list of classifications: GAS, NC, LOW, MEDIUM, HIGH
-s <scope>, --scope <scope>
Text file containing a list of contracts in scope
-r <filename>, --report <filename>
Generate a markdown report in <filename>.md
فيما يلي أجهزة الكشف التي تم تنفيذها حاليًا والتي تعمل بشكل افتراضي . سيتم تضمين معظم الكشف عن 4Naly3er و Solstat في المستقبل.
| كاشف | وصف | تصنيف |
|---|---|---|
address_balance | استخدم selfbalance() بدلاً من address(this).balance . | الغاز |
address_zero | استخدم التجميع للتحقق من address(0) . | الغاز |
assign_update_array_value | تحديث قيم الصفيف باستخدام arr[i] += n بدلاً من arr[i] = arr[i] + n . | الغاز |
bool_comparison | لا تقارن بين المنسقات true أو false . | الغاز |
bool_storage | باستخدام bool للتخزين يتحمل النفقات العامة. | الغاز |
byte_constant | ثوابت bytes أكثر كفاءة من ثوابت string . | الغاز |
cache_array_length | طول صفيف ذاكرة التخزين المؤقت خارج الحلقات. | الغاز |
custom_error | استخدم أخطاء مخصصة بدلاً من require عبارات. | الغاز |
initialize_default_value | تهيئة غير ضرورية للمتغيرات مع القيم الافتراضية | الغاز |
long_revert_string | require عبارات مع رسائل خطأ طويلة. | الغاز |
post_increment | ++i يكلف غاز أقل من i++ أو i += 1 . | الغاز |
private_constant | إعلان الثوابت على أنها private بدلاً من غير الجمهورية لإنقاذ الغاز. | الغاز |
shift_arithmetic | استخدم << و >> بدلاً من الضرب/التقسيم حيثما أمكن. | الغاز |
split_require_statements | استخدام منفصلة require عبارات بدلا من && . | الغاز |
unchecked_increment | "يمكن إعلان الزيادات unchecked في الحلقات". | الغاز |
unsigned_comparison | استخدم != 0 بدلاً من > 0 لمقارنة عدد صحيح غير موقّع. | الغاز |
للحصول على معلومات حول كيفية كتابة كاشفات مخصصة ، يرجى الرجوع إلى docs/writing-custom-detectors.md .
Regast قادر على توليد تقارير تخفيض مع القضايا الموجودة. على سبيل المثال ، يرجى الرجوع إلى تقارير العينة التالية:
تم تصميم Regast على رأس Bython ، الذي يوفر روابط Python لمكتبة تحليل جليدي الأشجار. يتم أخذ القواعد النحوية للصلابة من جودة الشجرة.
يحول tree-sitter أولاً رمز مصدر الصلابة إلى أشجار بناء جملة متعددة (AST). regast ثم يتم تحليل كل عقدة في هذه asts في فئات python المقابلة. بعد الانتهاء من التحليل ، تستفسر الكشف الفردي عن AST من خلال فئات Python هذه لتحديد أنماط الضعف الشائعة.
معظم رمز Regast موجودة في الدلائل التالية:
regast/core على فصول Python التي تمثل أجزاء من AST.regast/detectors على أجهزة الكشف التي تعمل بشكل افتراضي .regast/parsing على منطق تحليل AST من tree-sitter إلى فصول Python.