プロンプトインジェクション(Prompt Injection)

プロンプトインジェクション(Prompt Injection)とは

プロンプトインジェクションとは、AIを使用したサービスに対し、不正な入力(プロンプト)を行うことで、開発者が意図しない情報を引き出す攻撃の1つです。攻撃が成功した場合、サービスが不適切な内容を出力したり、サービス自体を構成する機微な情報を出力してしまうおそれがあります。

プロンプトインジェクションとは

プロンプトインジェクションとは、AIを使用したサービスに対し、不正な入力(プロンプト)を行うことで、開発者が意図しない情報を引き出す攻撃の1つです。攻撃が成功した場合、サービスが不適切な内容を出力したり、サービス自体を構成する機微な情報を回答してしまうおそれがあります。特に、自然言語を扱う対話型AIサービスに対するプロンプトインジェクションは、入出力が決まったルールのない自然言語(人間が普段使用する言語)であることから、従来の他のインジェクション攻撃と比べ、機械的な攻撃の検出やブロックが難しいといった特徴があります。本ページでは主に、AIの中でも、自然言語を扱う「大規模言語モデル(LLM)」を対象にプロンプトインジェクションを解説します。

大規模言語モデル(LLM)を使用したサービスとプロンプト

プロンプトインジェクションの解説に入る前に、まず、大規模言語モデルとプロンプトについて説明します。大規模言語モデルは生成AIの種類の一つであり、自然言語処理に優れたAIのモデルです。膨大な量のテキスト情報を学習したモデルであり、チャットや文書作成など、自然言語を扱う場において利用されています。具体的なモデルとしては、OpenAI社の「GPT-3、4」やGoogle社の「BERT」などが挙げられます。

プロンプトは、AIモデルに対してその利用者が指示や質問を行う際の入力を指し、大規模言語モデルにおいては、多くの場合、自然言語で記載されたテキスト形式の文字列となります。特定の記載ルールが定められていない自然言語を入力することから、想定通りの出力を行うには、利用者側で対象のサービスに適した文字列を考え入力を行う必要があります。このように、AIモデルから望ましい回答を得るための技術はプロンプティングとも呼ばれます。

さて、ここからは、大規模言語モデルを使用した、架空のAI英訳サービスをもとに、同モデルとプロンプトの関係を見ていきましょう。ある日、ユーザの一人が図1のような質問をしました。これをシステム目線で見るとどうなっているのでしょうか。まず、サービスで入力された文字列は、サービスの処理ロジックに渡されます。そして、処理ロジックの中で、「サービスが事前に定義した情報」と組み合わされ、最終的なプロンプトになります。「サービスが事前に定義した情報」はサービス提供者が、大規模言語モデルから回答をもらうにあたり、依頼したい事項や、制限したい事項を記述したものです。本サービスは英訳サービスであるため、ユーザからは英語の文章が入力されることを想定しています。そのため、サービス側では事前に「Please translate the Japanese text entered below into English.(訳:以降に入力された日本語を英語に英訳してください。)」という文字列を用意し、ユーザの入力した文字列より前に追加することでプロンプトを作成します。プロンプトの作成が完了したら、サービスはプロンプトを大規模言語モデルに渡します。そして、大規模言語モデルはプロンプトを基に、サービスが事前に定義した事項に従い、ユーザの入力した文字列を英訳して、サービスに応答を返します。以上が一般的な大規模言語モデルを使用した英訳サービスの例になります。 

図1.ユーザが入力した文字列

図1.ユーザが入力した文字列

図2. 大規模言語モデルを使用した、架空のAI英訳サービスにおける処理の流れ

図2. 大規模言語モデルを使用した、架空のAI英訳サービスにおける処理の流れ

プロンプトインジェクションの仕組み

ここからは前述のサービスをもとに、プロンプトインジェクションの基本的な仕組みを説明します。ある日、悪意あるユーザが本サービス上で図3のような文字列を入力しました。そして、文字列はサービス側で処理され、最終的に図4のようなプロンプトが出来上がります。このプロンプトは大規模言語モデルによってどのように解釈されるのでしょうか。

