경고
Regast는 2023 년 3 월 이후 유지되지 않았습니다. 실행하려는 경우 구문 분석 단계에서 오류가 발생할 수 있습니다.
그럼에도 불구하고, 자신의 정적 분석기를 구현하는 방법에 대한 아이디어를 얻으려면 코드를 살펴보십시오.
Regast 는 견고성 코드베이스에서 보안 취약점 및 가스 최적화를 식별하기위한 정적 분석기입니다.
Slither, Solstat 및 4naly3er와 같은 도구에서 큰 영감을 얻었지만 다음과 같은 차이점이 있습니다.
Regast는 Python 3.10 이상이 필요합니다.
먼저이 저장소와 하위 모듈을 복제하십시오.
git clone --recurse-submodules https://github.com/MiloTruck/regast.git
cd regast pip 또는 setuptools 사용하여 Regast 설치 :
# Using pip
pip3 install .
# Using setuptools
python3 setup.py install설치 후 리포지토리를 삭제할 수 있습니다.
cd ..
rm -r regast regast 명령은 .sol 파일 또는 Solidity 파일을 포함하는 폴더에서 사용할 수 있습니다.
$ 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
다음은 Regast가 기본적으로 실행되는 현재 구현 된 탐지기입니다. 4NALY3ER 및 SOLSTAT의 대부분의 탐지기가 향후 포함됩니다.
| 탐지기 | 설명 | 분류 |
|---|---|---|
address_balance | address(this).balance 대신 selfbalance() 사용하십시오. | 가스 |
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 | '장점은 for-loops에서 unchecked 선언 할 수 있습니다.' | 가스 |
unsigned_comparison | 서명되지 않은 정수 비교에 > 0 대신 != 0 사용하십시오. | 가스 |
맞춤 탐지기를 작성하는 방법에 대한 자세한 내용은 docs/writing-custom-detectors.md 를 참조하십시오.
Regast는 발견 된 문제로 Markdown 보고서를 생성 할 수 있습니다. 예를 들어, 다음 샘플 보고서를 참조하십시오.
Regast는 트리 시터 파이썬 위에 제작되었으며 트리 시터 구문 분석 라이브러리에 파이썬 바인딩을 제공합니다. 견고성을위한 문법은 나무-시터-고도에서 가져옵니다.
tree-sitter 먼저 Solidity 소스 코드를 여러 초록 구문 트리 (AST)로 변환합니다. 그런 다음 Regast는 이러한 AST의 각 노드를 해당 Python 클래스로 구문 분석합니다. 구문 분석이 완료된 후 개별 감지기는 이러한 파이썬 클래스를 통해 AST를 쿼리하여 일반적인 취약성 패턴을 식별합니다.
Regast 의 코드 대부분은 다음 디렉토리에 있습니다.
regast/core 에는 AST의 일부를 나타내는 Python 클래스가 포함되어 있습니다.regast/detectors 에는 Regast가 기본적으로 실행되는 탐지기가 포함되어 있습니다.regast/parsing 에는 tree-sitter 에서 Python 클래스로 AST를 구문 분석하는 논리가 포함되어 있습니다.