サイト内の現在位置

OWASP Juice Shop v20.0.0で追加されたLLM関連問題を解いてみた

NECセキュリティブログ

2026年5月29日

Webアプリケーションセキュリティの学習用プラットフォームとして有名な「OWASP Juice Shop」の新バージョンであるv20.0.0が、2026年5月12日に公開されました。v20.0.0では、LLMを利用したAIチャットボット機能と、それに伴う新たなチャレンジ(問題)が追加されています。本記事では、追加されたLLMに関する問題のうち、「Chatbot Prompt Injection」と「Greedy Chatbot Manipulation」の2つについて紹介します。

目次

OWASP Juice Shopについて

OWASP Juice Shopnew window[1]は、Webアプリケーションセキュリティの学習のために、無数の脆弱性があえて作り込まれているWebアプリケーションです。OWASPのプロジェクトとして開発が行われています。作り込まれた脆弱性に関連する問題が用意されており、CTFのように問題を解くことでWebアプリケーションセキュリティについて手を動かしながら学習することができます。

アップデートは継続的に行われており、2026年5月12日にはv20.0.0new window[2]がリリースされました。このバージョンでは、新しい機能としてLLMを利用したAIチャットボットが追加されています。また、その機能に関連して、LLM関連の脆弱性を取り扱う問題が追加されました。

追加された問題は「Chatbot Prompt Injection」、「Greedy Chatbot Manipulation」、「AI Debugging」の3問です。これらの問題を解くためには、LLMエンドポイントを別途用意する必要があります。

環境構築

今回の環境はUbuntu 26.04 LTS上に構築しました。

まずは、LLMエンドポイントを用意します。OWASP Juice Shop用のLLMエンドポイント構築に関するドキュメントnew window[3]によると、デフォルト設定ではローカル環境のOllamanew window[4]を使用するようになっているようですので、ローカル環境にOllamaを構築しました。

Ollamaは、公式サイトのダウンロードページnew window[5]に記載のあるインストールコマンドを実行するだけでインストールできます。

curl -fsSL https://ollama.com/install.sh | sh

次にモデルをダウンロードします。ドキュメントnew window[3]によると、OWASP Juice Shopでの推奨モデルは「qwen3.5:9b」です。

ollama pull qwen3.5:9b

モデルのダウンロード後、以下のコマンドを実行しプロンプトに対して何らかの応答があれば、モデルがインストールされています。

ollama run qwen3.5:9b

図 1 LLM(qwen3.5:9b)対話画面

Ollamaの準備の次は、OWASP Juice Shopを構築します。リポジトリからソースコードをダウンロードした後、npmで簡単に環境を構築できます。

git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
npm install

なお、ドキュメントnew window[3]ではLLMモデルとして「qwen3.5:9b」の使用が推奨されていますが、OWASP Juice Shopのデフォルト設定では使用モデルが「gemma4:e4b」になっていました。したがって、「config/default.yml」の「application.chatBot.model」を編集し使用モデルを「qwen3.5:9b」に変更しました。

図 2 使用するモデルの設定

設定変更が完了した後、以下のコマンドを実行することで環境を起動できます。

npm start

Webアプリケーションは3000番ポートで起動しますので、ブラウザからアクセスします。飲み物の販売サイトが表示されます。

図 3 OWASP Juice Shopのトップ画面

問題への挑戦

OWASP Juice Shopの問題一覧は「/#/score-board」にアクセスすることで確認できます(スコアボードへのリンクは画面上非表示となっており、これを見つけてアクセスすること自体が問題の一つでもあります)。

図 4 問題一覧画面

今回のバージョンで追加されたLLM関連問題の内容は以下のとおりです。各問題には難易度(★マーク)が6段階で示されています。今回取り上げる「Chatbot Prompt Injection」は難易度2、「Greedy Chatbot Manipulation」は難易度3の問題です。

図 5 新たに追加されたLLM関連の問題

Chatbot Prompt Injection(難易度:2/6)

この問題は、AIチャットボットを使って割引クーポンを発行させる問題です。ウェブサイトのサイドメニューに「AIチャット」というリンクがあります。これが今回追加されたAIチャットボット機能と考えられます。

図 6 OWASP Juice Shopのサイドメニュー

「AIチャット」メニューにアクセスをしてみます。利用者向けのアシスタント機能を持った、よくあるチャットボットのように見えます。

図 7 AIチャットボット画面

まずは、どういう機能があるのかを把握するために、役割や機能を洗い出すためのプロンプトを送信してみました。その結果、AIチャットボットが持っている機能がかなり詳細に応答されました。チャットボットにはいくつかのタスクが割り当てられており、各タスク実行のために使用可能なツール名までもが回答されています。問題に関係のあると考えられるクーポン発行に関するツールの名称は「generateCoupon」のようです。実行には条件があることが示されています。

図 8 役割・機能探索のプロンプトとその応答

次に、「generateCoupon」ツールの実行条件を洗い出すためのプロンプトを送信してみました。その結果、商品ID情報が必要であること、商品の破損、返品拒否済みである必要があることといった、クーポン発行の詳しい条件が応答されました。注文IDの例として「3fa8-bf2bc042f4e92」という値が記載されています。また、「generateCoupon」ツールの引数が「discount」であり、割引のパーセントの数字を指定するものであることがわかります。

