OpenAI Codex: 機密ファイルの除外をめぐる議論

OpenAI Codex: 機密ファイルの除外をめぐる議論

OSレベルのサンドボックス化が唯一の信頼できるセキュリティ対策である

AIエージェントのハーネス内にブロックリストや .agentignore ファイルを実装することは、LLMがツール使用を通じて高レベルの制限を回避できるため、セキュリティとしては不十分です。真の隔離には、コンテナ、仮想マシン、または厳格なUnix権限を使用して、セキュリティ境界をアプリケーション層からオペレーティングシステム層に移動させる必要があります。

コミュニティメンバーが指摘しているように、エージェントがシェルにアクセスできる場合、rg (ripgrep) のようなコマンドを使用してファイルシステム全体から機密文字列を検索することができます。特定の read_file ツールが制限されていても、機密データを含むシェルコマンドの出力は依然としてモデルにアップロードされます。

"What if the model runs 'rg foo', and one of those files contains the string 'foo'? It uploads the tool output, which includes the file contents. And so, the only solution is to make it so the codex process is unable to access those files."

推奨される隔離戦略

機密情報の流出を防ぐために、開発者はいくつかのアーキテクチャパターンを提案しています:

  • Containerization: コンテナ内でエージェントを実行し、機密ファイルをマウントしない、あるいは Apptainer のようなツールを使用して、タスクに必要な特定のレポジトリのみをマウントする。
  • Clean Virtual Machines: 各エージェントとの会話のために専用のクラウドVMを立ち上げる。これにより、エージェントがローカルマシンや信頼されたコンテキストにアクセスできず、明示的に許可されていない限りリモートのオリジンと通信できないことが保証される。
  • Opt-in Access: 「オプトアウト」(ブロックリスト)モデルから、「オプトイン」(許可リスト)モデルへと移行し、セッション開始前にユーザーが設定したベースフォルダのみをサンドボックスにコピーする。
  • Unix Permissions: chmod を使用して、Codexプロセスを実行しているユーザーアカウントが機密ディレクトリに対する読み取り権限を持たないようにする。

.agentignore とブロックリストの限界

.gitignore と同様の標準的な .agentignore ファイルへの要望はありますが、技術的な専門家は、そのような機能は「誤った安心感」を与えるだけだと主張しています。

なぜブロックリストは失敗するのか

  1. 予測不能性: LLMは高レベルの制限を回避して作業することが可能です。プロセス内で強制される制限は、悪意のある、あるいはハルシネーションを起こしているエージェントによって侵害される可能性があります。
  2. Tool Redundancy: エージェントが開発しているコードが実行のために .env ファイルへのアクセスを必要とする場合、エージェントはメモリ内、あるいはデバッグ中のアプリケーションの出力を通じて、それらの値を観察できる可能性があります。
  3. 不完全性: ユーザー定義のブロックリストが、機密データへのあらゆる可能なパスを網羅するのに十分な包括性を持つことは、統計的に見て非常に困難です。

これらのセキュリティ上の欠陥があるにもかかわらず、一部の人は、セキュリティのために依存するものではないという前提であれば、 .agentignore ファイルは、エージェントが不適切なファイルに対してトークンを浪費するのを避けるための「ヒント」として価値があると考えています。

機密情報の管理に関する代替アプローチ

エージェントのサンドボックス化に加えて、議論では、根本的な原因はファイルシステム上に機密情報がどのように保存されているかにあることが多いと強調されています。

  • Eliminate .env Files: リポジトリ内のプレーンテキストファイルにAPIキーを保存することをやめる。代わりに、機密情報は実行時に注入されるか、ssh-agent のようなプロキシを介して処理されるべきであり、ベアラートークンの露出を避けるべきである。
  • Runtime Injection: 実行中に機密情報を環境変数に直接注入することで、エージェントが発見できるファイルとして存在させないようにする。

コミュニティ主導のツールとパッチ

いくつかの開発者は、これらのギャップを埋めるために、オープンソースプロジェクトやローカルパッチを共有しています:

  • Rumpelpod: リモート/セキュアな devcontainers で動作するエージェント用オーケストレーター。
  • YoloAI: FOSS AI サンドボックス。
  • Drop: AIエージェントから機密ファイルを隠すために設計された Linux サンドボックス。
  • Custom Patches: 一部のユーザーは、ルール強制を統一するために、ローカルパッチを実装しています。これは、ツールベースの制限とシェルベースの制限を分離するのではなく、単シップロファイル(例:bwrap ユーザー名前空間を使用)によって、すべてのファイルシステムアクセスをgovernor(管理)する単一のサンドボックスプロファイルに置き換えるものです。 ",

Sources