1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【実話】素人がClaude CodeでセキュリティスキャナーをOSSとして公開するまでの全記録

1
Last updated at Posted at 2026-04-13

セキュリティの専門知識ゼロ。コードも自分では書けない。それでも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は自動で:

  1. コードベース全体を読み込み
  2. OWASP ZAP、Semgrep等のプロダクションスキャナーと比較
  3. ギャップを特定
  4. 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 を無効化

functions.php
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 を無効化

.htaccess
<Files xmlrpc.php>
    Deny from all
</Files>

3. バージョン情報を隠す

.htaccess
ServerTokens Prod
Header unset X-Powered-By

readme.htmllicense.txt も削除。

確認方法

ブラウザでアクセス:

https://あなたのサイト/wp-json/wp/v2/users

JSONが返ってきたら開いてる。401か403なら対策済み。


何が自動で何が手動だったか

人間がやったこと AIがやったこと
「公開レベルにしろ」 コード読み込み + ギャップ分析
プランの承認(「OK」) 5 Phaseの設計 + 優先順位付け
「素人でも使えるように」 README/UI/レポートの改善
「WordPressの検出を自動化しろ」 CMS検出モジュールの実装

人間は判断だけ。実装は全部AI。


まとめ

やったこと

  1. Claude Codeに「セキュリティスキャナーを作れ」と指示
  2. 「公開レベルにしろ」で3エージェント並列実行 → 8分で完了
  3. WordPressのREST API・XML-RPC・Gravatar等の検出を自動化
  4. 最終的にPython 7,161行、テスト177件全通過

今日やること

ブラウザでこれにアクセス:

https://あなたのサイト/wp-json/wp/v2/users

JSONが返ってきたら、この記事の対策コードを入れてくれ。10分で終わる。


参考:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?