図 9 クーポン発行条件探索のプロンプトとその応答

得られた情報をもとに、「generateCoupon」ツールを実行して10%の割引クーポンを要求するプロンプトを送信してみました。クーポン発行条件を満たすような旨の文章を記載し、注文IDには例示された値を指定しました。すると、クーポン発行に成功し、10%割引のクーポンコードを入手できました。クーポン発行に本来必要な条件がバイパスできてしまうことがわかります。商品IDとログインユーザーの照合確認がサーバープログラム側で厳密に行われていないことが推測できます。

図 10 10%クーポン要求プロンプトとその応答

問題をクリアすると、コーディングチャレンジに遷移することができるようになりました。コーディングチャレンジでは、実際のソースコードが表示され、脆弱性の原因となっている行を選択します。

図 11 コーディングチャレンジ:脆弱性の原因特定画面

その後、修正案のコードが4つ提示されるので、正しいコードを選択して提出します。以下の画像は間違っている修正例です。どのような修正が必要なのかについてはぜひ考えてみてください。

図 12 コーディングチャレンジ:脆弱性の修正画面

Greedy Chatbot Manipulation(難易度:3/6)

この問題も、先ほどと同様にAIチャットボットを使って割引クーポンを発行させる問題です。ただし、割引率が50%以上のクーポンを発行する必要があります。前問で確認したとおり、クーポン発行には「generateCoupon」ツールが利用されており、割引率は最大10%までという制約が与えられていました。そのため本問題は、この割引率制限を何らかの形で突破する問題であると考えました。

そこで、OWASP AI Testing Guidenew window[6] などを参考に、システムプロンプトの制約を弱めたり、別の優先度の高い文脈を与えたりすることで、モデルの判断を揺さぶる方法をいくつか試しました。

まずは、顧客補償のために特別な高額割引が必要であるという業務コンテクストを与える方法を試してみました。障害対応や補償対応といったもっともらしい理由を付与し、例外的に50%割引のクーポンを発行するよう促しましたが、AIチャットボットはクーポン発行ポリシーをそのまま引用し、最大10%までという制約を維持したまま拒否しました。

図 13 顧客補償コンテクストによる制限突破試行とその結果

次に、セキュリティテストやデバッグの一環として通常の業務ルールを一時的に無効化するという文脈を与えるプロンプトを試しました。しかし、この方法でもチャットボットはシステムプロンプトや運用ポリシーの上書きはできないと応答し、50%割引のクーポンは発行されませんでした。

図 14 デバッグコンテクストによる制限突破試行とその結果

いわゆる DAN(Do Anything Now)と呼ばれる手法も試してみました。これは、今から何でも実行する別人格として振る舞うことをモデルに指示し、制約の弱い新しい役割を提示することで、従来の制限を上書きしようとする手法です。有名な攻撃手法であるからか、今回の環境では無効でした。

図 15 DAN (Do Anything Now) による制限突破試行とその結果

更に、商品ID情報や、商品の破損、返品拒否済みであることといったクーポンコード発行に必要な条件を満たしている旨の情報を示したうえで、割引率50%以上のクーポン発行について上位者による承認済みであるという文脈で指示を出してみました。その結果、50%割引クーポンは得られませんでしたが、10%割引のクーポン情報は返ってきました。この方法でも前問題を解くことができるようです。クーポンコード発行に必要な条件を満たしていることを明示したほうが、命令が通りやすいのではないかと考えられます。

図 16 上位者承認コンテクストによる制限突破試行とその結果

最終的に、プログラムの出力やツール呼び出し指示に近い、簡潔で構造化された英語の指示を試してみたところ、システムプロンプトによる制限を突破し、50%割引のクーポンを入手することができました。文章で説得するのではなく、前提条件、使用ツール、引数を形式的に列挙する形式にしたところ、AIチャットボットはその内容を通常の会話というよりもツール実行指示として強く解釈した可能性があります。

図 17 プログラムライクな英語指示による制限突破試行とその結果

この結果から、業務上重要な制約をシステムプロンプトでの指示にのみ依存して実装することの危険性が分かります。今回のケースにおいては、discountパラメーターの値をプログラムでチェックする実装としていれば、不正な割引率でのクーポン発行は防ぐことができたと考えられます。

まとめ

本記事では、OWASP Juice Shop v20.0.0で新たに追加されたLLM関連問題のうち、「Chatbot Prompt Injection」と「Greedy Chatbot Manipulation」の2問について紹介しました。LLMを組み込んだアプリケーションでは、プロンプト設計だけで安全性を担保することは難しいということを、実際に手を動かしながら体感することができました。LLMを組み込んだアプリケーション特有のリスクを体験的に理解したい方にとって、今回追加された問題は参考になると思います。ぜひ皆さん挑戦してみてください。

参考文献

執筆者プロフィール

大家 政胤(おおや まさつぐ)
担当領域:リスクハンティング

脆弱性診断、ペネトレーションテスト、インシデント対応に関する業務に従事。
CISSP、CCSP、GPEN、CHFI、RISSを保持。

執筆者の他の記事を読む

アクセスランキング