セキュリティの専門知識ゼロ。コードも自分では書けない。それでもClaude Codeに指示を出し続けたら、テスト177件全通過のセキュリティスキャナーが完成した。この記事はその全記録。
この記事でわかること
- Claude Codeに「公開レベルにしろ」と言ったら何が起きるか
- 3エージェント並列実行の実測結果
- WordPressサイトでよくあるセキュリティの穴(REST API、XML-RPC、Gravatar)
- セキュリティスキャナーで何が検出できるか
対象読者
- Claude Codeでプロダクト開発してみたい人
- WordPressサイトを運用している人
- 「AIでどこまで作れるのか」のリアルな実例を知りたい人
目次
完成したもの
Mythos Scanner -- AIを活用したオープンソースのセキュリティスキャナー
URLを入れてボタンを押すだけで、Webサイトのセキュリティをチェックできる。ローカルのコードも診断できる。
| 項目 | 数値 |
|---|---|
| コード | Python 7,161行 |
| テスト | 177件(全通過) |
| 検出精度 | TP=100%, FP=0% |
| 出力形式 | text / JSON / SARIF / Markdown / PDF |
| 対応環境 | CLI / Web UI(Streamlit) / Docker |
「公開レベルにしろ」と言った
最初はClaude Codeで作ったStreamlitアプリだった。動くけど「公開できる?」と聞かれたら無理なレベル。
- セキュリティツール自体にSSRF脆弱性がある
- 検出精度が未検証
- CWE IDがない(業界標準の分類がされてない)
- CLIがない
- 免責事項がない
そこでClaude Codeに一言: 「公開して使ってもらうレベルにしろ」
Claude Codeは自動で:
- コードベース全体を読み込み
- OWASP ZAP、Semgrep等のプロダクションスキャナーと比較
- ギャップを特定
- 5つのPhaseに分けた実装計画を生成
何が足りないか、どの順番でやるか、は全部Claude Codeが判断した。自分は「OK」と承認しただけ。
3エージェント並列実行
承認した瞬間、Claude Codeは3つのエージェントを同時に起動した。
| エージェント | 担当 | 所要時間 | 新テスト |
|---|---|---|---|
| security-fixes | SSRF保護、レポートインジェクション防止、APIコスト制限 | 約8分 | 26件 |
| cwe-cvss-benchmark | CWE IDマッピング、CVSSスコア、精度ベンチマーク | 約4分 | 17件 |
| cli-sarif-config | CLI、SARIF出力、YAML設定ファイル | 約7分 | 34件 |
約8分で完了。 直列なら約19分。並列で2.4倍高速化。
その後「素人でも使えるようにしろ」と追加指示 → README書き直し、UIガイド追加、レポートに「だから何?」セクション追加。
さらに「WordPressの検出を自動化しろ」→ CMS検出モジュール、サブドメイン探索、Gravatar解析を追加。最終的に177テスト全通過。
何を検出できるのか
URLスキャン
| チェック項目 | 検出内容 |
|---|---|
| セキュリティヘッダー | HSTS、CSP、X-Frame-Options等7項目 |
| TLS/SSL | 証明書有効期限、プロトコルバージョン、自己署名検出 |
| フォーム | CSRF対策、XSSパターン、SRI(改ざん検知) |
| 情報漏洩 | HTMLコメント内のツール情報、トラッキングID、パスワードポリシー露出 |
| WordPress検出 | REST APIユーザー列挙、XML-RPC、バージョン露出、プラグイン列挙 |
| サブドメイン | DNS解決、TLS証明書のSANから発見 |
コードスキャン
| チェック項目 | 対応言語 |
|---|---|
| OWASP Top 10:2025 | Python, JavaScript, Go |
| シークレット漏洩 | AWS, GitHub, Stripe, Slack等15パターン |
| 依存関係の脆弱性 | OSV.devリアルタイムDB連携 |
| 攻撃チェーン構築 | AI分析で脆弱性の連鎖を発見 |
| CWE/CVSSマッピング | 業界標準の分類とスコアリング |
WordPressで気をつけるべき3つの穴
スキャナーを作る過程で知ったWordPressのデフォルト設定の問題をまとめておく。
1. REST APIでユーザー情報が丸見え
/wp-json/wp/v2/users にGETリクエストを送るだけで、全ユーザーのフルネーム・slug・GravatarハッシュがJSONで返ってくる。
これはWordPressのデフォルト動作。 無効化しない限り全公開。
さらにGravatarのURLにはメールアドレスのMD5ハッシュが含まれている。サイト内に1人でもメールアドレスが公開されていれば命名規則が推測でき、MD5照合で他の社員のメールも確定できる。
import hashlib
email = "taro.yamada@example.com"
md5 = hashlib.md5(email.lower().encode()).hexdigest()
# このMD5がGravatarのハッシュと一致すればメール確定
2. wp-loginを塞いでもXML-RPCが開いてる
wp-login.phpを403でブロックしても、/xmlrpc.php が開いていたらブルートフォースできる。
system.multicall を使えば1リクエストに数百回のパスワード試行を詰め込める。ログイン画面を塞いだ意味がなくなる。
3. プラグインのreadme.txtでバージョンがバレる
/wp-content/plugins/プラグイン名/readme.txt にアクセスすると、バージョンが Stable tag: X.X.X で記載されている。
攻撃者はバージョンを確認 → CVEデータベースで既知の脆弱性を検索 → 攻撃、という流れで狙ってくる。
これらは全てWordPressの「デフォルト設定」。意図的に対策しないと全部開いてる。
対策コード(10分で終わる)
1. REST API users を無効化
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
2. XML-RPC を無効化
<Files xmlrpc.php>
Deny from all
</Files>
3. バージョン情報を隠す
ServerTokens Prod
Header unset X-Powered-By
readme.html と license.txt も削除。
確認方法
ブラウザでアクセス:
https://あなたのサイト/wp-json/wp/v2/users
JSONが返ってきたら開いてる。401か403なら対策済み。
何が自動で何が手動だったか
| 人間がやったこと | AIがやったこと |
|---|---|
| 「公開レベルにしろ」 | コード読み込み + ギャップ分析 |
| プランの承認(「OK」) | 5 Phaseの設計 + 優先順位付け |
| 「素人でも使えるように」 | README/UI/レポートの改善 |
| 「WordPressの検出を自動化しろ」 | CMS検出モジュールの実装 |
人間は判断だけ。実装は全部AI。
まとめ
やったこと
- Claude Codeに「セキュリティスキャナーを作れ」と指示
- 「公開レベルにしろ」で3エージェント並列実行 → 8分で完了
- WordPressのREST API・XML-RPC・Gravatar等の検出を自動化
- 最終的にPython 7,161行、テスト177件全通過
今日やること
ブラウザでこれにアクセス:
https://あなたのサイト/wp-json/wp/v2/users
JSONが返ってきたら、この記事の対策コードを入れてくれ。10分で終わる。
参考: