𝗟𝗟𝗠 𝗣𝗿𝗼𝗺𝗽𝘁 𝗜𝗻𝗷𝗲𝗰𝘁𝗶𝗼𝗻 𝗮𝗻𝗱 𝗚𝘂𝗮𝗿𝗱𝗿𝗮𝗶𝗹 𝗦𝗲𝗰𝘂𝗿𝗶𝘁𝘆
LLMには指示とデータの間に明確な境界がありません。コンテキストウィンドウ内のすべては、単一のトークンストリームです。プロンプトインジェクションは、攻撃者のデータが指示として機能するときに発生します。フィルタリングだけで安全を確保することはできません。多層防御(defense-in-depth)によって管理する必要があります。
一般的な防御策の失敗例:
- キーワード・ブロックリスト:攻撃者は類義語、綴りの間違い、または異なる言語を使用して、これらを回避します。文字列をフィルタリングしても、意図をフィルタリングすることはできません。
- 出力の秘匿化(Output Redaction):攻撃者は機密情報を断片化したりエンコードしたりすることで、リテラルな文字列一致を回避できます。
- LLMジャッジ:別のモデルが、機密情報が無害であると信じ込むようにソーシャルエンジニアリングされる可能性があります。
- 人間によるレビュー:人間が見るのはレンダリングされたテキストであり、生のバイト列ではありません。ASCIIスミグリング(ASCII Smuggling)で使用される隠し文字を見ることはできません。
ASCIIスミグリングは重大な脅威です。これはUnicodeタグやゼロ幅スペースのような不可視文字を使用して指示を隠します。モデルはそれらを読み取りますが、人間には何も見えません。これにより、メールやカレンダーを介したなりすましやデータの持ち出しが可能になります。
アプリケーションを防御する方法:
- 生のペイロードをサニタイズする:制御文字やゼロ幅文字を、モデルに到達する前に除去します。
- ホワイトリストを使用する:悪意のあるものを追いかけるのではなく、必要な特定のUnicodeカテゴリを定義します。
- データを正規化する:すべての入力に対してNFKC正規化を使用します。
- 機密情報を最小限にする:モデルに必要でない場合は、コンテキストウィンドウに機密データを入れないでください。
- RAGを信頼できないものとして扱う:モデルのために取得するドキュメントはすべて、潜在的なインジェクション・ベクトルであると想定してください。
- 異常を監視する:表示上の長さが生のコードポイント数と異なる入力をフラグ立てします。
セキュリティは単なるモデルの欠陥ではなく、パイプラインの欠陥です。解決策はアプリケーションコードの中にあります。
出典: https://dev.to/geekaara/llm-prompt-injection-guardrail-security-glm
オプションの学習コミュニティ: https://t.me/GyaanSetuAi