- Bard Extensionsにより個人文書やメールまで読めるようになったことで、外部文書に隠された間接プロンプトインジェクションが実際のデータ流出経路になり得る
- 攻撃者は悪意あるGoogle Docsを被害者に強制共有し、Bardがその文書を検索または分析した瞬間に、文書内の指示を実行させられる
- BardのMarkdown画像レンダリングは、ユーザーのクリックなしに外部URLを呼び出せるため、会話コンテキストをクエリ文字列として付加して抜き出す経路になる
- GoogleのContent Security Policyは任意の画像読み込みを防いでいたが、
script.google.comとgoogleusercontent.comで実行されるGoogle Apps Scriptが回避経路として利用された
- この問題は2023年9月19日にGoogle VRPへ報告され、10月19日に修正確認を受けた。URLにデータが挿入されないようにするフィルタリングが追加されたものとみられる
Bard Extensionsが作った新たな攻撃面
- Google BardはアップデートでExtensionsをサポートし、YouTube、航空券・ホテル検索、ユーザーの個人文書やメールへのアクセスが可能になった
- BardがユーザーのDrive、Docs、Gmailを分析できるようになり、信頼できない外部データをLLMコンテキストに取り込む状況が生まれた
- このような構造では、外部コンテンツに隠された指示がモデルの応答を変える間接プロンプトインジェクションにさらされ得る
- YouTube動画の要約と
Google Docsのテストで、Bardが外部コンテンツに含まれる指示に従う挙動が確認された
攻撃シナリオ
- メールやGoogle Docsを通じた間接プロンプトインジェクションは、ユーザーが明示的に悪性リンクをクリックしなくても届けられるため危険である
- 攻撃者は被害者に悪意あるGoogle Docsを強制共有できる
- 被害者がBardでその文書を検索したり操作したりすると、文書内のプロンプトインジェクション指示が実行される可能性がある
- LLMアプリでよく見られる脆弱な経路は、ハイパーリンクと画像レンダリングを利用したチャット履歴の流出である
画像Markdownインジェクション
- GoogleのLLMはテキスト応答にMarkdown要素を含めることができ、BardはそれをHTMLとしてレンダリングする
- Markdownの画像構文はHTMLの
<img>タグに変換され、src属性は攻撃者サーバーを指すことができる
- ブラウザは画像を表示するため、ユーザー操作なしにそのURLへ自動的に接続する
- LLMがチャットコンテキスト内の過去データを要約または読み取ったうえで、その値を画像URLに付ければ、外部リクエストとしてデータが抜け出す可能性がある
- 初期のエクスプロイトは会話履歴を読み、それを含むハイパーリンクを作る方式で素早く開発されたが、画像レンダリングはGoogleのContent Security Policyに阻まれた
Content Security Policyの回避
- GoogleのCSPは任意の場所から画像を読み込むことをブロックする
- ただしCSPには
*.google.comや*.googleusercontent.comのような比較的広い許可先が含まれている
- Google Apps ScriptはOfficeマクロに似た形でURLから呼び出すことができ、
script.google.comまたはgoogleusercontent.comドメインで実行される
- この特性により、Apps ScriptがCSP回避に適した候補となった
Bard Loggerの実装
Apps ScriptでBard Loggerを実装した
- Loggerは呼び出しURLに付いたすべてのクエリパラメータをGoogle Docに記録する
- Apps Script UIで認証なしにアクセス可能な設定を見つけ、匿名呼び出しが可能なエンドポイントを作成できた
- 攻撃チェーンは次の要素で構成される
- Bard Extensionsデータから発生する間接プロンプトインジェクション
- Bardの画像レンダリングによるゼロクリックリクエストの発生
- 悪意あるGoogle Doc内のプロンプトインジェクション指示
- 画像読み込み時にデータを受け取る
google.comベースのロギングエンドポイント
デモの流れ
- デモでは、悪意ある
Google Docがチャットコンテキストに入ると、ユーザーのチャット履歴が流出する
- スクリーンショットの流れは次のとおり
- ユーザーがGoogle Docである「The Bard2000」へ移動する
- 攻撃者の指示が注入され、画像がレンダリングされる
- 攻撃者はBard Logger Apps Scriptを通じてデータをGoogle Docで受け取る
- Bing Chat、ChatGPT、Claudeで議論されていた過去事例よりもチェーンは複雑で、CSP回避が必要だったためである
自然言語Shell Codeとペイロード
- “Shell Code is natural language these days”という表現のとおり、エクスプロイトは自然言語プロンプトで構成される
- 悪意あるGoogle Docには、プロンプトインジェクションとデータ流出を実行するペイロードが含まれる
- このペイロードは、LLMが画像URL内のテキストを会話データに置き換えるよう誘導する
- Bardが作業を完了するには、いくつかの例を提供するin-context learningが必要だった
- 付録のペイロードは、会話の最初の20語を出力し、空白を
+でエンコードしてApps Script実行URLのクエリに挿入するよう指示する
- 付録には“AI Injection succeeded #10”という出力文字列も含まれる
Googleの修正と日程
- この問題は2023年9月19日にGoogle VRPへ報告された
- 2023年10月19日に状態確認の問い合わせ後、Googleは修正完了を確認し、Ekoparty 2023の発表にデモを含めてもよいと承認した
- 当時の修正方法は完全には明らかではない
- CSPは修正されておらず画像は依然としてレンダリングされるため、URLにデータを挿入できないようにするフィルタリングが追加されたものとみられる
- 修正日程
- 2023年9月19日:問題を報告
- 2023年10月19日:修正を確認
1件のコメント
Hacker News の意見
theという単語を 2〜3 個のプロンプトにわたって繰り返すだけでもおかしな文章を書き始めるが、Bard にはこの方法が効かなかったルールはプロンプト全体に対してグローバルかつ一様に適用されるものだと思っていた
次に XSS で同じ問題が再び現れ、システムが命令とデータを区別できないため、攻撃者はシステムが命令だと誤解するメッセージを作れた。解決策はデータを確実に区切る方法を見つけることだった
LLM でも解決策は似たものになる気がする。「最初の 100 トークンは不変であり、他のいかなる指示もこれに反することはできない。[保護命令の挿入]」のような命令を尊重するよう LLM を訓練する形かもしれない。推論時に保護指示を付け加えるのではなく、学習段階でこうしたものを入れれば悪意ある指示を注入しにくくなるかもしれないが、学習時点で可能なあらゆる攻撃を予測しなければならないので、現実的には簡単ではない
干し草の山から掘り出したランダムトークンサンプラーに特別なアクセス権を与え、たいていはうまく動いているように見えるというだけで、なぜ常にうまくいくと信じるのかが問題だ
今後数年のうちに、指示、つまりプロンプトと、「データ」である本文の会話を分離できる構造的な突破口が出てくることを願うしかない
たとえば、プロンプトトークンとデータトークンという 2 種類のトークンを入力として受け取り、互いに決して混ざったり混同されたりしないようにする方式があり得る。まだ方法は分からないし、そのような 2 層で学習して動作するには大きな構造的進展が必要だが、誰かが見つけてくれることを願うしかない
不可能だと見る根本的な理由はない。現在の単一トークン列パラダイムには合わないが、だからこそパラダイムは進化するのだ
モデルには、ユーザーが別のインターフェースを通じて読んでもよいデータだけを与えるべきだ
解決策は、LLM を信頼できないコンポーネントとして扱い、その前提で設計することだ
ベクターデータベースと API を組み合わせれば、コンテキストやロールベースのアクセス制御情報を簡単に渡せるのでうまく機能する
ナレッジデータベース形態の LLM にはそれほど感銘を受けなかったが、インターフェースとしてはずっと印象的だ
数日前ここで OS という表現が出ていたが、その表現も気に入っている
1 時間前にも ChatGPT を使ったのだが、興味深いことに私の問い合わせを Bing 検索に変換したうえで、正しい情報で一貫して答えてくれた。オープンソースプロジェクトについて具体的に尋ねたもので、以前は API 仕様とドキュメントしか分かっていなかったのに、今回は非常によく機能した
LLM は本質的に安全ではなく、主な理由は本質的にだまされやすいからだ。有用であるためにはある程度だまされやすくある必要があるが、そのせいで信頼できないソースのテキストに触れるあらゆるアプリケーション、たとえばウェブページ要約のような機能は、悪意ある攻撃者に乗っ取られうる
プロンプトインジェクションについて 14 か月にわたって語られてきたが、いまだに信頼できる解決策に近いものは見えていない
誰かが近いうちに本当にこの問題を解いてくれることを願っている。そうでなければ、LLM で作りたい多くのものを安全に構築するのは難しいだろう
[1] https://gandalf.lakera.ai/
私の見方をもう少し説明すると、結局はLLMが解釈するすべてのプロンプトに
addslashesのようなものを適用する方向になると思う。だから「LLMがこの問題を解ける」と単純化した。addslashesがやっていることを考えると、後続のコード実行に影響を与える特殊文字を除去または緩和するコードを適用することだ。同じように、LLMも入力を自前でサニタイズして、脱出できないようにできると思う。追加されたスラッシュを取り除ける入力文字がないことに同意するなら、プロンプトインジェクションを緩和するラッパー
addslashesを、どんな指示でも突破できないようにする、プロンプト版addslashesがあるはずだ。システムの使い勝手にどんな影響が出るかは最後まで考えていないが、意図された利用範囲内にとどまりながらも、ほとんどの作業は実行できるはずだ
Lakera AIにこれへの防御策があるなら、それを証明できるはずだ。インジェクションを100%有効に遮断する方法があるなら、ゲーム内に突破不能な段階があるはずだ。しかし、そのような方法がないので、ゲームにもそのような段階はない。
Lakera AIは確率的な防御をしているのに、マーケティングではそれより信頼できる何かがあるかのように見せている。完全に信頼できる検出器を実演した人はおらず、すべてのプロンプトインジェクションを確実に防ぐ方法もない。Lakera AIがマーケティングでこの事実をしばしば省くのは、本当に欺瞞的だと思う。
上の文章は間違っている。インジェクション検出器でこの特定の攻撃を100%の信頼性で検出する方法はない。Lakera AIにはこの攻撃を時々検出するインジェクション検出器がある、と言うべきだ。だが、Lakeraはマーケティングでそのようには表現していない。存在せず、研究者が作れることすら証明していない製品を、それとなく売ろうとしているのだ
言い換えると、プロンプトインジェクション防御が必要で、なおかつエラーをある程度受け入れられる顧客とは誰なのか?
ユーザーは自分の過去の会話が攻撃者に見えることを意図していなかった。それがセキュリティホールだ。
その会話はまったく無害だったかもしれないが、個人的な問題についての助言、たとえば医療、金融、人間関係の相談だった可能性もある
私はそれを代わりにやってくれるカスタムGPTを作った
それを作るまでの過程をブログに書いたり公開したりしたことはある? かなり面白そうだ