Empire Hacking Slack に参加しましょう
- ディスカッションとサポート
Slither は、Python3 で書かれた Solidity & Vyper 静的分析フレームワークです。一連の脆弱性検出機能を実行し、契約の詳細に関する視覚的な情報を出力し、カスタム分析を簡単に作成するための API を提供します。 Slither を使用すると、開発者は脆弱性を発見し、コードの理解を強化し、カスタム分析のプロトタイプを迅速に作成できます。
Hardhat/Foundry/Dapp/Brownie アプリケーションで Slither を実行します。
slither .
Slither は基礎となるコンパイル フレームワークに依存してソース コードをコンパイルするため、プロジェクトに依存関係がある場合は、これが推奨されるオプションです。
ただし、依存関係をインポートしない単一のファイルに対して Slither を実行することはできます。
slither tests/uninitialized.sol
注記
Slither には Python 3.8 以降が必要です。サポートされているコンパイル フレームワークを使用しない場合は、Solidity コンパイラである solc が必要です。 solc バージョンを簡単に切り替えるには、solc-select を使用することをお勧めします。
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
git 経由で Slither をインストールする場合は、開発者向けインストール手順で詳しく説明されているように、Python 仮想環境を使用することをお勧めします。
eth-security-toolbox
Docker イメージを使用します。これには、すべてのセキュリティ ツールと Solidity のすべてのメジャー バージョンが 1 つのイメージに含まれています。 /home/share
コンテナ内の/share
にマウントされます。
docker pull trailofbits/eth-security-toolbox
コンテナ内のディレクトリを共有するには:
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
実際のタグに置き換えます) を使用します。 - repo : https://github.com/crytic/slither
rev : $GIT_TAG
hooks :
- id : slither
slither [target] --checklist
使用します。slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/
( ORG
、 REPO
、 COMMIT
置き換えます) を使用します。 番号 | 検出器 | 検出するもの | インパクト | 自信 |
---|---|---|---|---|
1 | abiencoderv2-array | ストレージ abiancoderv2 配列 | 高い | 高い |
2 | arbitrary-send-erc20 | transferFrom は任意のfrom を使用します | 高い | 高い |
3 | array-by-reference | 値によるストレージ配列の変更 | 高い | 高い |
4 | encode-packed-collision | ABI エンコードパックドコリジョン | 高い | 高い |
5 | incorrect-shift | シフト命令のパラメータの順序が正しくありません。 | 高い | 高い |
6 | multiple-constructors | 複数のコンストラクター スキーム | 高い | 高い |
7 | name-reused | 契約名を再利用 | 高い | 高い |
8 | protected-vars | 保護されていない変数が検出されました | 高い | 高い |
9 | public-mappings-nested | ネストされた変数を使用したパブリック マッピング | 高い | 高い |
10 | rtlo | Right-To-Left-Override 制御文字が使用されています | 高い | 高い |
11 | shadowing-state | 状態変数のシャドウイング | 高い | 高い |
12 | suicidal | 誰でも契約を破棄できる機能 | 高い | 高い |
13 | uninitialized-state | 初期化されていない状態変数 | 高い | 高い |
14 | uninitialized-storage | 初期化されていないストレージ変数 | 高い | 高い |
15 | unprotected-upgrade | 保護されていないアップグレード可能な契約 | 高い | 高い |
16 | codex | Codex を使用して脆弱性を見つけます。 | 高い | 低い |
17 | arbitrary-send-erc20-permit | transferFrom は許可付きで任意の from を使用します | 高い | 中くらい |
18 | arbitrary-send-eth | 任意の宛先にイーサを送信する機能 | 高い | 中くらい |
19 | controlled-array-length | 汚染された配列の長さの割り当て | 高い | 中くらい |
20 | controlled-delegatecall | 制御されたデリゲートコール宛先 | 高い | 中くらい |
21 | delegatecall-loop | ループ内でdelegatecall 使用する Payable 関数 | 高い | 中くらい |
22 | incorrect-exp | 間違ったべき乗 | 高い | 中くらい |
23 | incorrect-return | アセンブリモードでreturn が誤って使用された場合。 | 高い | 中くらい |
24 | msg-value-loop | ループ内の msg.value | 高い | 中くらい |
25 | reentrancy-eth | リエントランシーの脆弱性 (イーサの盗難) | 高い | 中くらい |
26 | return-leave | leave の代わりにreturn が使用される場合。 | 高い | 中くらい |
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 | イーサをロックするコントラクト | 中くらい | 高い |
36 | mapping-deletion | 構造体を含むマッピングの削除 | 中くらい | 高い |
37 | shadowing-abstract | 抽象コントラクトからシャドウイングされる状態変数 | 中くらい | 高い |
38 | tautological-compare | 変数をそれ自体と比較すると、比較に応じて常に true または false が返されます。 | 中くらい | 高い |
39 | tautology | トートロジーまたは矛盾 | 中くらい | 高い |
40 | write-after-write | 未使用書き込み | 中くらい | 高い |
41 | boolean-cst | ブール定数の誤用 | 中くらい | 中くらい |
42 | constant-function-asm | アセンブリコードを使用した定数関数 | 中くらい | 中くらい |
43 | constant-function-state | 状態を変更する定数関数 | 中くらい | 中くらい |
44 | divide-before-multiply | 不正確な算術演算順序 | 中くらい | 中くらい |
45 | out-of-order-retryable | アウトオブオーダーの再試行可能なトランザクション | 中くらい | 中くらい |
46 | reentrancy-no-eth | リエントランシーの脆弱性 (イーサの盗難なし) | 中くらい | 中くらい |
47 | reused-constructor | 再利用された基本コンストラクター | 中くらい | 中くらい |
48 | tx-origin | tx.origin の危険な使用法 | 中くらい | 中くらい |
49 | unchecked-lowlevel | 未チェックの低レベル呼び出し | 中くらい | 中くらい |
50 | unchecked-send | チェックされていない送信 | 中くらい | 中くらい |
51 | uninitialized-local | 初期化されていないローカル変数 | 中くらい | 中くらい |
52 | unused-return | 未使用の戻り値 | 中くらい | 中くらい |
53 | incorrect-modifier | デフォルト値を返すことができる修飾子 | 低い | 高い |
54 | shadowing-builtin | 組み込みのシンボルシャドウイング | 低い | 高い |
55 | shadowing-local | ローカル変数のシャドウイング | 低い | 高い |
56 | uninitialized-fptr-cst | コンストラクターでの初期化されていない関数ポインター呼び出し | 低い | 高い |
57 | variable-scope | 宣言前に使用されるローカル変数 | 低い | 高い |
58 | void-cst | 呼び出されたコンストラクターは実装されていません | 低い | 高い |
59 | calls-loop | ループ内の複数の呼び出し | 低い | 中くらい |
60 | events-access | 欠落しているイベントのアクセス制御 | 低い | 中くらい |
61 | events-maths | 欠落イベントの算術演算 | 低い | 中くらい |
62 | incorrect-unary | 危険な単項式 | 低い | 中くらい |
63 | missing-zero-check | 欠落ゼロアドレスの検証 | 低い | 中くらい |
64 | reentrancy-benign | 良性の再入可能脆弱性 | 低い | 中くらい |
65 | reentrancy-events | 異常なイベントを引き起こす再入可能性の脆弱性 | 低い | 中くらい |
66 | return-bomb | 低レベルの呼び出し先は、すべての呼び出し元のガスを予期せず消費する可能性があります。 | 低い | 中くらい |
67 | timestamp | block.timestamp の危険な使用法 | 低い | 中くらい |
68 | assembly | 組み立て用途 | 情報提供 | 高い |
69 | assert-state-change | 状態変化をアサート | 情報提供 | 高い |
70 | boolean-equal | ブール定数との比較 | 情報提供 | 高い |
71 | cyclomatic-complexity | 循環的複雑度が高い (> 11) 関数を検出します | 情報提供 | 高い |
72 | deprecated-standards | 廃止されたSolidity標準 | 情報提供 | 高い |
73 | erc20-indexed | インデックスのない ERC20 イベント パラメーター | 情報提供 | 高い |
74 | function-init-state | 状態変数を初期化する関数 | 情報提供 | 高い |
75 | incorrect-using-for | 指定されたライブラリの関数が指定された型に一致しない場合に、using-for ステートメントの使用を検出します。 | 情報提供 | 高い |
76 | low-level-calls | 低レベルの呼び出し | 情報提供 | 高い |
77 | missing-inheritance | 継承の欠落 | 情報提供 | 高い |
78 | naming-convention | Solidity の命名規則への準拠 | 情報提供 | 高い |
79 | pragma | 異なるプラグマ ディレクティブが使用されている場合 | 情報提供 | 高い |
80 | redundant-statements | 冗長なステートメント | 情報提供 | 高い |
81 | solc-version | 間違った Solidity バージョン | 情報提供 | 高い |
82 | unimplemented-functions | 未実装の機能 | 情報提供 | 高い |
83 | unused-import | 未使用のインポートを検出します | 情報提供 | 高い |
84 | unused-state | 未使用の状態変数 | 情報提供 | 高い |
85 | costly-loop | ループ内のコストのかかる操作 | 情報提供 | 中くらい |
86 | dead-code | 使われない機能 | 情報提供 | 中くらい |
87 | reentrancy-unlimited-gas | 送信と転送による再入の脆弱性 | 情報提供 | 中くらい |
88 | too-many-digits | 数値表記のベストプラクティスへの準拠 | 情報提供 | 中くらい |
89 | cache-array-length | ループ条件で一部のストレージ配列のlength メンバーを使用し、それを変更しないfor ループを検出します。 | 最適化 | 高い |
90 | constable-states | 定数として宣言できる状態変数 | 最適化 | 高い |
91 | external-function | 外部宣言できるパブリック関数 | 最適化 | 高い |
92 | immutable-states | 不変として宣言できる状態変数 | 最適化 | 高い |
93 | var-read-using-this | コントラクトはthis 使用して独自の変数を読み取ります | 最適化 | 高い |
詳細については、を参照してください。
human-summary
: 人間が判読できる契約の概要を出力します。inheritance-graph
: 各コントラクトの継承グラフをドット ファイルにエクスポートします。contract-summary
: 契約の概要を出力します。loc
: ソース ファイル (SRC)、依存関係 (DEP)、およびテスト ファイル (TEST) に含まれるコードの行数 (LOC)、コードのソース行数 (SLOC)、およびコードのコメント行数 (CLOC) の合計数をカウントします。call-graph
: コントラクトのコールグラフをドットファイルにエクスポートします。cfg
: 各関数のCFGをエクスポートfunction-summary
: 関数の概要を出力します。vars-and-auth
: 書き込まれた状態変数と関数の認可を出力します。not-pausable
: whenNotPaused
修飾子を使用しない関数を出力します。プリンターを実行するには、 --print
とプリンターのカンマ区切りリストを使用します。
完全なリストについては、プリンターのマニュアルを参照してください。
slither-check-upgradeability
: delegatecall
ベースのアップグレード可能性を確認するslither-prop
: 単体テストとプロパティの自動生成slither-flat
: コードベースを平坦化するslither-check-erc
: ERC の適合性をチェックするslither-format
: 自動パッチ生成slither-read-storage
: コントラクトからストレージ値を読み取りますslither-interface
: コントラクトのインターフェースを生成します追加のツールについては、ツールのドキュメントを参照してください。
カスタム ツールの構築に関するサポートが必要な場合は、お問い合わせください。
Slither の内部に関するドキュメントはここから入手できます。
Slither の使用または拡張に関するヘルプが必要な場合は、お気軽に Slack チャネル (#ethereum) にお立ち寄りください。
プリンターのドキュメントには、Slither が各契約について視覚化できる情報が説明されています。
Detector のドキュメントには、新しい脆弱性分析を作成する方法が説明されています。
API ドキュメントでは、カスタム分析に使用できるメソッドとオブジェクトについて説明します。
SlithIR ドキュメントでは、SlithIR 中間表現について説明しています。
モックやテストを除外するにはどうすればよいですか?
「不明なファイル」またはコンパイルの問題を解決するにはどうすればよいですか?
slither contract.sol
失敗します。代わりに、 slither .
contracts/
の親ディレクトリ内 ( ls
を実行するとcontracts/
表示されるはずです)。 node_modules/
フォルダーがある場合は、 contracts/
と同じディレクトリーに存在する必要があります。この問題が Srither に関連していることを確認するには、使用しているフレームワークのコンパイル コマンド (例: npx hardhat compile
を実行します。それはうまく機能するはずです。そうしないと、slither のコンパイル エンジンである cretic-compile が AST を生成できません。 Slither は AGPLv3 ライセンスに基づいてライセンス供与され、配布されています。規約の例外をご希望の場合は、お問い合わせください。
タイトル | 使用法 | 著者 | 会場 | コード |
---|---|---|---|---|
拒否: AST ベースの再入可能脆弱性検出方法 | Slither 上に構築された AST ベースの分析 | Rui Ma、Zefeng Jian、Guangyuan Chen、Ke Ma、Yujia Chen | CTCIS 19 | - |
MPro: 静的解析とシンボリック解析を組み合わせてスマート コントラクトのスケーラブルなテストを行う | Slither を通じてデータの依存関係を活用する | ウィリアム・チャン、セバスチャン・バネスク、レオダルド・パソス、スティーヴン・スチュワート、ビジェイ・ガネーシュ | ISSRE2019 | Mプロ |
ETHPLOIT: ファジングからスマート コントラクトに対する効率的なエクスプロイト生成まで | Slither を通じてデータの依存関係を活用する | Qingzhao Zhang、Yizhuo Wang、Juanru Li、Siqi Ma | ザーナー 20 | - |
イーサリアム スマート コントラクトの検証: モデル チェック アプローチ | Slither の CFG 上に構築されたシンボリック実行 | タム・バン、ホアン・H・グエン、ズン・グエン、トアン・トリウ、トー・クアン | IJMLC 20 | - |
スマートコントラクトの修復 | Slither の脆弱性検出機能に頼る | シャオ・リャン・ユー、オマール・アル・バタイネ、デヴィッド・ロー、アビク・ロイチョードリー | トーセム20 | SC修理 |
スマートコントラクトのループをわかりやすくする | Slither を通じてデータの依存関係を活用する | ベン・マリアーノ、ヤンジュ・チェン、ユー・フェン、シュベンドゥ・ラヒリ、イシル・ディリグ | ASE20 | - |
スマートコントラクトにおけるループのトレースベースの動的ガス推定 | Slither の CFG を使用してループを検出する | Chunmiao Li、Shijie Nie、Yang Cao、Yijun Yu、Zhenjiang Hu | IEEE オープン J. コンピューティング。社会1 (2020) | - |
SAILFISH: スマート コントラクトの状態不一致のバグを数秒で検査 | SlithIR を利用してストレージ依存関係グラフを構築する | プリヤンカー・ボース、ディパンジャン・ダス、ヤンジュ・チェン、ユー・フェン、クリストファー・クルーゲル、ジョバンニ・ヴィーニャ | S&P22 | バショウカジキ |
SolType: Solidity の算術オーバーフローの改良タイプ | フロントエンドとして Slither を使用してリファインメント型システムを構築する | ブライアン・タン、ベンジャミン・マリアーノ、シュヴェンドゥ・K・ラヒリ、イシル・ディリグ、ユー・フェン | ポプラ22 | - |
Do Not Rug on Me: 機械学習技術を活用した自動詐欺検出 | Slither を使用してトークンの機能 (ミント可能、一時停止可能など) を抽出します。 | マゾーラ、ブルーノ、ビクター・アダン、ヴァネサ・ダザ | 数学 10.6 (2022) | - |
MANDO: スマート コントラクトの脆弱性をきめ細かく検出するためのマルチレベル異種グラフ埋め込み | Slither を使用して CFG を抽出し、グラフを呼び出します | ホアン・グエン、ニャット・ミン・グエン、チュンヤオ・シェ、ザーラ・アフマディ、ダニエル・クデンド、タイン・ナム・ドアン、リンシャオ・ジャン | データ サイエンスと高度な分析に関する IEEE 第 9 回国際会議 (DSAA、2022 年) | ge-sc |
スマートコントラクトにおける価格つり上げTOD脆弱性の自動監査 | Slither を使用して CFG とデータの依存関係を抽出する | シディ・モハメド・ベイラヒ、エリック・ケイルティ、キールティ・ネラトゥル、アンドレアス・ヴェネリス、ファン・ロン | 2022 ブロックチェーンと暗号通貨に関する IEEE 国際会議 (ICBC) | スマートコントラクトの修復 |
スマートコントラクトのアクセス制御ポリシーのモデル化と適用 | Slither のデータ依存関係を拡張する | ヤン=フィリップ・トーベルグ、ヨナス・シフル、フレデリック・ライヒェ、ベルンハルト・ベッケルト、ロベルト・ハインリヒ、ラルフ・ロイスナー | 分散型アプリケーションおよびインフラストラクチャに関する IEEE 国際会議 (DAPPS)、2022 年 | Solidityアクセス制御の実施 |
深層学習とマルチモーダル意思決定融合に基づくスマート コントラクトの脆弱性検出 | Slither を使用して CFG を抽出する | 鄧偉忠、魏桓春、黄騰、宋操、尹鵬、玄胡 | センサー 2023、23、7246 | - |
セマンティック強化されたコードナレッジグラフでスマートコントラクトコードの再利用における不明点を明らかにする | Slither を使用してコードの機能 (CFG、関数、パラメーターの種類など) を抽出します。 | Qing Huang、Dianshu Liao、Zhenchang Xing、Zhengkang Zuo、Changjing Wang、Xin Xia | ソフトウェアエンジニアリングおよび方法論に関する ACM トランザクション、2023 年 | - |
きめ細かい状態アクセスによるスマート コントラクトの並列実行 | Slither を使用して状態アクセス グラフを構築する | シャオドン・チー、ジャオ・ジャオ、イー・リー | 分散コンピューティング システムに関する国際会議 (ICDCS)、2023 年 | - |
Bad Apples: 分散型エコシステムにおける集中型セキュリティ リスクを理解する | Slither 上に内部分析を実装する | ヤン・ケイルン、ジャン・ジリアン、リウ・シャンユー、ディアオ・ウェンルイ、郭シャンチン | ACM Web カンファレンス 2023 年 4 月 | - |
間隔分析を使用したスマート コントラクトの脆弱性の特定 | Slither の上に 4 つの検出器を作成する | シュテファン=クラウディウ・スーザン、アンドレイ・アルソアイエ | 2023年から | - |
ストレージ状態の分析とイーサリアム ブロックチェーン スマート コントラクトの抽出 (オープン アクセスの PDF なし) | Slither の CFG と AST に頼る | マハ・アユブ、タニア・サリーム、ムハマド・ジャンジュア、タルハ・アハマド | トーセム2023 | スマートマヴ |
学術研究で Slither を使用している場合は、Crytic の 10,000 ドル研究賞への応募を検討してください。