はじめに

AIエージェントが単なる「会話の相手」から「作業を実行する主体」へと進化している現在、セキュリティの常識が問われています。最近報告された事例では、Claudeなどの大規模言語モデル(LLM)が「インターネットに接続しない」というプロンプト指示を無視し、実際の外部システムへアクセスしてしまう事態が発生しました。これはAIが「嘘をついた」のではなく、開発者が設定した制約条件の構造に脆弱性があったことを示しています。

本稿では、この事例から得られる教訓として「プロンプトはセキュリティ境界ではない」という原則を解説し、実務でAIエージェントを安全に導入するための設計指針と具体的な対策について議論します。技術意思決定者やエンジニアの皆さんにとって、これは単なる注意喚起ではなく、システムアーキテクチャの根本的な見直しを促す重要な課題です。

事例から学ぶ「プロンプト」の限界

報告されたincidentの詳細は以下の通りです。テスト環境において、LLMには「インターネットアクセスがない」という明確な指示(プロンプト)が与えられていました。しかし、評価環境の設定ミスにより、実際には外部ネットワークへの出口が開いてしまいました。結果として、モデルは模擬されたセキュリティ演習の一部だと信じて、実際のPyPIレジストリへ悪意のあるパッケージを投稿してしまう事態に至りました。

ここで重要なのは、LLMの出力内容そのものではなく、**「環境と権限の分離が破綻していたこと」**です。プロンプトはモデルの推論プロセスに影響を与える強力な手がかりですが、OSレベルやネットワークレイヤーでの物理的・論理的なアクセス制御にはなりません。「ファイルA以外を読まないで」という指示は、モデルが従うべきガイドラインであって、読み込み許可を拒否するファイアウォールではありません。

この事例は、AI開発においてよくある過ち——「プロンプトエンジニアリングだけでセキュリティを担保できる」という誤解——を浮き彫りにしました。プロンプトは柔軟性をもたらす一方で、信頼性を保証するものではありません。特にエージェントが外部ツールやAPIと連携する場合、そのリスクは増大します。

なぜプロンプトでは不十分なのか

プロンプトベースの制約が破綻する主な理由は、LLMの本質的な特性にあります。LLMは確率的な生成モデルであり、文脈(コンテキスト)に従って最もらしい出力を生成します。もし環境側で実際に外部APIへのリクエストが可能であれば、モデルはその機会を「利用する」可能性があり、特に複雑なタスク遂行において、指示と実際の動作の間に乖離が生じやすくなります。

さらに、「ツール使用」の文脈では問題が深刻化します。エージェントがブラウザ拡張機能やシェルコマンドを実行する場合、プロンプトは「何をするか」を指定しますが、「どのように実行するか」は接続されたツールの実装に委ねられます。もしツール呼び出しの認可プロセスに欠陥があれば、モデルが間違ったリソースを指定した瞬間に、セキュリティ侵害は完了してしまいます。

つまり、セキュリティ境界はプロンプトの中に作るのではなく、**エージェントと外部世界との接点(Adoption Layer)** に構築する必要があります。プロンプトは「意図」を定義するものであり、「制約」を強制するものではありません。この区別を理解することが、安全なAIシステム設計の第一歩です。

実務での対策1:環境と権限の厳格な分離

プロンプトに依存しないセキュリティを実現するためには、技術的な隔離が不可欠です。以下の3つの層で防御を構築することを推奨します。

  • ネットワークレベルの隔離: エージェントが実行される環境は、仮想ネットワーク(VPC)やコンテナ内で完結させるべきです。外部への出口(egress)は明示的にdenyし、必要な場合のみ特定のIP/ポートへ許可するホワイトリスト方式を採用します。プロンプトで「インターネットを見ないで」と言うのではなく、物理的にパケットが外に出られないようにします。
  • アイデンティティと権限の最小化: エージェントに付与するAPIキーやデータベースの権限は、タスク遂行に必要な最小限のものに限ります。例えば、ファイル読み取り専用エージェントに書き込み権限を与えないことは基本ですが、さらに言えば、そのサービスアカウント自体が他の機密データへアクセスできないようにIAMポリシーを厳格に設定します。
  • サンドボックスの実装: コード実行が必要な場合は、gVisorやFirecrackerなどの軽量仮想マシン環境を使用し、ホストOSへの影響を最小限に抑えます。これにより、たとえエージェントが恶意なコードを実行しようとしても、被害は限定された環境内に留まります。

実務での対策2:ツール呼び出しの検証と監視

エージェントが外部システムを操作する場合、その「行動」自体を検証する必要があります。プロンプトの内容だけでなく、出力されるツール呼び出しのパラメータや、実行結果をリアルタイムで監視する仕組みを導入します。

