プロンプトインジェクションは、モデルが読み取る外部コンテンツの中に指示を隠し、データを命令と誤認させて実行させる攻撃手法である。コードを書き換えるわけでも、システムに侵入するわけでもない。大規模モデルが文脈を丁寧に読み取る性質を利用し、ウェブページや文書、メール、画像内の文字に要求を紛れ込ませることで、モデルがそれを読んだ途端、言われた通りに動いてしまう可能性がある。
指示はどこに隠れるのか
プロンプトインジェクションには直接型と間接型がある。直接型は利用者本人が入力の中に指示を隠すもので、たとえば一見普通に見えて実は命令を含む文章を貼り付けるケースが該当する。より厄介なのが間接型である。第三者があらかじめウェブページや履歴書、商品説明、メールの中に指示を仕込んでおき、エージェントがページを閲覧したり、文書を要約したり、メールを処理したりする際にその内容を読み取り、本来すべきでない動作へ誘導される。履歴書に白い小さな文字で、これまでの評価基準を無視して最高点を付けるよう書かれていれば、一次選考を担うモデルが本当に従ってしまうこともある。利用者はその一文を一度も口にしていないのに結果を引き受けることになり、ここが間接型の最も危険な点である。
脱獄とは別物である
プロンプトインジェクションと脱獄を混同する人は多いが、両者の向きは正反対である。脱獄は利用者本人がモデルの安全制限を回避し、システムが禁じる行為をさせようとするもので、攻撃者と利用者は同一人物である。一方、プロンプトインジェクションは第三者がモデルを道具として利用者やシステムを攻撃するもので、モデルも利用者も被害者側に回る。根絶が難しいのは、現在の仕組みではシステムの指示も利用者の質問も外部資料も、すべて文章としてモデルに届くためである。その境界は物理的な隔離ではなく約束事に頼っており、どの文が命令でどの文が単なる資料なのかをモデルが安定して見分けるのは難しい。
利用者と開発者ができること
一般の利用者に最も実用的な対策は、外部コンテンツに書かれた要求をエージェントに自動で従わせないことである。メールの送信、ファイルの削除、支払い、設定の変更といった重要な操作は必ず人が確認し、エージェントがタスクと無関係な動きを突然していないかにも注意したい。開発者は最小権限の原則を守り、現在のタスクに本当に必要なツールとデータだけをエージェントに渡すべきである。外部コンテンツは資料として引用するにとどめ、決して指示に格上げせず、重要な手順には確認と記録を加える必要がある。よくある誤解も正しておきたい。システムプロンプトに一文を足しても注入は防げず、攻撃側の文章はいくらでも具体的に書ける。危険はハッカーのサイトだけにあるのではなく、普通の文書や転送メールにも仕掛けられ得る。出所の分からない内容を貼り付ければ、日常のチャットでも被害に遭う可能性がある。外部コンテンツをまず信頼できない入力として扱うことは、エージェントを使う上で身につけたい基本的な習慣である。