
自動パッチインテリジェンス&発見フレームワーク
Windows カーネルドライバパッチにおける脆弱性修正を検出するためのセマンティック解析エンジンです。AutoPiff は保守的な YAML ルールを使用し、高い精度と説明可能性でセキュリティ関連のコード変更を特定します。
AutoPiff は脆弱なドライバとパッチ済みドライバの差分を分析し、以下を自動検出します:
ExFreePool 後の NULL 代入)memcpy 前の長さ検証)ProbeForRead/ProbeForWrite)ベンダーリリース: 年間 500 件のドライバ更新
├── 490 件は機能/パフォーマンス/外観の変更
├── 8 件は軽微なバグ修正
└── 2 件はサイレントセキュリティ修正(CVE 未割り当て)
自動化なし: 2 件を見つけるために 500 件を手動レビュー
AutoPiff 使用: 2 件を見つけるために上位 10 件をレビュー
セキュリティパッチはしばしば CVE が割り当てられずにリリースされます。すべてのドライバ更新を手動でリバースエンジニアリングしてセキュリティ関連の変更を見つけるのは現実的ではありません。AutoPiff は自動的に関係する変更を浮き彫りにすることでこの問題を解決します。
合計: ドライバペアあたり 4~12 時間 → 2~5 分
┌─────────────────────────────────────────────────────────────────┐
│ AutoPiff が自動化 │
│ ├── 針を見つける: 「ExFreePool 付近で関数が変更された」 │
│ ├── 分類: 「Use-After-Free 修正のように見える」 │
│ └── ランク付け: 「スコア 5.5 - 調査価値あり」 │
├─────────────────────────────────────────────────────────────────┤
│ 依然として手動(あなたの専門知識) │
│ ├── 悪用可能性の確認: 「実際にトリガーできるか?」 │
│ ├── 根本原因分析: 「なぜ脆弱だったのか?」 │
│ ├── エクスプロイト開発: 「このシンクにどう到達するか?」 │
│ └── 影響評価: 「現実世界のリスクは?」 │
└─────────────────────────────────────────────────────────────────┘
AutoPiff はエクスプロイト研究を代替するものではありません。偵察フェーズを自動化することで、規模を問わず実行可能にします。
1. サイレントパッチ検出
2. 1-Day 脆弱性研究
3. ベンダーセキュリティ監査
4. 過去の CVE コーパス構築
AutoPiff は Karton パイプラインとして動作し、8 つの逐次ステージと並列の DriverAtlas トリアージブランチで構成されます。各ステージは独立したマイクロサービスで、Redis/RabbitMQ を介して通信します。
graph LR
sources["WinBIndex<br/>VirusTotal"]:::src --> s0["Stage 0<br/>Monitor"]
s0 --> s14["Stages 1-4<br/>Patch Differ"]
s0 --> triage["DriverAtlas<br/>Triage"]:::triage
s14 --> s5["Stage 5<br/>Reachability"]
s5 --> s6["Stage 6<br/>Ranking"]
s6 --> s7["Stage 7<br/>Report"]
s6 --> s8["Stage 8<br/>Alerter"]
triage --> alerts["MWDB Tags<br/>+ Alerts"]:::triage
classDef src fill:#1a1a2e,stroke:#e94560,color:#eee
classDef triage fill:#1a1a2e,stroke:#e9a345,color:#eee
classDef default fill:#16213e,stroke:#0f3460,color:#eee
AutoPiff には 22 カテゴリにわたる 58 のルールが含まれています。完全な仕様については Docs/semantic_rules.md を、技術リファレンスについては Docs/SEMANTIC_RULES_REFERENCE.md を参照してください。
ルールエンジンは 8 つのシンクグループにわたって 50 以上の危険な API シンボルを追跡します:
memory_copy: RtlCopyMemory, memcpy, memmovepool_alloc: ExAllocatePool, ExAllocatePoolWithTagpool_free: ExFreePool, ExFreePoolWithTaguser_probe: ProbeForRead, ProbeForWriteio_sanitization: RtlULongAdd, RtlSizeTMultexceptions: __try, __exceptstring_copy: strcpy, wcsncpyrefcounting: InterlockedIncrement/Decrement検出結果は設定可能なモデル(rules/scoring.yaml)を使用してスコアリングされます:
final_score = semantic_score + reachability_bonus + sink_bonus - penalties
スコア構成要素:
ゲーティング:
git clone https://github.com/splintersfury/AutoPiff.git
cd AutoPiff
docker compose up -d
MWDB、ダッシュボード、監視を含む本番スタック全体については、driver_analyzer を参照してください。
pip install pyyaml
from services.karton_patch_differ.rule_engine import SemanticRuleEngine
engine = SemanticRuleEngine('rules/semantic_rules.yaml', 'rules/sinks.yaml')
hits = engine.evaluate(func_name, old_code, new_code, diff_lines)
rules/semantic_rules.yaml を編集してルールを追加または変更します:
rules:
- rule_id: my_custom_rule
category: bounds_check
confidence: 0.85
required_signals:
- sink_group: memory_copy
- change_type: guard_added
- guard_kind: length_check
plain_english_summary: Added length validation before memory copy.
AutoPiff は MWDB サンプルに添付される JSON レポートを生成します:
{
"pairing": {
"driver_new": {"sha256": "...", "version": "2.0.9.0"},
"driver_old": {"sha256": "...", "version": "2.0.8.0"},
"decision": "accept",
"confidence": 0.95
},
"semantic_deltas": {
"deltas": [
{
"function": "HandleIoctl",
"rule_id": "null_after_free_added",
"category": "lifetime_fix",
"confidence": 0.88,
"sinks": ["pool_free"],
"final_score": 5.5,
"why_matters": "Pointer is now set to NULL after freeing memory."
}
],
"summary": {
"total_deltas": 1,
"top_score": 5.5,
"match_rate": 100.0
}
}
}
AutoPiff/
├── Docs/ # 設計ドキュメントと仕様
├── ghidra/scripts/ # Ghidra ヘッドレススクリプト
│ └── autopiff_reachability.py # 到達可能性 BFS + 逆コンパイルエクスポート
├── rules/
│ ├── semantic_rules.yaml # 58 の検出ルール
│ ├── sinks.yaml # 50+ の危険な API シンボル
│ └── scoring.yaml # スコアリングモデル設定
├── schemas/ # 各ステージの JSON スキーマ
├── services/
│ ├── karton-patch-differ/ # ステージ 1-4: 差分 + セマンティック解析
│ ├── karton-reachability/ # ステージ 5: コールグラフ + 逆コンパイル
│ ├── karton-ranking/ # ステージ 6: スコアリング
│ ├── karton-report/ # ステージ 7: レポート生成
│ ├── karton-driver-triage/ # DriverAtlas 攻撃対象領域トリアージ
│ ├── autopiff-alerter/ # ステージ 8: Telegram アラート
│ ├── driver-monitor/ # ステージ 0: バージョンポーリング
│ └── dashboard/ # Web UI
├── tests/unit/ # 137 のユニットテスト
├── docker-compose.yml
└── README.md
AutoPiff は driver_analyzer と連携するように設計されています。driver_analyzer は完全な本番インフラ(MWDB、Karton、MinIO、ダッシュボード)を提供します。driver_analyzer の compose ファイルは AutoPiff サービスを直接ビルドします:
# In driver_analyzer/docker-compose.yml
karton-driver-patch-differ:
build:
context: ../AutoPiff
dockerfile: services/karton-patch-differ/Dockerfile
volumes:
- ../AutoPiff/rules:/app/rules:ro
セットアップ手順については driver_analyzer README を参照してください。
MIT ライセンス - 詳細は LICENSE を参照してください。
| フェーズ | 手動の労力 | AutoPiff 使用時 | 節約時間 |
|---|
| バージョンペアリング | ドライバあたり 5~15 分 | 自動 | 約100% |
| 逆コンパイル | バイナリあたり 2~10 分 | 一括並列処理 | 約95% |
| 関数マッチング | ペアあたり 30~60 分 | 即時 | 約100% |
| セキュリティ変更の特定 | ペアあたり 2~8 時間 | 数秒 | 約99% |
| 初期トリアージとランキング | 1~2 時間 | 即時 | 約100% |
| レポート生成 | 30~60 分 | 即時 | 約100% |
| ステージ | サービス | 説明 |
|---|
| 0 | driver-monitor | WinBIndex と VirusTotal をポーリングして新しいドライババージョンを取得し、MWDB にアップロード |
| 1-4 | karton-patch-differ | バージョンペアリング、Ghidra 逆コンパイル、関数マッチング、セマンティックルール評価 |
| 5 | karton-reachability | Ghidra コールグラフ BFS: IOCTL/IRP エントリポイントから変更された関数まで、完全な逆コンパイルエクスポート |
| 6 | karton-ranking | 到達可能性、セマンティック重大度、攻撃対象領域を使用して検出結果をスコアリング |
| 7 | karton-report | 構造化マークダウンレポートを生成し、MWDB にアップロード |
| 8 | autopiff-alerter | スコア 8.0 以上の検出結果に対して Telegram アラートを送信 |
| — | autopiff-driver-triage | DriverAtlas 攻撃対象領域スコアリング(1-4 と並列)、MWDB サンプルにタグ付け、Telegram アラート |
| カテゴリ | 検出例 |
|---|
bounds_check | memcpy 前に長さチェックが追加された |
lifetime_fix | ExFreePool 後に NULL 代入 |
user_boundary_check | ProbeForRead/ProbeForWrite が追加された |
int_overflow | 安全な算術ヘルパーの使用 |
state_hardening | インターロックド参照カウント操作 |
ioctl_input_validation | ディスパッチハンドラ内で新しいサイズ/型チェック |
pool_type_hardening | NonPagedPoolNx への移行 |
privilege_check | SeSinglePrivilegeCheck の追加 |
| 変数 | 説明 | デフォルト |
|---|
MWDB_API_URL | MWDB Core API エンドポイント | http://mwdb-core:8080/api/ |
MWDB_API_KEY | アップロード用 MWDB API キー | (必須) |
KARTON_REDIS_HOST | Karton 用 Redis ホスト | karton-redis |
AUTOPIFF_GHIDRA_TIMEOUT | Ghidra 逆コンパイルのタイムアウト (秒) | 900 |
VT_API_KEY | ドライバ監視用 VirusTotal API キー | (省略可) |
TELEGRAM_BOT_TOKEN | アラート用 Telegram ボットトークン | (省略可) |
TELEGRAM_CHAT_ID | アラート送信先 Telegram チャット | (省略可) |
AUTOPIFF_SCORE_THRESHOLD | Telegram アラートの最小スコア | 8.0 |
DRIVERATLAS_SCORE_THRESHOLD | トリアージアラートの最小攻撃対象領域スコア | 8.0 |
| ドキュメント | 説明 |
|---|
Docs/semantic_rules.md | セマンティックルール仕様: ルールの構造と各カテゴリの検出内容 |
Docs/SEMANTIC_RULES_REFERENCE.md | ルールエンジン、評価ロジック、スコアリングの技術リファレンス |
Docs/reachability.md | 到達可能性タグ付け仕様: ディスパッチエントリポイントからのコールグラフ BFS |
Docs/reporting.md | レポート出力の仕様と形式 |
Docs/decisions.md | 設計上の決定と根拠のログ |
rules/semantic_rules.yaml | 58 すべての検出ルール (YAML) |
rules/sinks.yaml | 50 以上の危険な API シンボル(カテゴリ別にグループ化) |
rules/scoring.yaml | スコアリングモデル設定 |
schemas/ | 各パイプラインステージ出力用 JSON スキーマ |