はじめに
スマートコントラクトは不変性こそ最大の長所ですが、同時に「脆弱性を後から修正しづらい」という致命的な短所を抱えています。実際、多くのDeFiハッキング事件が再入可能性や整数オーバーフローといった基本的ミスに起因しています。こうした問題を早期に発見する手段として注目されるのが静的解析ツールです。中でも Slither はCrytic(Trail of Bits傘下)が開発し、GitHubスター数3k超を誇る事実上の標準フレームワークになっています。本記事ではリポジトリ https://github.com/crytic/slither を参照しつつ、Slitherの導入から高度な活用法までを解説します。
Slitherの概要
特徴
- 80種類以上のディテクタ:再入可能性、写像初期化忘れ、tx.origin 誤用などを自動検出
- ゼロ依存インストール:
pip install slither-analyzer
のみ - 詳細メトリクス:関数サイクロマティック複雑度、ガスコスト推定
- Python API:AST/CFG/SSAを取得し、独自解析が可能
- SARIF出力:GitHub Advanced Securityでの可視化に対応
高速解析の仕組み
SlitherはSolidityコンパイラsolc
のAST (Abstract Syntax Tree)をJSONで取得し、内部でStatic Single Assignment (SSA) へ変換します。制御フローグラフ (CFG) を生成し、パターンマッチ+データフロー解析で脆弱性を判断。バイトコード解析型のMythrilに比べ高速で、CIでもタイムアウトしにくいのが利点です。
インストールと基本コマンド
# Python 3.8+
pip install slither-analyzer # グローバル導入
cd my-contracts # Truffle/Hardhat プロジェクト直下
slither . # 全.sol解析
solc-select
で特定バージョンを使う場合
solc-select install 0.8.23
solc-select use 0.8.23
slither . --solc-version 0.8.23
出力例(抜粋)
Reentrancy in MyVault.withdraw(uint256) [ReentrancyInFunctions]
External calls:
- TransferHelper.safeTransfer(...)
State variables written after the call(s):
- balances[msg.sender] = 0
Low level call in …
代表的ディテクタと対策
カテゴリ | ディテクタ名 | 検出内容 | 典型的修正 |
---|---|---|---|
再入可能性 | reentrancy-eth | 外部呼び出し後に状態更新 | Checks-Effects-Interactions パターン |
アクセス制御 | tx-origin | tx.origin の誤用 | msg.sender に置換 |
数学的安全性 | divide-before-multiply | 乗算前の除算で精度損失 | SafeMath or Solidity 0.8 での built‑in チェック |
初期化 | missing-zero-check | コンストラクタでmap[key]==0を前提 | マッピング初期値の明示 |
ガス最適 | costly-loop | ガス高いfor/while | ループ回数制限・イベント分割 |
詳細はslither --list-detectors
で確認すると自動出力されます。
プリンタ(Printers)でコード理解を加速
slither . --print contract-summary
slither . --print function-summary --filter "MyToken"
slither . --print cfg --export-graph cfg.png
- contract-summary:継承関係・関数一覧
- function-summary:呼び出しグラフ、state変数読書一覧
- cfg:Control Flow GraphをGraphVizで可視化
これにより、外部監査前の内部レビューや新人教育が効率化します。
Python APIで独自ディテクタを書く
from slither.slither import Slither
from slither.detectors.abstract_detector import AbstractDetector, DETECTOR_INFO, DetectorClassification
class NoPayable(AbstractDetector):
ARGUMENT = "no-payable"
HELP = "Detect missing payable in public functions"
IMPACT = DetectorClassification.HIGH
CONFIDENCE = DetectorClassification.MEDIUM
@classmethod
def _detect(cls, slither: Slither):
results = []
for contract in slither.contracts:
for func in contract.functions_declared:
if func.visibility == "public" and func.payable:
continue
if "value" in [c.name for c in func.state_variables_written]:
res = cls.generate_result(f"{func.full_name} writes value but is not payable", func.source_mapping)
results.append(res)
return results
python my_detector.py
実行で独自ルールが適用され、社内標準ポリシーの自動チェックが可能になります。
CI/CD統合(GitHub Actions例)
name: Slither
on: [pull_request]
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup
run: |
pip install slither-analyzer
solc-select install 0.8.23 && solc-select use 0.8.23
- name: Run Slither
run: |
slither . --sarif slither.sarif || true
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: slither.sarif
GitHub Advanced Security のUIで脆弱性がPRレビューにインライン表示され、修正フローが高速化します。
高度な活用:Slither in Foundry & Hardhat
- Foundry:
forge install crytic/slither
でビルトイン。一行でforge slither
が実行可。 - Hardhat:
hardhat-slither-plugin
を導入し、コンパイル後フックで解析を自動化。
Gasレポートと合わせて実行し、セキュリティとコストの両面を同時にチェックできます。
既知の制限と将来ロードマップ
項目 | 現状 | 今後の改善 |
---|---|---|
Yul 支持 | 部分対応 | Full YulとInline Assembly対応予定 |
多言語VM | Solidityのみ | Vyper ASTを進行中 |
実行時間 | 大型monorepoで数分 | マルチプロセス化&キャッシュ導入計画 |
コミュニティIssueに「EIP‑7201 StorageLayout」チェック追加が提案されており、大規模アップグレードにも対応予定です。
まとめ
Slitherは高速・高精度かつ拡張性が高いSolidity静的解析フレームワークです。標準ディテクタで一般的な脆弱性を網羅しつつ、Python APIで独自ルールを組み込むことで、プロジェクト固有のセキュリティポリシーも自動で検証できます。
- まずは
pip install slither-analyzer
で導入し、slither .
で現状のバグを洗い出す - GitHub ActionsやFoundry CIに組み込み、開発サイクルの初期段階で脆弱性を捕捉
- 重要ロジックにはカスタムディテクタ+Echidna Fuzzで二重防御
これらの手順を踏むことで、スマートコントラクトの信頼性と運用コストを大幅に改善できます。Trail of Bitsの監査レベルの解析を日常的な開発フローへ──それがSlither活用の真価です。