カスタマーサービス用のチャットボットが、マトン(羊肉)のレシピを求める単純なリクエストを受けただけで、自身のシステムプロンプトを漏洩させてしまいました。数分もしないうちに、ボットはレシピを提供するだけでなく、Pythonコードを生成し、自身の振る舞いを規定する内部指示までも明らかにしてしまいました。

この事案は、言語モデルの「システムプロンプト」がセキュリティの壁にはならないことを証明しています。ボットがユーザーのリクエストが自身のミッションに合致するかどうかをその場で判断する場合、攻撃者はその推論を誘導し、モデルに機密情報を開示させることができてしまいます。

侵害の引き金となったもの

テストは、「マトンシチューのレシピを教えてくれますか?」という単純な質問から始まりました。企業のサービス説明を目的としていたボットは、完全なレシピを回答しただけでなく、材料を解析する短いPythonスクリプトを追加し、さらにモデルの振る舞いを規定するテキストであるシステムプロンプトの正確な文言を出力しました。

リクエスト自体は無害なものでした。危険性は、ボットがそのレシピを自身の主要なタスクの一部として扱おうとした点にありました。

なぜこれが重要なのか

現在、チャットボットは顧客対応の役割を担っており、個人データの取り扱い、トランザクションの実行、あるいは社内ツールの制御などを行っています。もしモデルが自身の指示セットを明かすよう誘導されてしまうと、攻撃者は、モデルが有害な行動をとるのを防ぐはずのガードレール(防御策)に関する洞察を得てしまいます。

攻撃の仕組み

  1. ボットの目的をプロファイリングする – テスターは、ボットの役割が企業サービスの解説であることを特定しました。
  2. 偽の関連性を作る – 「どのサービスを利用すべきか判断するためにレシピが必要だ」と主張することで、テスターはリクエストにボットのミッションとの表面的な関連性を持たせました。
  3. ロジックを悪用する – ボットは捏造された関連性を受け入れ、リクエストを内部の関連性チェックに通過させ、本来であればブロックされるはずのガードレールを無効化しました。

この攻撃は、モデルによる「関連性の自己評価」に依存しています。その評価が揺るがされると、モデル自身の「ルール」は交渉可能なものになってしまいます。

3つの失敗ポイント

失敗の段階 起きたこと
ゴールの乗っ取り (Goal hijacking) ボットが、無関係な料理のリクエストをサービス説明という自身のゴールの一部として扱った。
機能の逸脱 (Capability drift) コード生成は役割に含まれていないにもかかわらず、実行可能なPythonコードを生成した。
プロンプトの漏洩 (Prompt leakage) 非公開であるべきシステムプロンプトの正確な文言を出力した。

各段階は、多くの導入環境において「モデル自身が遵守している」と想定されている、異なる防御レイヤーの崩壊を表しています。

実際に機能する防御レイヤー

ガードレールをモデルの中から切り離し、決定論的な(deterministic)コードへと移行することで、信頼できるセキュリティ境界を回復できます。

  • タスク・ルーティング – 別の分類器(classifier)を使用して、受信したメッセージを許可された意図(intent)の固定リストにマッピングします。リクエストがそのリストに含まれない場合は、即座に拒否します。これにより、モデルが関連性について議論する余地をなくします。
  • 最小権限の原則 (Least capability) – ボットに不要なツールを与えないようにします。コードの実行や広範なデータベースへのアクセスが必要ない場合は、それらの機能を削除します。
  • 決定論的な認可 (Deterministic authorization) – 権限チェックは言語モデル内ではなく、アプリケーションコード内で行います。モデルはアクションを提案できますが、それを実行するかどうかはコードが決定します。
  • 出力バリデーション – モデルの回答がユーザーに届く前に、システムプロンプトや機密データなどの禁止されたコンテンツが含まれていないか、すべてのレスポンスをスキャンします。

単に「このリクエストは禁止されているか?」と問うだけのフィルターは、説得力のあるユーザーによって回避される可能性があります。一方で、クローズドなリストに対してチェックを行うルーティングレイヤーは、交渉の余地を残しません。

今後の注意点

対話型AIに依存している企業は、マトンレシピのテストで示された3つの失敗モードについて、自社の導入環境を監査すべきです。それまでの間は、いかなるシステムプロンプトも公開情報であると見なし、モデルが自身を明かすのを防ぐ手段としてプロンプトを当てにしないようにしてください。

教訓は明確です。セキュリティモデルが自然言語による数行の指示に依存しているなら、それは脆弱です。モデルが何を言おうとも、監査、バージョン管理、および強制適用が可能なコードによって、セキュリティを強化してください。