警告
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 regastregastコマンドは、 .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
以下は、デフォルトでレガストが実行される現在実装されている検出器です。 4naly3erとsolstatのほとんどの検出器は、将来に含まれます。
| 検出器 | 説明 | 分類 |
|---|---|---|
address_balance | address(this).balanceの代わりにselfbalance()を使用します。 | ガス |
address_zero | アセンブリを使用してaddress(0)を確認します。 | ガス |
assign_update_array_value | arr[i] += n arr[i] = arr[i] + n nを使用して配列値を更新します。 | ガス |
bool_comparison | ブール値をtrueまたはfalseと比較しないでください。 | ガス |
bool_storage | ストレージにboolを使用すると、オーバーヘッドが発生します。 | ガス |
byte_constant | bytes定数は、 string定数よりも効率的です。 | ガス |
cache_array_length | loopsの外側のキャッシュアレイの長さ。 | ガス |
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は、ツリーシッターパージングライブラリにPythonバインディングを提供するツリーシッター-Pythonの上に構築されています。堅牢性の文法は、ツリーシッターの溶解性から取られます。
tree-sitter最初に堅牢性ソースコードを複数の抽象的構文ツリー(AST)に変換します。次に、これらのASTの各ノードを対応するPythonクラスに解析します。解析が完了した後、個々の検出器はこれらのPythonクラスを介してASTを照会して、一般的な脆弱性パターンを特定します。
Regastのコードのほとんどは、次のディレクトリにあります。
regast/coreには、ASTの一部を表すPythonクラスが含まれています。regast/detectorsには、デフォルトで実行されるレガストが実行される検出器が含まれています。regast/parsing tree-sitterからPythonクラスにASTを解析するためのロジックが含まれています。