図3. 悪意あるユーザが入力した文字列とその日本語訳

図3. 悪意あるユーザが入力した文字列とその日本語訳

図4.最終的に作成されるプロンプト

図4.最終的に作成されるプロンプト

本プロンプトを受け取った大規模言語モデルは、指示通り、新たに挿入した英文より前の文章を無視し、点線以下の内容に対して回答を始めます。そして、本来サービスが目的としていない、不適切な回答(ここではランサムウェアの作成方法)を回答してしまいます。大規模言語モデルを使用した多くのサービスでは、このような目的外の利用や、不適切な回答がされないように、対策が取られています。しかし、前述の通り、入力が自然言語(人間が普段使用する言語)であることから、従来の他のインジェクション攻撃と比べ、機械的な攻撃の検出やブロックができないため、プロンプトインジェクションを防ぐのは難しいのが現状です。

プロンプトインジェクションの対策

先述したように、プロンプトインジェクションは自然言語の入力による攻撃のため、従来の他のインジェクション攻撃よりも検出やブロックが難しいといわれています。対策は難しいものの、大規模言語モデルを使ったサービスを外部提供する場合や自組織内でプライベートなサービスを利用する場合、外部の攻撃者によって開発者が意図しない情報を窃取されるリスクを低減するための対策を講じることが重要です。

現在、プロンプトインジェクションを検出・ブロックするための技術として、以下のような技術が開発されています。

  • インストラクション・ディフェンス(Instruction Defense)

    ユーザが入力した文字列に対して特定の指示を追加したプロンプトを生成し、後続のユーザが入力した文字列について大規模言語モデルに注意を促す手法
  • ポスト・プロンプティング(Post-Prompting)

    ユーザが入力した文字列を後ろに配置したプロンプトを生成する手法
  • ランダム・シーケンス・エンクロージャー(Random Sequence Enclosure)

    ランダムに生成された2つの文字列の間にユーザが入力した文字列を挟み込む手法
  • サンドイッチ・ディフェンス(Sandwich Defense)

    ユーザが入力した文字列に対して、2つのプロンプトを生成し、大規模言語モデルへ処理をさせる手法
  • XMLタギング(XML Tagging)

    <user_input>のようにXMLのエスケープ文字を使ったエスケープ処理を施し、ユーザが入力した文字列をカプセル化することで、特別な意味を持つ文字列を無効化する手法
  • LLMエバリュエーション(LLM Evaluation)

    ユーザが入力した文字列から生成されたプロンプトを実行する大規模言語モデルとは別のモデルを用意し、その別のモデルによってプロンプトを評価する手法

これらの技術を大規模言語モデルへ組み込むことによる対策に加え、ユーザからサービスへ入力された内容を検査することによるプロンプトインジェクションの検知・ブロックや限られたユーザからのアクセスのみを許可するようなアクセス制御もプロンプトインジェクションのリスク低減に有効な対策です。

まとめ

今後ますます業務利用が進むことが想定される生成AIですが、業務効率化などのメリットが期待できる一方でセキュリティリスクも孕んでいます。リスクの一つである「プロンプトインジェクション」はAIを使用したサービスに対し、不正な入力を行うことで、開発者が意図しない情報を引き出す攻撃です。自然言語を入力することから、従来の他のインジェクション攻撃と比較すると、機械的な攻撃の検出やブロックが難しいといった特徴があります。しかし、インストラクション・ディフェンスといった技術の組み込みやユーザの入力内容の検査、サービスへのアクセス制御といった対策を講じることによって、プロンプトインジェクションによる攻撃リスクを低減することが可能です。

ウェビナーによる解説

プロンプトインジェクションについての関連情報

Trend Vision One – Zero Trust Secure Access -AI Service Access™

パブリック及びプライベート生成AIサービスのプロンプト・レスポンスフィルタリング、アクセス制御を実現

資料「生成AIサービス利用にあたって必要な対策とは?」

組織が抱える生成AIサービス利用時のセキュリティリスクや課題と、それらのリスク・課題への対策について紹介します。

プロンプトインジェクションのトピック

関連情報