はじめに
AWS ContinuumでOWASP Juice Shopに対してペネトレーションテストを実施したので、検出結果をOWASP Top 10のカテゴリベースで分析。
Juice Shopには「どこにどんな脆弱性があるか」の正解リスト(チャレンジ一覧)が公開されてるので、それを正解データにして検出率(見つけるべきもののうち、見つけた割合)を出す。
なお、ここで出すのは「OWASP Top 10そのもの」のカバー率ではなく、Juice Shopの問題をOWASP Top 10:2025のカテゴリに分類したうえでのカバー率。
- テストは自分で管理する環境に立てたJuice Shopに対して実施した。許可を得ていない第三者のシステムにペネトレーションテストを行うと、不正アクセス禁止法などに抵触するおそれがあるので注意
- Juice Shopはわざと脆弱に作られたアプリなので、公開エンドポイントで動かすと第三者に悪用されるおそれがある。今回はテスト終了後に環境を削除した
- より安全にするなら、次のどちらかがおすすめ
- Juice ShopをプライベートIPだけで動かし、ContinuumのVPC接続でテストする
- NAT Gateway付きのVPCをContinuumに接続し、NAT GatewayのIPからの通信だけを許可する
- より安全にするなら、次のどちらかがおすすめ
- Juice Shopのチャレンジの解答に触れるので、これから自力で解きたい人はネタバレ注意
結論
- 指摘9件は全部正解リストのどれかに当たって、誤検知は0件。出てきたものはそのまま対応すべきものだった
- Juice Shopの問題78問に対するカバー率は11.5%(9/78)、同じ脆弱性で解ける問題も数えると19.2%(15/78)
- 今回の結果では、指摘はA01 アクセス制御とA05 インジェクションに集中した
- A03、A06、A07などは、SCAや設計レビューなど別の手法と組み合わせたい領域
- ★6のSSTIまで実証できてた一方で、★1の問題は含まれてなかった。件数は少ないものの、今回は難易度と検出のしやすさに相関は見られず、検出されるかどうかは脆弱性の種類によるところが大きそう
検証の条件
前回記事で同様の内容を記載したので折り畳み
条件
| 項目 | 内容 |
|---|---|
| 対象 | OWASP Juice Shop v20.3.0(自分で管理する環境に構築) |
| ツール | AWS Continuum(旧 AWS Security Agent)のペネトレーションテスト |
| テストの種類 | ブラックボックス(認証情報は渡してない) |
| 実施日 | 2026-09-22 |
| タスク時間 | 約8時間 |
| 実行環境 | 東京リージョン、公式DockerイメージをAmazon ECS Express Modeで実行 |
| テスト範囲の設定 | Juice Shop全体 (除外したパスやエンドポイントなし) |
| 渡した資料 | なし |
| 正解データ | Juice Shop v20.3.0 の data/static/challenges.yml(116問) |
採点の方法
Juice Shopの問題をOWASP Top 10:2025に対応づける
Juice Shop公式のカテゴリ(16分類)を、OWASP Top 10:2025の10カテゴリに対応づけて考える。主な攻撃の分類は以下の通り。
| OWASP Top 10:2025 | 問題数 | 元のJuice Shopカテゴリ(問題数) | 主な問題 |
|---|---|---|---|
| A01 Broken Access Control | 20 | Broken Access Control(12)、Sensitive Data Exposure(2)、Improper Input Validation(2)、Vulnerable Components(2)、Unvalidated Redirects(2) | Admin Section、View Basket、Forged Review、SSRF、CSRF、Admin Registration、Poison Null Byte、Local File Read、Allowlist Bypass |
| A02 Security Misconfiguration | 23 | Sensitive Data Exposure(10)、Security Misconfiguration(4)、Observability Failures(3)、XXE(2)、Security through Obscurity(2)、Miscellaneous(2) | Confidential Document、Forgotten Sales Backup、Exposed Credentials、Leaked API Key、XXE Data Access、Exposed Metrics、Deprecated Interface |
| A03 Software Supply Chain Failures | 5 | Vulnerable Components(5) | Vulnerable Library、Supply Chain Attack、Legacy Typosquatting |
| A04 Cryptographic Failures | 6 | Cryptographic Issues(5)、Security through Obscurity(1) | Weird Crypto、Forged Coupon、Premium Paywall |
| A05 Injection | 25 | Injection(14)、XSS(9)、Broken Authentication(1)、Improper Input Validation(1) | Login Admin、User Credentials、NoSQL Exfiltration、SSTi、DOM XSS、Reflected XSS、Chatbot Prompt Injection(※) |
| A06 Insecure Design | 16 | Improper Input Validation(9)、Miscellaneous(4)、Broken Anti Automation(3) | Payback Time、Zero Stars、Expired Coupon、Deluxe Fraud、Upload Size、CAPTCHA Bypass、Multiple Likes |
| A07 Authentication Failures | 17 | Broken Authentication(8)、Sensitive Data Exposure(5)、Vulnerable Components(2)、Observability Failures(1)、Broken Anti Automation(1) | Password Strength、Reset Jim's Password、Two Factor Authentication、Unsigned JWT、Forged Signed JWT |
| A08 Software or Data Integrity Failures | 3 | Insecure Deserialization(3) | Blocked RCE DoS、Successful RCE DoS、Memory Bomb |
| A09 Security Logging and Alerting Failures | 0 | - | - |
| A10 Mishandling of Exceptional Conditions | 1 | Security Misconfiguration(1) | Error Handling |
※Chatbot Prompt Injectionなどの生成AI関連の問題は、分類上はA05に入れたが、次の「分母から除外した38問」で採点対象から外している。
分母から除外した38問
ペンテストで見つけることを期待するのが不公平な問題は分母から外した。
| 除外の理由 | 問題数 | 例 |
|---|---|---|
| OSINT(外部の情報)が必要 | 13 | 写真のメタデータから秘密の質問の答えを探す、公開情報からパスワードを推測する |
| 脆弱性ではない | 11 | Score Boardを見つける、プライバシーポリシーを読む |
| Web3 | 5 | ウォレットやNFT |
| DoSなどの破壊的な操作 | 5 | RCEによるDoS、XMLやYAMLのボム |
| 生成AI機能のテストが今回の範囲外 | 4 | チャットボットへのプロンプトインジェクション |
1つの脆弱性で複数の問題が解けるケースの考慮
1つの脆弱性を足掛かりに複数の問題が解けることがある。
例えば今回の指摘にあった /ftp の「Poison Null Byte」(ヌルバイトインジェクション)は1つの脆弱性で、これを使うと /ftp 配下にある、拡張子の制限で守られていたファイルを読める。
それを足掛かりとして「Forgotten Sales Backup」「Forgotten Developer Backup」「Easter Egg」の3問を追加で解くことができる。
今回は以下の2パターンでカウントする。
- 脆弱性数:同様の脆弱性起因の問題は1問として数える(上記の例では脆弱性「Poison Null Byte」の1問)
- 問題数:同じ脆弱性を足掛かりに解ける問題も全部数える(上記の例では「Poison Null Byte」「Forgotten Sales Backup」「Forgotten Developer Backup」「Easter Egg」の4問)
検出結果
サマリ
| 検出数 | カバー率 | |
|---|---|---|
| 脆弱性別 | 9 / 78 | 11.5% |
| 問題別 | 15 / 78 | 19.2% |
| 誤検知 | 0件 | - |
| 正解リストにない指摘 | 0件 | - |
OWASP Top 10カテゴリ別
| # | カテゴリ | 脆弱性の内容 | 対象数 | 検出数(脆弱性別) | 検出数(問題別) |
|---|---|---|---|---|---|
| A01 | Broken Access Control | 見てはいけない・触ってはいけないものに触れてしまう | 18 | 5(27.8%) | 6(33.3%) |
| A02 | Security Misconfiguration | 設定ミス、デフォルトのまま、不要な機能が有効 | 16 | 0 | 2(12.5%) |
| A03 | Software Supply Chain Failures | 脆弱・古い依存ライブラリを使っている、ビルドや配布の経路が汚染される | 5 | 0 | 0 |
| A04 | Cryptographic Failures | 暗号化していない、弱い、鍵の扱いが悪い | 3 | 0 | 0 |
| A05 | Injection | 入力がそのままコマンドやクエリとして実行される | 19 | 4(21.1%) | 7(36.8%) |
| A06 | Insecure Design | 実装以前に、設計が危うい | 10 | 0 | 0 |
| A07 | Authentication Failures | 認証が破られる、突破される | 6 | 0 | 0 |
| A08 | Software or Data Integrity Failures | 改ざんされたコードやデータを信用してしまう | 0 | - | - |
| A09 | Security Logging and Alerting Failures | 記録していない、気づけない | 0 | - | - |
| A10 | Mishandling of Exceptional Conditions | エラー処理が雑で、異常時に安全側に倒れない | 1 | 0 | 0 |
※A02の「検出数(脆弱性別): 0、検出数(問題別): 2」は、脆弱性Poison Null Byte起因のもの。
Poison Null ByteはカテゴリA01に当てたけど、同じ穴で読めたバックアップファイルの2問(Forgotten Sales Backup、Forgotten Developer Backup)はカテゴリA02扱いとしたので、問題別のほうだけ数がカウントされている。
指摘とチャレンジの対応
| # | Continuumの指摘 | 重大度 | 対応する問題 | 同じ原因で解ける問題 |
|---|---|---|---|---|
| 1 | SSTI(Pug)/profile のusername | Critical | SSTi(★6) | - |
| 2 | SQLi /rest/user/login のemail | Critical | Login Admin(★2) | Login Bender、Login Jim |
| 3 | Poison Null Byteによる /ftp のLFI(※) | High | Poison Null Byte(★4) | Forgotten Sales Backup、Forgotten Developer Backup、Easter Egg |
| 4 | NoSQLi($where)GET /rest/track-order/:id | High | NoSQL Exfiltration(★5) | - |
| 5 | UNION SQLi /rest/products/search | High | User Credentials(★4) | Database Schema |
| 6 | Mass Assignmentによるroleの書き換え POST /api/Users/ | High | Admin Registration(★3) | - |
| 7 | BOLA /api/BasketItems | Medium | Manipulate Basket(★3) | - |
| 8 | BOLA PATCH /rest/products/reviews | Medium | Forged Review(★3) | - |
| 9 | BOLA GET /rest/basket/{id} | Medium | View Basket(★2) | - |
9件ともContinuum上の信頼度は「高」。BOLAの3件は全部Medium評価。
※「LFI」はContinuumの指摘タイトルの表記。実態は前述のとおり、/ftp 配下での拡張子制限のバイパス。
難易度別
| 難易度 | 対象 | 厳密 | 同一原因 |
|---|---|---|---|
| ★1 | 7 | 0 | 0 |
| ★2 | 12 | 2 | 2 |
| ★3 | 19 | 3 | 6 |
| ★4 | 20 | 2 | 5 |
| ★5 | 11 | 1 | 1 |
| ★6 | 9 | 1 | 1 |
所感
1. Continuumで検出しやすい問題は難易度というよりカテゴリ次第
最高難度★6のSSTIはNode.jsのコード実行まで到達してた一方で、★1の7問(DOM XSS、Error Handling、Exposed Metrics、Zero Stars、Repetitive Registration、Confidential Document、Outdated Allowlist)は今回の指摘に含まれてなかった。
★はJuice Shopが学習者向けに付けた難易度なので、AIエージェントによる攻撃の難しさとは別物。
★1の7問だけだと数は少ないけど、中身を見るとエラーメッセージの露出やメトリクスの公開みたいに単体では実害を示しにくいものが多い。
とはいえ、ツール1つ・対象アプリ1つ・指摘9件での結果なので、傾向として言えるのはここまで。
2. 誤検知0とカバー率の低さは表裏一体
FAQs - Why Should I Use AWS Continuum?では、
AWS Continuum provides on-demand testing that identifies legitimate vulnerabilities in the customer's application by discovering and then verifying risks through exploits using the application context.
と、エクスプロイトでリスクを検証して脆弱性を特定する仕組みだと説明されている。同ページの「How do I enable AWS Continuum?」でも、検証済みの脆弱性(validated security vulnerabilities)を報告するとされている。
実際、出てきた指摘は全部「直すべきもの」として扱えた。その分、実害を示しにくいもの(スタックトレースが出るエラーページ、公開されてる /metrics なんか)は報告の対象になりにくいと思われる。
3. XSSは今回の指摘に含まれていなかった
XSSは除外後のA05に8問(DOM、Reflected、Stored、HTTPヘッダー経由など。★1のBonus Payloadは分母から除外)含まれるが、今回のテストでは検出されなかった。カテゴリA05 Injectionで検出した指摘はSQLi(2件)、NoSQLi、SSTIの3種類で、どれもサーバー側で実行されるインジェクション。
XSSは原因がサーバー側の出力エスケープ漏れ(Reflected / Stored)でも、悪意あるスクリプトが実行されるのはブラウザで、DOM XSSに至っては完全にクライアント側で完結する。ブラウザで画面を操作しないと確認できない脆弱性なので、DASTなど別の手段に任せるか、API仕様書や画面遷移のURL一覧を渡して、ペンテストのテスト範囲にクライアント側の入り口も含めるかを決めておくとよさそう。
4. 指摘の「途中で見えたもの」も活用できる
- /ftp のファイルを読めてるので、/ftp の一覧も見えていたと思われる。でも一覧から読める機密文書(Confidential Document、★1)は指摘にない
- admin権限を取れてるけど、管理画面(Admin Section、★2)への到達は書かれてない
- /ftp から読める
package.json.bak(Forgotten Developer Backup)を見れば、依存ライブラリの問題(A03のSupply Chain Attack、Legacy Typosquatting)の手がかりも得られたはず
指摘は「実害まで実証できたもの」の単位でまとまってるので、途中で見えた周辺の問題は別の指摘としては出てこない。渡す資料を工夫してContinuumに拾わせる手もあるけど、受け取る側としても、指摘を受け取ったらその周りに同じ原因の問題が潜んでないかは意識したい。
5. ビジネスロジックは設計レビューの領域、認証は2種類に分かれる
A06(負の数量での注文、期限切れクーポン、CAPTCHAの回避など)とA07(パスワード変更、JWTの偽造、2要素認証など)は今回の指摘に含まれていなかった。
A06のビジネスロジック系や、A07のうちパスワードリセットや2要素認証のフローは、「アプリの仕様として何が正しいか」を知らないと判断できない種類の脆弱性で、ブラックボックスで仕様を渡さずに外から見つけるのはそもそも難しい。脅威モデリングや設計レビュー、仕様を踏まえたテストケースで守る領域。とはいえContinuumにはドキュメントをコンテキストとして渡せるので、業務仕様を渡して結果がどのくらい変わるのかは調べたい。
一方で、A07のうちUnsigned JWT(alg: none の受け入れ)やForged Signed JWTは、仕様に関係なく技術的に判定できる脆弱性で、ブラックボックスのペンテストで見つかってもおかしくない種類。設計レビューに任せる領域とは分けて考えたい。
6. ペンテストで拾えるサプライチェーンの問題と、拾えない問題
OWASP Top 10:2025のA03 Software Supply Chain Failuresは、2021年版のA06(脆弱で古いコンポーネント)を含む形に広がったカテゴリ。
ペネトレーションテストは稼働中のシステムを外から見るものなので、既知の脆弱性を持つライブラリやサポート切れのフレームワークといった、ヘッダやフィンガープリントから分かるものは本来検出できる。一方で、ビルドパイプラインの設定不備や構成管理、署名検証といったプロセス面は、SCAやパイプラインのレビューなど別の手法で拾う必要がある。
今回A03の5問が指摘に含まれてなかったうち、Vulnerable Libraryは前者にあたるので、ペンテストで拾えてもおかしくなかったもの。またSupply Chain AttackとLegacy Typosquattingも、所感4のとおり /ftp から読めた package.json.bak に手がかりがあった。A03の未検出は「ペンテストの性質上しかたない」とは言い切れず、Continuumが検出できる余地のある部分だと思う。