Shannon という生成 AI を用いた脆弱性診断ツールが発表されました。
試しに使ってみて、所感をお伝えできればと思います。
Shannon とは
「fully autonomous AI pentester」と名の通り、完全に脆弱性診断を生成 AI により自動化しよう!というものです。
脆弱性も「ソースコードから可能性がある」に留めず、ブラウザを用いて実際に攻撃を行い、「攻撃が成功した」ことを持って脆弱性として報告をしてくれます。
原則としてホワイトボックス(ソースコードを全部生成 AI に与える)での検査となり、実際に運用されている他社のサービスへの攻撃に使いにくい、という点は個人的に評価点が高いです。
試しにやられサイトで検証してみる
いくつか公式にベンチマークとして出してくれています。そこ以外で試してみよう!ということで、このプロジェクトを利用してみます。
元々ベンチマークで基本的な能力を見ることは出来るので、個人的には下記のポイントが見られたらいいなと思っています(もしかしたら重複しているかもですが)
- JWT を取り扱えるか
- SSRF/OpenRedirector 辺りを取り扱えるか
Shannon の準備
無料版(Self-Host なので、生成 AI 周りはこちら持ち)なので、ローカルに移します。
$ git clone https://github.com/KeygraphHQ/shannon.git
$ cd shannon
# Docker Image のビルド
$ docker build -t shannon:latest .
# テスト対象を <PROJECT>/repos/ 配下に移動
$ cd repos
$ git clone https://github.com/SasanLabs/VulnerableApp.git
# Shannon は VulnerableApp ディレクトリ内部でファイルを作成します。一度失敗したので。
$ chmod -R 777 VulnerableApp
# 対象のアプリを起動させておく(裏で docker-compose.yml を編集し、ポート番号は弄っています)
$ cd VulnerableApp
$ docker compose up -d
この後、Claude Console の API キーを用いるため、下記より発行しましょう。
取得した API キーを用いて、Docker から Shannon の起動をします。
$ docker run --rm -it \
--network host \
--cap-add=NET_RAW \
--cap-add=NET_ADMIN \
-e ANTHROPIC_API_KEY="$CLAUDE_CODE_API_KEY" \
-e CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000 \
-v "$(pwd)/repos:/app/repos" \
-v "$(pwd)/configs:/app/configs" \
shannon:latest \
"http://localhost:8080" \ # スキャン対象のエンドポイント。localhost で良かったのか...?多分 network: host で大丈夫だと思うけど
"/app/repos/VulnerableApp" \ # 対象のプロジェクト。Container の視点で設定する必要がある
--config /app/configs/example-config.yaml
後は待つだけです。従量課金にしているので、都度チャージする設定にしないと枯渇して止まります。気を付けましょう。
結果
このアプリ、目的を達成すると鍵が外れて、後で見返すことが出来ます。レポートを貰っていますが、これを見ましょう。
Command Injection
Level 1 から Level 5 まではクリア、最高難度である Level 6 はクリアできていないようです。
UnrestrictedFileUpload
不正なファイルのアップロード、実行を目的としています。
Level 1 から Level 9 まではクリア、最高難度である Level 6 はクリアできていないようです。
✅JWTVulnerability
Level 1 から Level 13 まで、全てのステージをクリアしています。
✅Http3xxStatusCodeBasedInjection
オープンリダイレクタに関する項目です。
Level 1 から Level 8 まで、全てのステージをクリアしています。
✅PathTraversal
Level 1 から Level 12 まで、全てのステージをクリアしています。
✅RemoteFileInclusion
外部ファイルを含んだレスポンスを取得することが目的です。SSRF かな?
Level 1 から Level 2 まで、全てのステージをクリアしています。
BlindSQLInjectionVulnerabilit
Level 1/2 のみクリア、Level 3 から Level 5 はクリアできていません。
ErrorBasedSQLInjectionVuln
Level 1 から Level 4 まではクリア、最高難度である Level 5 はクリアできていないようです。
(レポートには3/4の記載は無いですが、詳細見る限り解けそうな気がするし、実際解けた表記になってます)
UnionBasedSQLInjectionVulnerability
Level 1/2 のみクリア、Level 3 から Level 9 はクリアできていません。
SSRFVulnerability
Level 1 から Level 4 まではクリア、最高難度である Level 5 はクリアできていないようです。
PersistenceXSSInHTMLTagVulnerability
Level 1 から Level 6 まではクリア、最高難度である Level 7 はクリアできていないようです。
XSSInImgTagAttribute
Level 1 から Level 5 をクリア、Level 6/7 はクリアできていません。
✅XSSWithHtmlTagInjection
Level 1 から Level 3 まで、全てのステージをクリアしています。
XXEVulnerability
Level 1/2 をクリア、Level 3/4 はクリアできていません。
レポートとしては、Authentication, XSS, SQL and Command Injection, SSRF, Authorization testing の 5 つの区分からなっていて、上記の各課題が上記に振り分けられていました。
あくまで「脆弱性」の観点から、一定レベルで網羅性のあるレポートが再現性のある方法付きで提示されるのは魅力的かと思います。
また、下記の内容に対してレポートがありました。
その他インフラ層で気を付けるべき点
- H2 Database 1.3.176 を利用しており、RCE 脆弱性がある
- Log4j2 を利用しており、Log4Shell の検証が必要(検証はしてなさそう)
- HTTPS/TLS 暗号化が無いこと(想定されるものであり、今回は気にしない)
- /VulnerableApp/h2 で DB コンソールが公開されていること。一応認証はある
時間/お金
最後にこんな感じの情報をくれます。これはアプリケーションにより異なるでしょう。
⏱️ TIMING SUMMARY
────────────────────────────────────────────────────────────
📊 Total Execution Time: 142m 56s
🔍 Phase Breakdown:
pre-recon 28m 11s (19.7%)
recon 29m 5s (20.3%)
vulnerability-analysis 40m 54s (28.6%)
exploitation 39m 10s (27.4%)
reporting 5m 32s (3.9%)
Phases Total 142m 54s (100.0%)
🖥️ Command Breakdown:
whatweb 2.1s (0.0%)
nmap 6.6s (0.1%)
subfinder 42.4s (0.5%)
Commands Total 51.1s (0.6%)
🤖 Agent Breakdown:
pre recon agent 28m 11s (19.7%)
recon agent 29m 4s (20.3%)
ssrf vuln agent 26m 23s (18.5%)
xss vuln agent 29m 34s (20.7%)
injection vuln agent 29m 40s (20.8%)
auth vuln agent 40m 25s (28.3%)
authz vuln agent 40m 46s (28.5%)
authz exploit agent 7m 20s (5.1%)
ssrf exploit agent 10m 39s (7.5%)
injection exploit agent 16m 13s (11.4%)
xss exploit agent 16m 29s (11.5%)
auth exploit agent 39m 6s (27.4%)
executive summary and report cleanup 5m 32s (3.9%)
Agents Total 319m 29s (223.5%)
💰 Cost Breakdown:
pre recon agent $ 3.6014
recon agent $ 3.2734
ssrf vuln agent $ 1.1376
xss vuln agent $ 1.0204
injection vuln agent $ 1.0941
auth vuln agent $ 2.6654
authz vuln agent $ 3.4878
authz exploit agent $ 1.8828
ssrf exploit agent $ 2.3844
injection exploit agent $ 2.9792
xss exploit agent $ 2.3688
auth exploit agent $ 5.0688
executive summary and report cleanup $ 0.8842
Total Cost $ 31.8481
────────────────────────────────────────────────────────────
自作の小規模アプリケーションをターゲットにしてみる
protobuf を用いた簡易的なアプリケーションを作成してみました。ほぼ生成 AI 産です。
Increment Counter ボタンを押すことで値が 1 増加します。内部的にはユーザーと紐づけてあり、他のユーザーに名前を変えることで、他のユーザーとしてカウントを増加できます。
...が、この Increment Counter のインクリメント処理はフロントエンド側で行い、バックエンドでは「値のセット」を行っているため、非常に大きな値を突然セットすることも可能です(脆弱性その 1)
また、しれっとユーザー名で SQLi が出来るようにしてあります(脆弱性その 2)
このように protobuf を取り扱うことが出来るか?というのを確認できれば、というものです。
結果
SQL Injection については適切に取り扱ってくれました(Gemini に日本語訳を頼んだ結果を添付しています)
また、スコア改ざんについては明示されていませんでしたが、認証不備(別のユーザーになりすませるよね、という問題)の中に仄めかすような内容が含まれていました。もしかしたら仕様として認知してしまっているかも。
時間/お金
⏱️ TIMING SUMMARY
────────────────────────────────────────────────────────────
📊 Total Execution Time: 67m 7s
🔍 Phase Breakdown:
pre-recon 19m 13s (28.6%)
recon 9m 50s (14.7%)
vulnerability-analysis 13m 11s (19.6%)
exploitation 21m 3s (31.4%)
reporting 3m 46s (5.6%)
Phases Total 67m 5s (99.9%)
🖥️ Command Breakdown:
whatweb 3.2s (0.1%)
nmap 3.2s (0.1%)
subfinder 8.9s (0.2%)
Commands Total 15.3s (0.4%)
🤖 Agent Breakdown:
pre recon agent 19m 13s (28.6%)
recon agent 9m 50s (14.7%)
ssrf vuln agent 3m 48s (5.7%)
xss vuln agent 5m 48s (8.7%)
auth vuln agent 7m 25s (11.1%)
injection vuln agent 12m 12s (18.2%)
authz vuln agent 13m 2s (19.4%)
authz exploit agent 5m 2s (7.5%)
injection exploit agent 9m 44s (14.5%)
auth exploit agent 20m 58s (31.2%)
executive summary and report cleanup 3m 46s (5.6%)
Agents Total 110m 53s (165.2%)
💰 Cost Breakdown:
pre recon agent $ 2.9590
recon agent $ 2.5011
ssrf vuln agent $ 0.6916
xss vuln agent $ 1.1510
auth vuln agent $ 1.2848
injection vuln agent $ 2.2455
authz vuln agent $ 1.6914
authz exploit agent $ 1.2005
injection exploit agent $ 1.7799
auth exploit agent $ 2.7625
executive summary and report cleanup $ 0.6728
Total Cost $ 18.9400
やっぱりアプリケーション規模に依存しますね。逆に Claude Sonnet 4.5 を用いるような場合、事前に費用の見積もりが出来ないことは難点になるかもです。
注意点
指定したエンドポイントに対して nmap を実行しているようです。
開発環境でありがちですが、複数プロジェクトの開発を同時にしていると、両方に対して脆弱性スキャンをかけてきます。
実際に VulnerableApp と protocol-buffer-vultest で混同してしまっていたので、気を付けてください。
テスト環境を作成して、そこにデプロイ、スキャンをかけるのが現実的には望ましいと思います。
まとめ
Shannon という自動脆弱性診断ツールでした。それなりに良い精度は出る気がしていて、WAF が設定される前のテスト環境にかけるにはかなりいいんじゃない?と思いました。
ただ、モデルに依存するところはあると思うし、元々生成 AI に「ソースコードから脆弱性を探してみて。その脆弱性から PoC を作ってみて」みたいなクエリでそれなりに頑張ってくれるところはあります。
必須か?と言われるとそうでもないと思いますが、リリース前にかけてみる、ということをやってみてもいいのでは?という感じでオススメは出来そうです。
現在、Ollama でローカルで動くモデルにやらせようとしている PR があることを確認しているため、今度はこの設定で動かしてみてもいいですね。正直自分がプライベートで気軽に検証するにはちょっと高かったですし...


