プロンプトインジェクションとは
Prompt Injection
悪意ある指示を入力に紛れ込ませ、LLMに開発者の意図しない挙動をさせる攻撃手法
ひとことで言うと
悪意ある指示を紛れ込ませて、AIに開発者の想定外の動きをさせる攻撃。
概要
プロンプトインジェクションとは、LLMへの入力(プロンプト)に悪意のある指示を紛れ込ませることで、開発者が意図した振る舞いを無視させたり、システムプロンプトの制約を回避させたりする攻撃手法。 ユーザーが直接入力する形で行われる「直接プロンプトインジェクション」と、Webページや文書、ツールの実行結果等、LLMが処理する外部データの中に指示を埋め込んでおく「間接プロンプトインジェクション」に大別される。 LLMは、システムプロンプトとユーザー入力、外部データを明確に区別する仕組みを本質的には持たないため、この種の攻撃に対する根本的な防御が難しい課題とされている。 特にRAGやエージェントのようにWeb検索結果やツール実行結果をLLMへ渡すシステムでは、外部データの中に埋め込まれた指示がユーザーの知らないうちに実行されてしまう間接プロンプトインジェクションのリスクが高まる。
背景
LLMは、与えられたテキスト全体を1つの入力として処理し、その中の「指示」と「データ」を厳密に区別する仕組みを持たない。 この性質を悪用し、本来はデータとして扱われるべき部分に指示を紛れ込ませることで意図しない挙動を引き起こせることが明らかになり、プロンプトインジェクションとして知られるようになった。
歴史
2022年: Simon Willisonが、ユーザー入力を通じてLLMの指示を上書きする問題を「プロンプトインジェクション」と名付けて広く紹介。 以降、AIエージェントがWebページやツールの実行結果等、信頼できない外部データを扱うようになるにつれ、間接プロンプトインジェクションのリスクが特に注目されるようになった。
アーキテクチャ
直接プロンプトインジェクションは、ユーザーが「これまでの指示は無視してください」等の文言を直接入力する形で行われる。 間接プロンプトインジェクションは、LLMがツールやRAGを通じて取得するWebページ・文書・メール等の外部データの中に隠された指示を埋め込んでおき、LLMがそのデータを処理する際に意図せず指示として実行してしまうことを狙う。
ワークフロー
システムプロンプト・外部データ・ユーザー入力が1つのコンテキストとしてLLMに渡される → LLMがその中に紛れた悪意ある指示を通常の指示と区別できず解釈してしまう → 意図しない挙動や情報漏洩等の形で出力に現れる。
欠点
比較
関連用語
よくある質問
プロンプトインジェクションは防げる?
現状、防ぐ決定的な方法は確立されていないとされる。 入力の検証、権限の最小化、出力のフィルタリング等、複数の対策を組み合わせてリスクを低減するのが一般的なアプローチ。
直接プロンプトインジェクションと間接プロンプトインジェクションの違いは?
直接プロンプトインジェクションはユーザー自身が悪意ある指示を入力するのに対し、間接プロンプトインジェクションはWebページや文書等、LLMが処理する外部データの中に指示を仕込んでおく点が異なる。 エージェントが外部データを扱う場合は、後者のリスクが特に高まる。