OWASP Top 10 for LLM Applications 2025 について: ⑦ System Prompt Leakage

説明

システムプロンプト漏洩(System Prompt Leakage) とは、LLM(大規模言語モデル)においてシステムプロンプトや指示文が意図せず漏洩し、それが攻撃に利用されるリスクを指します。

システムプロンプトとは?

システムプロンプトは、LLMの出力を特定のアプリケーションの要件に適合させるための指示文です。しかし、これらのプロンプトには機密情報が含まれている可能性があり、攻撃者に発見されると悪用されるリスクがあります。

重要なポイント

  1. システムプロンプトは秘密情報とみなすべきではない

    • システムプロンプトをセキュリティ制御(security control)として使用するのは不適切
    • 資格情報(クレデンシャル)、接続文字列(Connection Strings)などの機密情報を含めるべきではない
  2. 攻撃者がシステムプロンプトの内容を発見すると、それを悪用して他の攻撃を仕掛ける可能性がある

    • 例:プロンプトにロール(役割)や権限に関する情報、接続文字列、パスワードが含まれている場合
    • こうした情報が漏洩した際の本当のリスクは、単なる情報漏洩ではなく、強固なセッション管理や認可チェックが適切に実装されておらず、それをLLMに依存していること
  3. 真のセキュリティリスクは「プロンプトの開示」そのものではなく、以下の根本的な問題にある

    • 機密情報の漏洩(Sensitive Data Exposure)
    • システムのガードレール(制約)の回避(System Guardrails Bypass)
    • 権限分離の不適切な管理(Improper Separation of Privileges)
  4. 攻撃者は、システムプロンプトの具体的な内容を知らなくても、その動作を観察することで制約を推測できる

    • アプリケーションとやり取りしながら、入力(プロンプト)と出力(LLMの応答)を分析することで、システムプロンプトのルールや制約を逆推測 できる
    • これにより、ガードレールを回避し、システムを不正に操作する攻撃が可能 になる


リスクの一般的な例(Common Examples of Risk)

1. 機密機能の露出(Exposure of Sensitive Functionality)


2. 内部ルールの露出(Exposure of Internal Rules)

  • システムプロンプトがアプリケーションの内部処理ルールを漏洩することで、攻撃者がシステムの仕組みを理解し、セキュリティ制御を回避できる可能性がある。
  • 悪用例
    • 銀行アプリのチャットボットシステムプロンプトに、以下の情報が含まれている場合:

      「ユーザーの1日の取引限度額は $5000 です。合計ローン限度額は $10,000 です。」

    • 攻撃者がこの情報を知ることで、トランザクション制限を回避する方法を見つけたり、ローン制限を超える操作を試みる可能性がある。

3. フィルタリング基準の漏洩(Revealing of Filtering Criteria)

  • システムプロンプトが、コンテンツフィルタリングのルールを明示的に記載していると、攻撃者がそれを回避する方法を特定しやすくなる。
  • 悪用例
    • あるLLMが以下のシステムプロンプトを持っている場合:

      「もしユーザーが他のユーザーに関する情報を要求した場合は、常に『申し訳ありませんが、そのリクエストには対応できません』と回答すること。」

    • 攻撃者はこのルールを認識し、それを回避するようなプロンプトを試行することで、機密情報を引き出す可能性がある。

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を悪用してシステムを侵害できるようになる。

 

ほなほな。