
slither v0.11.6
SolidityおよびVyper用静的解析ツール
Slither:スマートコントラクト静的解析ツール
Empire Hacking Slack に参加
- 議論とサポート
Slither は、Python3 で書かれた Solidity および Vyper の静的解析フレームワークです。脆弱性検出器一式を実行し、コントラクトの詳細に関する視覚情報を出力し、カスタム解析を簡単に記述するための API を提供します。Slither により、開発者は脆弱性の発見、コード理解の向上、カスタム解析の迅速なプロトタイピングが可能になります。
特徴
- 誤検出の少ない脆弱な Solidity コードの検出(トロフィーのリストを参照)
- ソースコード内のエラー発生箇所の特定
- 継続的インテグレーションおよび Hardhat/Foundry ビルドへの容易な統合
- 組み込みの「プリンター」による重要なコントラクト情報の迅速なレポート
- カスタム解析を Python で記述するための検出器 API
- Solidity >= 0.4 で書かれたコントラクトの解析機能
- 中間表現 (SlithIR) によるシンプルかつ高精度な解析
- 公開されている Solidity コードの 99.9% を正しくパース
- コントラクトあたりの平均実行時間は 1 秒未満
- CI における GitHub のコードスキャンとの統合
- Vyper スマートコントラクトのサポート
使い方
Slither を Hardhat/Foundry/Dapp/Brownie アプリケーションで実行:```console slither .
これは、プロジェクトに依存関係がある場合の推奨されるオプションです。Slitherは基盤となるコンパイルフレームワークに依存してソースコードをコンパイルします。
ただし、依存関係をインポートしない単一ファイル上でSlitherを実行することもできます:```console
slither tests/uninitialized.sol
インストール方法
注記 SlitherはPython 3.10以上が必要です。 サポートされているコンパイルフレームワークのいずれかを使用しない場合は、Solidityコンパイラであるsolcが必要です。solcのバージョンを簡単に切り替えるには、solc-selectの使用をお勧めします。
uvを使用する(推奨)
uvは高速なPythonパッケージマネージャで、pipよりも10〜100倍高速です。```console
Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
Install slither as a tool
uv tool install slither-analyzer
Or run slither without installation
uvx --from slither-analyzer slither
アップグレードするには:```console
uv tool upgrade slither-analyzer
Pipを使用する```console
python3 -m pip install slither-analyzer
アップグレードするには:```console
python3 -m pip install --upgrade slither-analyzer
Brew を使用する```console
brew install slither-analyzer
### Gitの使用(開発)```bash
git clone https://github.com/crytic/slither.git && cd slither
# Install as editable for development
uv tool install -e .
# Or use uv run for testing without installation
uv run slither <target>
The -eフラグは編集可能モードでインストールします。つまり、ソースコードへの変更は再インストールなしで即座に反映されます。
Dockerの使用
eth-security-toolbox Dockerイメージを使用してください。これには、すべてのセキュリティツールと、主要なすべてのバージョンのSolidityが1つのイメージに含まれています。 /home/share はコンテナ内の /share にマウントされます。```bash
docker pull trailofbits/eth-security-toolbox
コンテナ内でディレクトリを共有するには:```bash
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
統合
- GitHub Actionとの統合には、slither-actionを使用してください。
- pre-commitとの統合には、 (
$GIT_TAGを実際のタグに置き換えて) 使用してください ```YAML- repo: https://github.com/crytic/slither
rev: $GIT_TAG
hooks:
- id: slither
- repo: https://github.com/crytic/slither
rev: $GIT_TAG
hooks:
- マークダウンレポートを生成するには、
slither [target] --checklistを使用します。 - GitHub のソースコードハイライト付きマークダウンを生成するには、
slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/を使用します(ORG、REPO、COMMITを置き換えてください)。
検出器
| 番号 | 検出器 | 検出内容 | 影響度 | 信頼度 |
|---|---|---|---|---|
| 1 | abiencoderv2-array | ストレージ abiencoderv2 配列 | 高 | 高 |
| 2 | arbitrary-send-erc20 | 任意の from を使用した transferFrom | 高 | 高 |
| 3 | array-by-reference | ストレージ配列を値で変更 | 高 | 高 |
| 4 | encode-packed-collision | ABI encodePacked の衝突 | 高 | 高 |
| 5 | incorrect-shift | シフト命令のパラメータの順序が不正 | 高 | 高 |
| 6 | multiple-constructors | 複数のコンストラクタスキーム | 高 | 高 |
| 7 | name-reused | コントラクト名の再利用 | 高 | 高 |
| 8 | protected-vars | 保護されていない変数を検出 | 高 | 高 |
| 9 | public-mappings-nested | ネストされた変数を持つ公開マッピング | 高 | 高 |
| 10 | rtlo | 右から左へのオーバーライド制御文字の使用 | 高 | 高 |
| 11 | shadowing-state | 状態変数のシャドーイング | 高 | 高 |
| 12 | suicidal | 誰でもコントラクトを破棄できる関数 | 高 | 高 |
| 13 | uninitialized-state | 初期化されていない状態変数 | 高 | 高 |
| 14 | uninitialized-storage | 初期化されていないストレージ変数 | 高 | 高 |
| 15 | unprotected-upgrade | 保護されていないアップグレード可能なコントラクト | 高 | 高 |
| 16 | arbitrary-send-erc20-permit | permit と共に任意の from を使用した transferFrom | 高 | 中 |
| 17 | arbitrary-send-eth | 任意の宛先に Ether を送信する関数 | 高 | 中 |
| 18 | controlled-array-length | 汚染された配列長の代入 | 高 | 中 |
| 19 | controlled-delegatecall | 制御された delegatecall の宛先 | 高 | 中 |
| 20 | delegatecall-loop | ループ内で delegatecall を使用する payable 関数 | 高 | 中 |
| 21 | incorrect-exp | 不正な指数演算 | 高 | 中 |
| 22 | incorrect-return | アセンブリモードで return が誤って使用された場合 | 高 | 中 |
| 23 | msg-value-loop | ループ内の msg.value | 高 | 中 |
| 24 | reentrancy-eth | 再入可能性の脆弱性(Ether の盗難) | 高 | 中 |
| 25 | reentrancy-balance | 古い残高チェックにつながる再入可能性の脆弱性 | 高 | 中 |
| 26 | return-leave | return が leave の代わりに使用された場合 | 高 | 中 |
| 27 | storage-array | 符号付きストレージ整数配列のコンパイラバグ | 高 | 中 |
| 28 | unchecked-transfer | 未チェックのトークン転送 | 高 | 中 |
| 29 | weak-prng | 脆弱な PRNG | 高 | 中 |
| 30 | domain-separator-collision | EIP-2612 の DOMAIN_SEPARATOR() とシグネチャが衝突する関数を持つ ERC20 トークンを検出 | 中 | 高 |
| 31 | enum-conversion | 危険な列挙型変換を検出 | 中 | 高 |
| 32 | erc20-interface | 不正な ERC20 インターフェース | 中 | 高 |
| 33 | erc721-interface | 不正な ERC721 インターフェース | 中 | 高 |
| 34 | incorrect-equality | 危険な厳密な等価性 | 中 | 高 |
| 35 | locked-ether | Ether をロックするコントラクト | 中 | 高 |
| 36 | mapping-deletion | 構造体を含むマッピングの削除 | 中 | 高 |
| 37 | pyth-deprecated-functions | Pyth の非推奨関数を検出 | 中 | 高 |
| 38 | pyth-unchecked-confidence | Pyth 価格の信頼度レベルがチェックされていないことを検出 | 中 | 高 |
| 39 | pyth-unchecked-publishtime | Pyth 価格の publishTime がチェックされていないことを検出 | 中 | 高 |
| 40 | shadowing-abstract | 抽象コントラクトからの状態変数のシャドーイング | 中 | 高 |
| 41 | tautological-compare | 変数をそれ自身と比較すると、比較に応じて常に真または偽を返す | 中 | 高 |
| 42 | tautology | トートロジーまたは矛盾 | 中 | 高 |
| 43 | write-after-write | 未使用の書き込み | 中 | 高 |
| 44 | boolean-cst | ブール定数の誤用 | 中 | 中 |
| 45 | chronicle-unchecked-price | Chronicle 価格がチェックされていないことを検出 | 中 | 中 |
| 46 | constant-function-asm | アセンブリコードを使用する定数関数 | 中 | 中 |
| 47 | constant-function-state | 状態を変更する定数関数 | 中 | 中 |
| 48 | divide-before-multiply | 不正確な算術演算の順序 | 中 | 中 |
| 49 | gelato-unprotected-randomness | 保護されていない関数内での _requestRandomness の呼び出し | 中 | 中 |
| 50 | out-of-order-retryable | 順序が正しくないリトライ可能トランザクション | 中 | 中 |
| 51 | reentrancy-no-eth | 再入可能性の脆弱性(Ether の盗難なし) | 中 | 中 |
| 52 | reused-constructor | 再利用されたベースコンストラクタ | 中 | 中 |
| 53 | tx-origin | tx.origin の危険な使用 | 中 | 中 |
| 54 | unchecked-lowlevel | 未チェックの低レベル呼び出し | 中 | 中 |
| 55 | unchecked-send | 未チェックの send | 中 | 中 |
| 56 | uninitialized-local | 初期化されていないローカル変数 | 中 | 中 |
| 57 | unused-return | 未使用の戻り値 | 中 | 中 |
| 58 | chainlink-feed-registry | Chainlink フィードレジストリが使用されている場合を検出 | 低 | 高 |
| 59 | incorrect-modifier | デフォルト値を返す可能性のある修飾子 | 低 | 高 |
| 60 | optimism-deprecation | 非推奨の Optimism プリデプロイまたは関数が使用されている場合を検出 | 低 | 高 |
| 61 | shadowing-builtin | 組み込みシンボルのシャドーイング | 低 | 高 |
| 62 | shadowing-local | ローカル変数のシャドーイング | 低 | 高 |
| 63 | uninitialized-fptr-cst | コンストラクタ内の未初期化関数ポインタ呼び出し | 低 | 高 |
| 64 | variable-scope | 宣言前に使用されるローカル変数 | 低 | 高 |
| 65 | void-cst | 実装されていないコンストラクタ呼び出し | 低 | 高 |
| 66 | calls-loop | ループ内の複数の呼び出し | 低 | 中 |
| 67 | events-access | アクセス制御イベントの欠落 | 低 | 中 |
| 68 | events-maths | 算術イベントの欠落 | 低 | 中 |
| 69 | incorrect-unary | 危険な単項演算式 | 低 | 中 |
| 70 | missing-zero-check | ゼロアドレス検証の欠落 | 低 | 中 |
| 71 | reentrancy-benign | 良性の再入可能性の脆弱性 | 低 | 中 |
| 72 | reentrancy-events | 順序不正のイベントにつながる再入可能性の脆弱性 | 低 | 中 |
| 73 | return-bomb | 低レベルの呼び出し先が、予期せず呼び出し元のガスをすべて消費する可能性がある | 低 | 中 |
| 74 | timestamp | block.timestamp の危険な使用 | 低 | 中 |
| 75 | assembly | アセンブリの使用 | 情報 | 高 |
| 76 | assert-state-change | アサート状態変更 | 情報 | 高 |
| 77 | boolean-equal | ブール定数との比較 | 情報 | 高 |
| 78 | cyclomatic-complexity | サイクロマティック複雑度が高い(11 超)関数を検出 | 情報 | 高 |
| 79 | deprecated-standards | 非推奨の Solidity 標準 | 情報 | 高 |
| 80 | erc20-indexed | インデックス化されていない ERC20 イベントパラメータ | 情報 | 高 |
| 81 | function-init-state | 状態変数を初期化する関数 | 情報 | 高 |
| 82 | incorrect-using-for | 特定のライブラリの関数が特定の型と一致しない場合の using-for ステートメントの使用を検出 | 情報 | 高 |
| 83 | low-level-calls | 低レベル呼び出し | 情報 | 高 |
| 84 | missing-inheritance | 継承の欠落 | 情報 | 高 |
| 85 | naming-convention | Solidity 命名規則への準拠 | 情報 | 高 |
| 86 | pragma | 異なるプラグマディレクティブが使用されている場合 | 情報 | 高 |
| 87 | redundant-statements | 冗長なステートメント | 情報 | 高 |
| 88 | solc-version | 不適切な Solidity バージョン | 情報 | 高 |
| 89 | unimplemented-functions | 未実装の関数 | 情報 | 高 |
| 90 | unindexed-event-address | アドレスパラメータがあるがインデックス化されたパラメータがないイベント | 情報 | 高 |
| 91 | unused-state | 未使用の状態変数 | 情報 | 高 |
| 92 | costly-loop | ループ内の高コストな操作 | 情報 | 中 |
| 93 | dead-code | 使用されていない関数 | 情報 | 中 |
| 94 | reentrancy-unlimited-gas | send と transfer を通じた再入可能性の脆弱性 | 情報 | 中 |
| 95 | too-many-digits | 数値表記のベストプラクティスへの準拠 | 情報 | 中 |
| 96 | cache-array-length | ループ条件で何らかのストレージ配列の length メンバを使用し、それを変更しない for ループを検出 | 最適化 | 高 |
| 97 | constable-states | 定数として宣言できる状態変数 | 最適化 | 高 |
| 98 | external-function | external として宣言できる public 関数 | 最適化 | 高 |
| 99 | immutable-states | immutable として宣言できる状態変数 | 最適化 | 高 |
| 100 | var-read-using-this | コントラクトが this を使用して自身の変数を読み取る | 最適化 | 高 |
詳細については、以下を参照してください。
プリンター
クイックレビュープリンター
human-summary: コントラクトの人間が読める概要を出力inheritance-graph: 各コントラクトの継承グラフを dot ファイルにエクスポートcontract-summary: コントラクトの概要を出力loc: ソースファイル(SRC)、依存関係(DEP)、テストファイル(TEST)にあるコード行数(LOC)、ソースコード行数(SLOC)、コメント行数(CLOC)の合計をカウントentry-points: コントラクトのすべての状態変更エントリポイント関数とその変数を出力
詳細レビュープリンター* call-graph: コントラクトのコールグラフをdotファイルにエクスポートする
cfg: 各関数のCFGをエクスポートするfunction-summary: 関数のサマリーを出力するvars-and-auth: 書き込まれる状態変数と関数の認可を出力するnot-pausable:whenNotPaused修飾子を使用しない関数を出力する
プリンタを実行するには、--print を使用し、カンマ区切りでプリンタのリストを指定します。
完全なリストについては、プリンタドキュメント を参照してください。
ツール
slither-check-upgradeability:delegatecallベースのアップグレード可能性をレビューするslither-prop: 自動単体テストとプロパティ生成slither-flat: コードベースをフラット化するslither-check-erc: ERC 準拠をチェックするslither-read-storage: コントラクトからストレージ値を読み取るslither-interface: コントラクトのインターフェースを生成する
追加のツールについては、ツールドキュメント を参照してください。
カスタムツールの構築に関する支援については、お問い合わせください。
APIドキュメント
Slither の内部に関するドキュメントはこちらで入手できます。
ヘルプ
Slither の使用または拡張についてのヘルプは、Slack チャンネル (#ethereum) にお気軽にお立ち寄りください。
- プリンタドキュメント は、Slither が各コントラクトについて可視化できる情報を説明しています。
- ディテクタドキュメント は、新しい脆弱性分析の書き方を説明しています。
- APIドキュメント は、カスタム分析で利用可能なメソッドとオブジェクトを説明しています。
- SlithIRドキュメント は、SlithIR 中間表現を説明しています。
FAQ
モックやテストを除外するにはどうすればよいですか?
- パスフィルタリング に関するドキュメントを参照してください。
「unknown file」やコンパイルの問題を修正するにはどうすればよいですか?
- slither は solc AST を必要とするため、すべての依存関係が利用可能でなければなりません。
コントラクトに依存関係がある場合、
slither contract.solは失敗します。 代わりに、contracts/の親ディレクトリでslither .を使用してください(lsを実行するとcontracts/が表示されるはずです)。node_modules/フォルダがある場合は、contracts/と同じディレクトリになければなりません。この問題が slither に関連していることを確認するには、 使用しているフレームワークのコンパイルコマンド(例:npx hardhat compile)を実行してください。それが正常に動作する必要があります。 そうでない場合、slither のコンパイルエンジンである crytic-compile は AST を生成できません。
ライセンス
Slither は AGPLv3 ライセンスの下でライセンスおよび配布されています。条件の例外を求める場合は、お問い合わせください。
出版物
Trail of Bits の出版物
- Slither: スマートコントラクトのための静的解析フレームワーク, Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19
外部出版物
| タイトル | 使用方法 | 著者 | 発表先 | コード |
|---|---|---|---|---|
| ReJection: ASTベースの再入可能性脆弱性検出手法 | Slither上に構築されたASTベースの分析 | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
| MPro: 静的解析と記号解析を組み合わせたスマートコントラクトのスケーラブルなテスト | Slitherを通じたデータ依存性の活用 | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
| ETHPLOIT: ファジングからスマートコントラクトに対する効率的なエクスプロイト生成へ | Slitherを通じたデータ依存性の活用 | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
| イーサリアムスマートコントラクトの検証: モデル検査アプローチ | SlitherのCFG上に構築された記号実行 | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
| スマートコントラクトの修復 | Slitherの脆弱性検出器に依存 | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
| スマートコントラクトにおけるループの解明 | Slitherを通じたデータ依存性の活用 | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
| トレースベースのスマートコントラクトループにおける動的ガス推定 | SlitherのCFGを使用してループを検出 | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
| SAILFISH: スマートコントラクトの状態不整合バグを数秒で検証 | SlithIRに依存してストレージ依存関係グラフを構築 | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 | Sailfish |
| SolType: Solidityにおける算術オーバーフローのための洗練型 | Slitherをフロントエンドとして使用し洗練型システムを構築 | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
| Do Not Rug on Me: 機械学習技術を活用した自動スキャム検出 | Slitherを使用してトークンの特徴(ミント可能、ポーズ可能など)を抽出 | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
| MANDO: スマートコントラクト脆弱性の細粒度検出のためのマルチレベル異種グラフ埋め込み | Slitherを使用してCFGとコールグラフを抽出 | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan and Lingxiao Jiang | IEEE 9th International Conference on Data Science and Advanced Analytics (DSAA, 2022) | ge-sc |
| スマートコントラクトにおける価格つり上げTOD脆弱性の自動監査 | Slitherを使用してCFGとデータ依存性を抽出 | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Repair |
| スマートコントラクトのアクセス制御ポリシーのモデリングと適用 | Slitherのデータ依存性を拡張 | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | IEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022 | SolidityAccessControlEnforcement |
| 深層学習とマルチモーダル決定融合に基づくスマートコントラクト脆弱性検出 | Slitherを使用してCFGを抽出 | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan Hu | Sensors 2023, 23, 7246 | - |
| 意味豊富なコード知識グラフによるスマートコントラクトコード再利用の未知の側面の解明 | Slitherを使用してコード特徴(CFG、関数、パラメータ型など)を抽出 | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | ACM Transactions on Software Engineering and Methodology, 2023 | - |
| 粒度の細かい状態アクセスを備えたスマートコントラクトの並列実行 | Slitherを使用して状態アクセスグラフを構築 | Xiaodong Qi, Jiao Jiao, Yi Li | International Conference on Distributed Computing Systems (ICDCS), 2023 | - |
| Bad Apples: 分散型エコシステムにおける集中化されたセキュリティリスクの理解 | Slither上に内部分析を実装 | Kailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing Guo | ACM Web Conference April 2023 | - |
| 区間分析を用いたスマートコントラクトの脆弱性特定 | Slither上に4つの検出器を作成 | Ştefan-Claudiu Susan, Andrei Arusoaie | FROM 2023 | - |
| イーサリアムブロックチェーンスマートコントラクトのストレージ状態分析と抽出(オープンアクセスのPDFなし) | SlitherのCFGとASTに依存 | Maha Ayub , Tania Saleem , Muhammad Janjua , Talha Ahmad | TOSEM 2023 | SmartMuv |
学術研究で Slither を使用している場合は、Crytic $10k 研究賞 への応募をご検討ください。