この記事はプロンプトインジェクションを説明したうえで、NVIDIA AI Red Team が調査した 3 つの LangChain チェーンに対してそれを用い、モデルの出力が外部サービスにつながれたとき、この手法で攻撃者が何を得られるかを示している。記事は、脆弱性がそれらのチェーンにあるのであって、LangChain のコアエンジンや、チェーンが呼び出すサードパーティの API にあるのではないと明言している。
仕組みの説明はささやかな例から始まる。靴屋のチャットボットを定義するプロンプトの後ろに顧客の入力がそのまま続くため、「IGNORE ALL PREVIOUS INSTRUCTIONS」と書き、その後に自分の指示を続けた顧客は、ボットに自分を罵倒させることができる。これ自体は無害であり、攻撃がもたらす結果ではなく攻撃の形を示すものとして提示されている。結果が生じるのは、モデルの出力が単にユーザーに表示されるのではなく、別の何かへの呼び出しを組み立てるのに使われるときである。
3 つの脆弱性はすべて同じ構造を持つ。チェーンがユーザー入力を LLM へのリクエストに変換し、その結果を解釈して外部サービスへの呼び出しにし、返ってきたものを整形する。モデルの出力を制御する攻撃者はチェーンが次に送るものを制御でき、そのサービスがチェーンに与えている権限はすべて攻撃者の手の届くものになる。記事の一般的な結論は個々のバグからではなくこの構造から導かれている。すなわち、プロンプトの中では制御とデータを分離できないため、モデルの生成物はすべて悪意を含みうるものとして扱い、それを使って何かをする前にサニタイズしなければならない、というものである。
要点
- プロンプトインジェクションは、攻撃者がモデルの出力を操作できるようにする LLM 特有の攻撃手法として説明され、モデルが外部サービスに到達できるようにするプラグインによってその危険性が増すとされる。
llm_mathチェーンでは、その Python インタプリタを通じてリモートコード実行が可能だった。数学の問題ではなく命令として書くと、モデルは攻撃者が選んだコードを出力し、評価エンジンがそれを実行する。これは CVSS スコア 9.8 の CVE-2023-29374 として登録されており、この特定のエクスプロイトはバージョン 0.0.141 で修正された。APIChain.from_llm_and_api_docsチェーンでは、サーバーサイドリクエストフォージェリが可能だった。新しいクエリを宣言すると、取得先がシステムプロンプトにある URL とは別の URL にリダイレクトされる。CVE-2023-32786 として登録されており、執筆時点ではバージョン 0.0.193 まで(同バージョンを含む)悪用可能と報告されていた。SQLDatabaseChainでは、同じ「これまでの指示をすべて無視せよ」という書き方によって SQL インジェクションが可能だった。CVE-2023-32785 として登録されており、こちらもバージョン 0.0.193 まで(同バージョンを含む)悪用可能と報告されていた。- 記事が挙げる根本原因は、LLM を扱う際には制御プレーンとデータプレーンを分離できないことである。1 つのプロンプトに両方が含まれており、インジェクションはデータが期待される場所に制御を差し込む。記事は、これをパッチで直せるバグとしてではなく、プロンプトインジェクション攻撃が「効果的に緩和できない」理由として扱っている。
- 記事の第一の推奨は、LLM の生成物はすべて悪意を含みうるものであり、モデルの入力にテキストを入れられる者なら誰でもそれを制御しうるものとして扱い、パースする前に検査しサニタイズすることである。
- 外部サービスの呼び出しは厳密にパラメータ化し、最小権限のコンテキストで行うべきであり、プロンプトに寄与したエンティティの中で最も低い権限レベルを、その後の各呼び出しに適用すべきだとしている。
- 合理的に避けられる場合には LLM を外部リソースに接続しないよう勧め、複数のサービスを呼び出す多段チェーンについては特に厳格なセキュリティレビューが必要だとしている。
- 認可を必要とするプラグインは、一般に他のプラグインが呼び出された後には使うべきではないと勧めている。その理由として、プラグインをまたいだ認可は非常に複雑であることを挙げている。
- 3 つのエクスプロイトはすべて、ベースモデルとして OpenAI の
text-davinci-003API に対して実行されたものであり、記事は、他のモデルではプロンプトにわずかな修正が必要になるだろうと述べている。
背景
この記事は NVIDIA の技術ブログに掲載されており、同社のレッドチーム自身の調査結果を報告している。記事は公開で開示した理由を説明している。脆弱性は潜在的に深刻ではあるがコアコンポーネントではなく特定のチェーンに限られていること、プロンプトインジェクションは当時すでに攻撃手法として広く理解されていたこと、そして影響を受けるコンポーネントが最新バージョンから削除されていたことである。記事は、リモートコード実行の問題が複数の関係者によって独立に発見されたこと、そして NVIDIA が、記事の言う「即時の緩和策がなかった」ことを受けて 2023 年 3 月末に CVE を要請したことを記録している。最後に LangChain チームの協力に謝意を示し、このやり取りを新しい領域における協調的な脆弱性開示の良い例だと述べている。