説明
システムプロンプト漏洩(System Prompt Leakage) とは、LLM(大規模言語モデル)においてシステムプロンプトや指示文が意図せず漏洩し、それが攻撃に利用されるリスクを指します。
システムプロンプトとは?
システムプロンプトは、LLMの出力を特定のアプリケーションの要件に適合させるための指示文です。しかし、これらのプロンプトには機密情報が含まれている可能性があり、攻撃者に発見されると悪用されるリスクがあります。
重要なポイント
-
システムプロンプトは秘密情報とみなすべきではない
- システムプロンプトをセキュリティ制御(security control)として使用するのは不適切
- 資格情報(クレデンシャル)、接続文字列(Connection Strings)などの機密情報を含めるべきではない
-
攻撃者がシステムプロンプトの内容を発見すると、それを悪用して他の攻撃を仕掛ける可能性がある
- 例:プロンプトにロール(役割)や権限に関する情報、接続文字列、パスワードが含まれている場合
- こうした情報が漏洩した際の本当のリスクは、単なる情報漏洩ではなく、強固なセッション管理や認可チェックが適切に実装されておらず、それをLLMに依存していること
-
真のセキュリティリスクは「プロンプトの開示」そのものではなく、以下の根本的な問題にある
- 機密情報の漏洩(Sensitive Data Exposure)
- システムのガードレール(制約)の回避(System Guardrails Bypass)
- 権限分離の不適切な管理(Improper Separation of Privileges)
-
攻撃者は、システムプロンプトの具体的な内容を知らなくても、その動作を観察することで制約を推測できる
- アプリケーションとやり取りしながら、入力(プロンプト)と出力(LLMの応答)を分析することで、システムプロンプトのルールや制約を逆推測 できる
- これにより、ガードレールを回避し、システムを不正に操作する攻撃が可能 になる
リスクの一般的な例(Common Examples of Risk)
1. 機密機能の露出(Exposure of Sensitive Functionality)
- アプリケーションのシステムプロンプトに、機密情報や非公開の機能が含まれている場合、それが攻撃者に悪用されるリスクがある。
- 例:
- 悪用例:
- システムプロンプトにデータベースの種類(例:MySQL、PostgreSQL)が含まれていると、攻撃者がその情報を利用してSQLインジェクション攻撃を計画できる。
2. 内部ルールの露出(Exposure of Internal Rules)
- システムプロンプトがアプリケーションの内部処理ルールを漏洩することで、攻撃者がシステムの仕組みを理解し、セキュリティ制御を回避できる可能性がある。
- 悪用例:
3. フィルタリング基準の漏洩(Revealing of Filtering Criteria)
- システムプロンプトが、コンテンツフィルタリングのルールを明示的に記載していると、攻撃者がそれを回避する方法を特定しやすくなる。
- 悪用例:
4. 権限とユーザーロールの開示(Disclosure of Permissions and User Roles)
- システムプロンプトがアプリケーションの内部のロール構造や権限レベルを開示してしまうと、攻撃者が権限昇格攻撃を試みる可能性がある。
- 悪用例:
- システムプロンプトに以下の記述がある場合:
「管理者(Admin)ユーザーは、すべてのユーザーデータを変更できるフルアクセス権限を持っています。」
- 攻撃者がこの情報を知ることで、管理者アカウントの権限を乗っ取るための権限昇格(Privilege Escalation)攻撃を試みる可能性がある。
- システムプロンプトに以下の記述がある場合:
防御および緩和策(Prevention and Mitigation Strategies)
1. システムプロンプトから機密データを分離する(Separate Sensitive Data from System Prompts)
- APIキー、認証情報(Auth Keys)、データベース名、ユーザーロールや権限構造などの機密情報を、システムプロンプトに含めないようにする。
- 機密情報は、LLMが直接アクセスできない安全なシステムに外部化し、必要に応じて制御された方法で取得する。
2. システムプロンプトに厳密な動作制御を依存しない(Avoid Reliance on System Prompts for Strict Behavior Control)
- LLMはプロンプトインジェクション攻撃の影響を受けやすいため、システムプロンプトだけでセキュリティ制御を実装するのは危険。
- 代わりに、以下のようなLLM外部のシステムを利用してセキュリティを強化する:
- コンテンツフィルタリングを外部で実施(LLMの出力を別のシステムでチェック)
- 認可や認証を別システムで管理(LLMが直接権限管理を行わないようにする)
3. ガードレール(Guardrails)を実装する(Implement Guardrails)
- LLMの外部にガードレール(制約管理システム)を設け、LLMの出力を監視・制御する。
- 例:
- LLMが「システムプロンプトの内容を開示しないように学習」されていても、完全な防御にはならない。
- そのため、LLMの出力をチェックし、意図しない情報漏洩を検知・ブロックする独立したシステムを導入するのが望ましい。
4. LLMとは独立したセキュリティ制御を適用する(Ensure that Security Controls are Enforced Independently from the LLM)
- 重要なセキュリティ制御(例:権限分離、認可チェック)をLLMに委ねないことが重要。
- 具体的な対策:
- 認可チェックはLLMではなく、外部システムで実施
- 異なる権限レベルのタスクは、異なるLLMエージェントに分離(最小権限の原則(Principle of Least Privilege)を適用)
- 例:あるエージェントが管理者レベルの操作を実行する場合、それは一般ユーザーのエージェントとは別のエージェントとして設計し、適切な権限管理を行う
攻撃シナリオの例(Example Attack Scenarios)
シナリオ #1(Scenario #1)
- LLMのシステムプロンプトに、特定のツールへアクセスするための認証情報(クレデンシャル)が含まれている。
- このシステムプロンプトが攻撃者に漏洩してしまう。
- 攻撃者は漏洩した認証情報を利用し、不正アクセスや他の悪意ある目的に使用する。
シナリオ #2(Scenario #2)
- LLMのシステムプロンプトには、以下の制限事項が含まれている。
- 攻撃的なコンテンツの生成を禁止
- 外部リンクの生成を禁止
- コードの実行を禁止
- 攻撃者は、システムプロンプトの内容を抽出(漏洩) することに成功する。
- その後、攻撃者はプロンプトインジェクション攻撃を利用し、
- システムプロンプトの制限を回避
- リモートコード実行(Remote Code Execution, RCE)を可能にする
- これにより、LLMを悪用してシステムを侵害できるようになる。
ほなほな。