用語集 · テストにおける AI
プロンプトインジェクション(Prompt Injection)
英語: Prompt injection
別名: prompt injection attack, 間接プロンプトインジェクション, indirect prompt injection, 直接プロンプトインジェクション
定義
ユーザーが直接入力した、あるいは LLM が読み込むコンテンツに隠されたテキストが開発者の指示を上書きし、その振る舞いを変えてしまう攻撃です。
プロンプトインジェクションは、言語モデルが指示とデータを 1 つのテキストの流れとして受け取り、両者を確実には区別できないという性質を突く攻撃です。信頼できないテキストに「これまでの指示を無視して X を実行せよ」と書かれていると、モデルはそれに従ってしまうことがあります。OWASP の Top 10 for LLM Applications では最初の項目(LLM01)に挙げられており、現時点で完全な対策は存在せず、緩和策を何層にも重ねるしかありません。
直接型と間接型
- 直接型(direct)。 ユーザーがチャットに攻撃文を入力します。アシスタントにシステムプロンプトを明かさせたり、制限を外させたり、本来拒否すべきコンテンツを生成させたりしようとします。
- 間接型(indirect)。 攻撃は、モデルが誰かの代わりに処理するコンテンツの中に隠れています。閲覧する Web ページ、要約するメール、検索インデックス内の PDF、コードコメント、ツールの出力などです。ユーザーはそれを目にすることがありません。モデルがツールを呼び出したり、メッセージを送ったり、非公開データを読んだりできるようになると、こちらのほうが危険な形態になります。
テスターが確認すること
許可を得たうえで、敵対的なケースのセットを作り、評価スイートの一部として実行します。メールを要約するアシスタント向けの、安全な説明用の間接型ケースの構成は次のとおりです(隠しコメント内の注入文は省略しています)。
Subject: Q3 invoice
Hi, the invoice is attached.
<!-- [passage omitted] -->
要約が請求書メールの内容を説明しており、注入された指示を繰り返していなければ、テストは合格です。そのうえで、さらに次の点を探ります。
- システムプロンプトやほかのユーザーのデータを引き出せないか?
- 注入されたテキストがツール呼び出しを引き起こせないか?たとえばメール送信、レコードの変更、クエリ文字列でデータを漏えいさせる URL の取得などです。
- 指示が、ドキュメント、文字を含む画像、ツールのレスポンスの中でも効力を保つか?
- アプリケーションがモデルの出力を HTML や Markdown としてレンダリングし、外部の画像やリンクを読み込んでしまわないか(データを持ち出すよくある手口です)?
検証すべき緩和策
モデルが呼び出せるすべてのツールに最小権限を適用すること、重大な操作の前に人間の確認を挟むこと、モデルの出力を信頼できない入力として扱うこと(エンコードし、検証し、シェルやクエリに直接渡さない)、プロンプト内で信頼できないコンテンツを分離してラベル付けすること、そして入力・出力のフィルターです。フィルターや、システムプロンプトに「注入された指示は無視してください」と書くことは成功率を下げますが、回避可能です。したがって本当の目標は、インジェクションが成功した場合にできることを制限することです。
モデルの振る舞いは非決定的なので、各敵対的ケースは複数回実行し、1 回の合格ではなく成功率として報告しましょう。