サイトアイコン 【TechGrowUp】

Solidity静的解析ツール「Slither」ガイド──インストールから独自ディテクタ実装・CI統合まで網羅

はじめに

スマートコントラクトは不変性こそ最大の長所ですが、同時に「脆弱性を後から修正しづらい」という致命的な短所を抱えています。実際、多くのDeFiハッキング事件が再入可能性整数オーバーフローといった基本的ミスに起因しています。こうした問題を早期に発見する手段として注目されるのが静的解析ツールです。中でも Slither はCrytic(Trail of Bits傘下)が開発し、GitHubスター数3k超を誇る事実上の標準フレームワークになっています。本記事ではリポジトリ https://github.com/crytic/slither を参照しつつ、Slitherの導入から高度な活用法までを解説します。

Slitherの概要

特徴

高速解析の仕組み

SlitherはSolidityコンパイラsolcAST (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-origintx.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

これにより、外部監査前の内部レビューや新人教育が効率化します。

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

Gasレポートと合わせて実行し、セキュリティとコストの両面を同時にチェックできます。

既知の制限と将来ロードマップ

項目現状今後の改善
Yul 支持部分対応Full YulとInline Assembly対応予定
多言語VMSolidityのみVyper ASTを進行中
実行時間大型monorepoで数分マルチプロセス化&キャッシュ導入計画

コミュニティIssueに「EIP‑7201 StorageLayout」チェック追加が提案されており、大規模アップグレードにも対応予定です。

まとめ

Slitherは高速・高精度かつ拡張性が高いSolidity静的解析フレームワークです。標準ディテクタで一般的な脆弱性を網羅しつつ、Python APIで独自ルールを組み込むことで、プロジェクト固有のセキュリティポリシーも自動で検証できます。

これらの手順を踏むことで、スマートコントラクトの信頼性と運用コストを大幅に改善できます。Trail of Bitsの監査レベルの解析を日常的な開発フローへ──それがSlither活用の真価です。

モバイルバージョンを終了