คำเตือน
Regast ยังไม่ได้รับการบำรุงรักษาตั้งแต่เดือนมีนาคม 2566 หากคุณกำลังพยายามเรียกใช้มันอาจจะทำให้เกิดข้อผิดพลาดในระหว่างการแยกวิเคราะห์
อย่างไรก็ตามอย่าลังเลที่จะดูรหัสเพื่อให้เข้าใจถึงวิธีการใช้เครื่องวิเคราะห์แบบคงที่ของคุณเอง
Regast เป็นเครื่องวิเคราะห์แบบคงที่สำหรับการระบุช่องโหว่ด้านความปลอดภัยและการเพิ่มประสิทธิภาพก๊าซในรหัสฐานความแข็งแกร่ง
มันได้รับแรงบันดาลใจอย่างมากจากเครื่องมือเช่น Slither, Solstat และ 4Naly3er แต่มีความแตกต่างดังต่อไปนี้:
Regast ต้องการ Python 3.10 หรือสูงกว่า
ก่อนอื่นโคลนที่เก็บนี้และ submodules:
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 -custom-detectors.md
Regast สามารถสร้างรายงาน Markdown พร้อมปัญหาที่พบ ตัวอย่างเช่นโปรดดูรายงานตัวอย่างต่อไปนี้:
Regast ถูกสร้างขึ้นที่ด้านบนของ Tree-Sitter-Python ซึ่งให้การผูก Python สำหรับห้องสมุดการแยกวิเคราะห์ของต้นไม้ ไวยากรณ์เพื่อความแข็งแกร่งนั้นนำมาจากความละลายของต้นไม้
tree-sitter แรกแปลงซอร์สโค้ดที่มีความแข็งแกร่งเป็นหลายต้นไวยากรณ์นามธรรม (AST) Regast จากนั้นวิเคราะห์แต่ละโหนดใน ASTs เหล่านี้ลงในคลาส Python ที่สอดคล้องกัน หลังจากการแยกวิเคราะห์เสร็จสิ้นเครื่องตรวจจับแต่ละตัวจะสอบถาม AST ผ่านคลาส Python เหล่านี้เพื่อระบุรูปแบบช่องโหว่ทั่วไป
รหัสส่วนใหญ่ของ Regast อยู่ในไดเรกทอรีต่อไปนี้:
regast/core มีคลาส Python ซึ่งแสดงถึงส่วนต่าง ๆ ของ ASTregast/detectors มีเครื่องตรวจจับที่ regast ทำงานตามค่าเริ่มต้นregast/parsing มีตรรกะสำหรับการแยกวิเคราะห์ AST จาก tree-sitter ไปยังคลาส Python