vulnhunter について
VulnHunterは、開発者や監査担当者向けのセキュリティレビュー用スキルです。危険なAPIや設定を確認し、パターン検索でコードベース内の類似脆弱性を探します。
主な機能
- 01危険なAPIとデフォルト設定を検出
- 02言語固有の危険な実装パターンを確認
- 03脆弱性の類似事例を検索
- 04grepやASTベースの検索を利用
- 05発見事項と修正案をレポートに整理
活用シーン
- 01コードのセキュリティ上の落とし穴を確認
- 02既知の不具合に類似する事例を検索
- 03監査前に未知のコードベースを調査
- 04セキュリティ報告の発見事項を整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sendaifun/ skills --skill vulnhunterインストール後、Claude Code で/vulnhunterを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/methodology.mdexamples/smart-contracts/reentrancy-hunt.mdexamples/web-apps/sql-injection-hunt.mdresources/sharp-edges-catalog.mdvariant-patterns.mdtemplates/variant-report.md詳細
VulnHunter - セキュリティ脆弱性の検出と分析
危険な API、落とし穴になりやすいパターン、エラーを招きやすい設定を特定し、コードベース全体から脆弱性の亜種を探し出すための包括的なセキュリティ監査スキルです。Trail of Bits の sharp-edges および variant-analysis の手法に着想を得ています。
概要
VulnHunter は、次の 2 つの強力なセキュリティ分析手法を組み合わせています。
- 落とし穴の検出 - エラーを招きやすい API、危険なデフォルト値、落とし穴になりやすい設計を特定します
- 亜種分析 - パターンベースの分析を使って、コードベース全体から類似する脆弱性を探します
VulnHunter を使う場面
次の場合にこのスキルを有効にします。
- セキュリティコードレビューや監査を実施するとき
- 危険なパターンがないか、サードパーティの依存関係をレビューするとき
- 既知の脆弱性の亜種を探すとき
- API 設計にセキュリティ上の落とし穴がないか評価するとき
- 不慣れなコードベースの監査前の予備調査を行うとき
落とし穴の検出
落とし穴のカテゴリ
1. 危険なデフォルト設定
デフォルトで安全でない設定を探します。
- CORS: Access-Control-Allow-Origin: *
- Debug modes enabled in production
- Default credentials or API keys
- Permissive file permissions (777, 666)
- SSL/TLS verification disabled
- Insecure deserialization settings
2. エラーを招きやすい API
メモリー安全性:
// Dangerous: No bounds checking
strcpy(), strcat(), sprintf(), gets()
memcpy() without size validation
// Safer alternatives
strncpy(), strncat(), snprintf(), fgets()
memcpy_s() with explicit size
暗号化の落とし穴:
- ECB mode encryption
- MD5/SHA1 for security purposes
- Hardcoded IVs or salts
- Custom crypto implementations
- Random without CSPRNG (Math.random for tokens)
並行処理の問題:
- Race conditions in file operations
- Time-of-check to time-of-use (TOCTOU)
- Double-checked locking anti-patterns
- Non-atomic increment/decrement operations
3. 言語固有の落とし穴
JavaScript/TypeScript:
// Dangerous patterns
eval(), new Function(), setTimeout(string)
innerHTML, outerHTML, document.write()
Object.assign() for deep clone (shallow only!)
== instead of === (type coercion)
Python:
# Dangerous patterns
pickle.loads(untrusted) # RCE vector
yaml.load(untrusted) # Use safe_load
exec(), eval()
os.system(), subprocess with shell=True
Rust:
// Patterns requiring extra scrutiny
unsafe { }
.unwrap() in production code
mem::transmute()
raw pointer dereference
Solidity/スマートコントラクト:
// High-risk patterns
tx.origin for authentication // Phishing vulnerable
delegatecall to untrusted // Storage collision
selfdestruct // Permanent destruction
block.timestamp for randomness // Miner manipulable
落とし穴のチェックリスト
コードをレビューする際は、次の点を体系的に確認します。
- 認証のバイパス - 認証チェックの欠落、デフォルトの認証情報
- 認可の不備 - 権限昇格、IDOR のパターン
- インジェクションの経路 - SQL、コマンド、テンプレート、XSS
- 暗号化の弱点 - 脆弱なアルゴリズム、不適切な鍵の取り扱い
- リソース枯渇 - 上限のないループ、メモリー割り当て
- 競合状態 - TOCTOU、並行した状態変更
- 情報漏えい - 詳細すぎるエラー、デバッグ用エンドポイント
- デシリアライズ - 信頼できないデータのアンマーシャリング
- パストラバーサル - ユーザーが制御するファイルパス
- SSRF の経路 - ユーザーが制御する URL、リダイレクト
亜種分析
亜種を探すプロセス
- 根本原因を特定する - 脆弱性が存在する理由を理解します
- パターンを抽出する - どのようなコード構造が脆弱性を可能にしているかを特定します
- パターンを一般化する - 正規表現または AST パターンを作成します
- コードベースを検索する - 類似する構造を探します
- 検出結果を検証する - 各亜種が実際に悪用可能であることを確認します
パターン抽出テンプレート
テンプレート 1:検証不足のパターン
Original bug: User input flows to SQL query without sanitization
Pattern: [user_input] -> [sink_function] without [validation_function]
Search for:
- Direct database calls with string concatenation
- ORM raw query methods with user parameters
- Similar data flows in adjacent modules
テンプレート 2:認証のバイパス
Original bug: Endpoint missing auth middleware
Pattern: Route definition without auth decorator/middleware
Search for:
- Routes defined after the vulnerable one
- Similar API patterns in other modules
- Admin/internal endpoints
テンプレート 3:競合状態
Original bug: Check-then-act without atomicity
Pattern: if (check_condition()) { act_on_condition() }
Search for:
- File existence checks followed by file operations
- Permission checks followed by privileged actions
- Balance checks followed by transfers
検索戦略
Grep ベースの検索
# Find potential SQL injection
grep -rn "execute.*%s" --include="*.py"
grep -rn "query.*\+" --include="*.js"
# Find dangerous deserialize
grep -rn "pickle.loads\|yaml.load\|eval(" --include="*.py"
# Find command injection vectors
grep -rn "os.system\|subprocess.*shell=True" --include="*.py"
セマンティック検索(AST ベース)
より正確に一致させるには、AST ベースのツールを使います。
- Semgrep - 言語横断のセマンティック grep
- CodeQL - GitHub のセマンティック分析
- tree-sitter - 汎用パーサー
亜種分析レポートのテンプレート
## Variant Analysis Report
### Original Finding
- **ID**: FINDING-001
- **Severity**: High
- **Root Cause**: [Description]
- **Affected File**: path/to/file.ext:line
### Pattern Extracted
[Code pattern or regex]
### Variants Discovered
| # | Location | Severity | Status | Notes |
|---|----------|----------|--------|-------|
| 1 | file.ext:42 | High | Confirmed | Same root cause |
| 2 | other.ext:100 | Medium | Suspected | Needs validation |
### Recommendations
[Systematic fix approach]
ワークフロー
フェーズ 1:予備調査
- 技術スタックと言語を特定します
- エントリーポイント(API、CLI、ファイル入力)を洗い出します
- 認証/認可のロジックを特定します
- 暗号処理を見つけます
- 外部連携を特定します
フェーズ 2:落とし穴のスキャン
- 落とし穴のチェックリストを一通り確認します
- セキュリティ上重要な経路に注目します
- 疑わしいパターンをすべて記録します
- 既知の CVE と照合します
フェーズ 3:亜種の探索
- 検出事項ごとにパターンを抽出します
- 体系的に亜種を検索します
- 亜種の可能性があるものをそれぞれ検証します
- リスク全体を評価します
フェーズ 4:レポート
- 検出事項をカテゴリごとにまとめます
- 深刻度を割り当てます
- 修正方法を提示します
- システム全体に関わる問題を明示します
静的解析との統合
一般的なパターン向けの Semgrep ルール
# Example: Detect SQL injection in Python
rules:
- id: sql-injection-format
patterns:
- pattern: $CURSOR.execute($QUERY % ...)
message: "Potential SQL injection via string formatting"
severity: ERROR
languages: [python]
CodeQL クエリ
// Find tainted data flowing to dangerous sinks
import python
import semmle.python.dataflow.TaintTracking
from DataFlow::PathNode source, DataFlow::PathNode sink
where TaintTracking::localTaint(source.getNode(), sink.getNode())
and sink.getNode().asExpr().(Call).getTarget().getName() = "execute"
select sink, source, sink, "Tainted input reaches SQL execution"
例
/examples フォルダーには、次の内容があります。
- 言語ごとの実際の落とし穴の例
- 亜種分析の事例
- パターン抽出の手順を解説するガイド
リソース
resources/sharp-edges-catalog.md- 危険なパターンの包括的なカタログresources/variant-patterns.md- 一般的な脆弱性パターンのテンプレートtemplates/variant-report.md- バリアント分析用のレポートテンプレート
ガイドライン
- 必ず検証する - 理論上の問題を、確認済みの脆弱性として報告しないでください
- コンテキストが重要です - あるコンテキストでは安全なパターンでも、別のコンテキストでは危険な場合があります
- 悪用可能性を優先する - 実際の影響につながるパターンに重点を置いてください
- 前提を記録する - 脅威モデルに関する前提を明記してください
- 個別の修正より全体的な対策を優先する - パターンが繰り返される場合は、アーキテクチャの改善を推奨してください
スキルファイル
vulnhunter/
├── SKILL.md # This file
├── resources/
│ ├── sharp-edges-catalog.md # Categorized dangerous patterns
│ └── variant-patterns.md # Vulnerability pattern templates
├── examples/
│ ├── smart-contracts/ # Solidity/blockchain examples
│ ├── web-apps/ # Web application examples
│ └── native-code/ # C/C++/Rust examples
├── templates/
│ └── variant-report.md # Analysis report template
└── docs/
└── methodology.md # Detailed methodology guide
コメント
Markdown 対応