Foundryスマートコントラクトセキュリティ監査 は何をしますか?
概要
デプロイされたスマートコントラクトは不変であり、実際の資金を管理するため、メインネットに送信されたバグは修正できず、悪用されるだけです。壊滅的なDeFiの損失のほとんどは、リエントランシー、アクセス制御の破損、オラクル/価格操作、未チェックの算術演算や外部呼び出しといった、少数の繰り返し発生するクラスに起因します。
このスキルは、Foundryプロジェクトに対して多層防御のプリデプロイ監査を実行し、互いに見逃すものを補完し合う4つの独立した手法を階層化します。
- 静的解析 —
slither(90以上の検出器)とaderyn(Cyfrin、Rust)がAST/IRを数秒でスキャンし、既知のアンチパターンを検出します。 - シンボリック実行 —
mythril(オプション、低速)が実行パスを探索し、SMTソルバーで深い算術/リエントランシーバグを解決します。 - プロパティベーステスト — ファジング(
testFuzz_*)と不変条件テスト(invariant_*+ ゴースト変数を持つハンドラーコントラクト)を使用したforge testで、プロトコルレベルのプロパティが数百万のランダムシーケンスにわたって成立することを証明します。 - 手動レビュー + キー衛生 — 構造化チェックリスト(
references/vulnerability-checklist.mdを参照)とシークレット/キーストア監査により、秘密鍵が平文で存在することはなく、デプロイは暗号化されたcastキーストアを介して行われます(references/secure-deployment-and-keys.mdを参照)。
このスキルは開発者側、デプロイ前に使用されます。インシデント後のSOCではなく、コントラクトを構築するエンジニアが実行します。発見事項がデプロイをゲートします。高/重大な静的検出、テスト失敗、漏洩した鍵、または低カバレッジがあると、FAILとなります。
使用すべきタイミング
- 任意のSolidityコントラクトをテストネットまたはメインネットEVMチェーンにデプロイする前。
- Foundryプロジェクト(
foundry.toml、src/、test/、script/)を作成またはレビューするとき。 - コントラクトが価値を扱う場合:トークン(ERC-20/721/1155)、ボールト、ステーキング、AMM、ブリッジ、ガバナンス。
- ファズテストや不変条件テストを追加する場合、または価値移動関数のカバレッジが不明な場合。
- デプロイスクリプトを作成するとき — 鍵が暗号化されたキーストアにあり、
.envのプレーンテキストではないことを確認するため。 - 価格オラクル、外部呼び出し、
delegatecall、またはアップグレード可能なプロキシを統合するとき。 - Slither/Aderynのレポートをトリアージし、実際のバグと誤検知を区別する必要があるとき。
前提条件
- Foundryがインストールされていること(
forge、cast、anvil):curl -L https://foundry.paradigm.xyz | bash && foundryup - Slither + solc:
pip install slither-analyzerおよびsolc-select install <ver> && solc-select use <ver> - Aderyn(推奨):
cargo install aderyn(またはnpm i -g @cyfrin/aderyn) - Mythril(オプション、低速なシンボリック実行):
pip install mythril - gitleaks(キー漏洩スキャン):付属の
implementing-secret-scanning-with-gitleaksスキルを参照 - コンパイルが通るFoundryプロジェクト(
forge buildが成功)— アナライザにはビルドアーティファクトが必要です。 - Solidity ^0.8.xを想定(組み込みのオーバーフローチェック付き);0.8より前のコントラクトは追加のSafeMathレビューが必要です。
Pythonツールは仮想環境(virtualenv)にインストールすることを推奨します(外部管理ディストリビューションの場合)。資金がロック解除されたウォレットが存在するマシンで、信頼できないコントラクトソースに対して解析を実行しないでください。
手順
ステップ1:プロジェクトのビルドと健全性チェック
forge build # アナライザは最新のアーティファクトを必要とします
forge fmt --check # スタイルゲート(オプション)
cat foundry.toml # solcバージョン、オプティマイザー、リマッピング、evm_versionを確認
ステップ2:静的解析(高速、毎回実行)
# Slither — プロジェクト全体(foundry.toml + remappingsを自動的に使用)
slither . --json slither-report.json
# Aderyn — Cyfrin Rustアナライザ、補完的な検出器
aderyn . -o aderyn-report.json
または、両方を実行し、重複を排除し、結果をゲートするバンドルされたオーケストレーターを実行します:
python3 scripts/agent.py --project . --output audit-report.json
ステップ3:クリティカルなコントラクトのシンボリック実行(オプション、低速)
# 最も価値の高いコントラクトのみ — Mythrilはパス爆発を起こします
myth analyze src/Vault.sol --solc-json mythril.config.json --execution-timeout 300 -o json
# または:python3 scripts/agent.py --project . --mythril src/Vault.sol
ステップ4:プロパティベーステスト — ファズ + 不変条件
forge test -vvv # ユニット + ファズテスト
forge coverage --report summary # 価値移動コードのカバレッジ
forge test --match-test invariant_ -vvv # 不変条件スイート(ハンドラーベース)
価値を扱うすべてのコントラクトには、ハンドラーを使った不変条件テスト(制限付き入力、ゴースト変数、targetContract(handler))が必要です。単なるユニットテストではありません。ハンドラーパターンについては references/api-reference.md を参照し、各アクセス制御ガードに対して test_RevertWhen_*(vm.expectRevert付き)を作成してください。
ステップ5:チェックリストに基づく手動レビュー
すべてのコントラクトについて references/vulnerability-checklist.md を確認してください:リエントランシー(checks-effects-interactions / nonReentrant)、アクセス制御、オラクル操作、delegatecall/プロキシストレージレイアウト、未チェックの戻り値、tx.origin、弱いランダム性、DoS、フロントランニング/MEV、およびERC固有の落とし穴(approve race、fee-on-transfer、rebasing)。
ステップ6:キー衛生と安全なデプロイ
gitleaks detect --no-banner # 秘密鍵/ニーモニック/.envがコミットされていないこと
git ls-files | grep -E '\.env$|keystore' && echo "WARN: secrets tracked by git"
# デプロイキーを暗号化されたキーストアに一度だけインポート — 平文のPRIVATE_KEY環境変数は使用しない
cast wallet import deployer --interactive
# キーストアアカウントを使用してデプロイ(最初にテストネット)、--broadcastの前にシミュレーション
forge script script/Deploy.s.sol --account deployer --rpc-url <testnet> --broadcast --verify
完全な強化ルール(MetaMask衛生、メインネット用ハードウェアウォレット、RPC信頼、デプロイ後検証)については references/secure-deployment-and-keys.md を参照してください。
ステップ7:トリアージとレポート
Slither + Aderyn + Mythril + テスト結果を結合し、(ファイル、行)で重複を排除し、確認された誤検知を削除し、悪用可能性×財務影響でランク付けし、各発見事項をSWC IDにマッピングします。オーケストレーターはPASS/FAILゲートを含む audit-report.json を出力します。
期待される出力
発見事項にSWC識別子、重大度、ツールソース、影響を受けるコントラクト/関数/行、および推奨される修正措置を含むJSON監査レポート。さらに、テスト/カバレッジの要約と単一のPASS / FAILデプロイゲート。高/重大な静的検出、テスト失敗、漏洩したシークレット、または価値移動コードの設定されたしきい値を下回るカバレッジがある場合はFAILとなります。