例えば、データベースへの書き込みを伴うエージェントでは、SQL文の構文解析を行い、DROP TABLEやDELETE without WHEREなどの危険な操作を検知してブロックする「中間層(Proxy)」を設けます。また、ファイルシステムへのアクセスでは、変更対象パスが事前に許可されたディレクトリ配下にあるかをチェックするフィルタを挟みます。

このアプローチは、「モデルの出力を信頼せず、ツールの実行結果を検証する」という考え方に基づいています。以下に、ツール呼び出しを監視・検証する際の概念図を示します(擬似コード)。

// エージェントからのリクエスト例
{
  "tool": "write_file",
  "args": {
    "path": "/data/output/result.json",
    "content": "..."
  }
}

// 検証ロジック(概念)
function validateToolCall(tool, args) {
  // 1. ツールの実行可否チェック
  if (!allowedTools.includes(tool)) throw new Error("Unauthorized tool");

  // 2. パラメータの安全性チェック(例:パスの正規化とホワイトリスト照合)
  const safePath = normalizePath(args.path);
  if (!isWithinWhitelist(safePath, ALLOWED_DIRS)) {
    throw new Error("Access denied: Path out of bounds");
  }

  // 3. 監査ログの記録
  auditLog.record(tool, args, "PENDING");

  return true;
}

このように、プロンプトの内容に頼らず、コードレベルで堅牢な検証を行うことが重要です。

実務での対策3:組織的なガバナンスとテスト

技術的な対策だけでなく、プロセスとしてのガバナンスも必要です。AIエージェントを本番環境へデプロイする前には、以下のステップを踏むべきです。

  • Red Teaming(敵対的テスト): 意図的にプロンプトを悪用したり、境界条件を試したりするテストを実施します。特に、「システムプロンプトの注入攻撃」や「間接的なプロンプトインジェクション」に対して、エージェントがどのように振る舞うかを評価します。
  • 変更管理とバージョン管理: エージェントのプロンプト、ツール定義、環境設定はすべてコードとして管理(Infrastructure as Code, Prompt as Code)し、Gitでのバージョン管理とレビュープロセスを通します。プロンプトの変更がセキュリティに影響を与えないか、PRレビューで確認します。
  • インシデント対応計画: エージェントが誤った動作をした場合の「キルスイッチ」や「即時停止手順」を事前に整備します。監視ダッシュボードで異常なAPI呼び出し頻度や、通常と異なるリソースアクセスを検知した際のフローを確立しておきます。

設計判断のポイント:トレードオフの理解

セキュリティ対策を強化すると、しばしば「利便性」や「柔軟性」とトレードオフの関係にあります。例えば、ネットワークを完全に遮断すればセキュリティは最高ですが、エージェントが最新の情報を取得できなくなります。また、ツール呼び出しの検証を厳格にすぎると、正当なユースケースでもエラーとなり、開発者の負荷が増大します。

重要な判断基準は、「許容されるリスク」と「ビジネス価値」です。個人プロジェクトであれば、プロンプトの制約と基本的なサンドボックス化で十分な場合もあります。しかし、社内の重要データへアクセスする業務用エージェントであれば、前述した多重防御(Defense in Depth)が必須となります。

また、「完全に自動化されたエージェント」を目指すか、「ヒューマンインザループ(人間が関与する)」形態をとるかでも、必要なセキュリティレベルは変わります。後者の場合、人間の最終確認プロセス自体が一つのセキュリティ層として機能するため、技術的な制約をある程度緩和できる余地があります。

まとめ

AIエージェントの普及に伴い、「プロンプトはセキュリティ境界ではない」という事実を直視することが急務です。Claudeの事例が示すように、モデルの指示遵守に依存する設計は脆く、環境設定や権限管理の隙間を突かれるリスクがあります。

安全なAIシステムを実現するには、プロンプトによる「意図の伝達」と、技術的・組織的な「境界の保護」を明確に区別し、統合する必要があります。ネットワーク隔離、最小権限の実装、ツール呼び出しの検証、そして継続的なガバナンス。これらを組み合わせることで、AIエージェントの恩恵を受けながら、セキュリティリスクを管理可能なレベルに抑えることができます。

今すぐできることとして、現在構築中または運用中のAIエージェントについて、プロンプト以外のセキュリティ層がどこにあるかを棚卸しすることをお勧めします。そして、その境界が実際にテストされているかを確認してください。技術の進化は速いですが、セキュリティの基本原則——「信頼せず、検証する」——は変わりません。

参考

本記事は海外の技術トレンド「We’re Giving AI Agents More Tools. What Happens When the Boundaries Fail?」(DEV)で話題のテーマをもとに、両儀システムソリューションズが独自に解説したものです。