OpenAI

セキュリティ研究者らは、OpenAI Codexのサンドボックスから抜け出す2つの方法を発見した。そのうちの1つは、Codexの最も厳重に制限されたモードからでも、承認の確認画面が表示されず、画面上に何も表示されないまま、開発者のマシン上でコマンドを実行できるものであった。

Accomplish AIのOren Yomtov氏によると、これらの脆弱性は8月12日にOpenAIに報告され、8日以内に修正された。

2つの脆弱性のうちより深刻なものは、研究者たちが「Heapjack」と呼ぶもので、日常的な操作をリモートコード実行へと変貌させます。具体的には、Codexで他人のリポジトリを開き、そのコードについて質問すると、そのリポジトリを作成した人物が、あなたのコンピュータ上でサンドボックスを突破した状態でコマンドを実行できるようになります。

CodexはOpenAIのコーディングエージェントであり、コマンドラインツールおよびデスクトップアプリとして利用可能です。競合するエージェントと同様、信頼できないコードがシステム全体に影響を与えないよう、モデルの動作をサンドボックス内で実行します。これら2つの脱獄手法は、いずれもその境界を内部から突破することで機能します。

Heapjack

Yomtov氏の報告書に記載されているHeapjackの手法は、node_replと呼ばれるコンポーネントを標的としています。このコンポーネントは、Codex Desktopのインストール時にグローバルな「~/.codex/config.toml」ファイルに書き込まれます。

これに対するオプトイン機能や無効化設定は存在せず、このエントリは共有設定ファイル内に存在するため、通常のCodex CLIユーザーも、一切の確認を求められることなく同じツールを継承することになります。

node_repl は、2 つの別々の JavaScript 実行コンテキストを保持する単一の Node.js プロセスを実行します。1 つは信頼済みであり、OpenAI 独自のコードが含まれています。もう 1 つは信頼されておらず、エージェントのコードを実行します。信頼済みコンテキストは、実行のたびに新たに生成されたランダムなトークンを提示することで、その信頼性を証明します。

問題は、両方のコンテキストが1つのNodeプロセス内に存在し、1つのメモリヒープを共有しているため、トークンは単にメモリ上に存在する文字列に過ぎず、信頼されていない側からも読み取られてしまう点にあります。

The Heapjack attack path (​​​​​Accomplish.ai)
Heapjack攻撃の手口(Accomplish.ai)

信頼できないコードは『v8.getHeapSnapshot()』を使用してヒープのスナップショットを取得し、UUIDのような形式の文字列をすべて試します。推測が間違っていると「not authorized」が返されます。正しいトークンに誤った引数が渡された場合、実際の検証エラーが返され、これにより攻撃者はトークンが正しいことを知ることができます。

トークンを取得すると、信頼できないコードは、信頼されたコンテキストがネイティブでサンドボックス化されていない親プロセスと通信するために使用するのと同じパイプに、独自のリクエストを書き込みます。

親プロセスはトークンを確認し、有効なものであると判断すると、処理を実行します。この概念実証(PoC)では、システムの「open」コマンドを使用して、Codexのプロセスツリーの外側でアプリケーションを起動しました。同様のアクセスにより、あらゆるUnixソケット(特にDockerデーモンソケットが明らかな標的となります)や、グローバル設定ファイルを編集するためのツールにもアクセス可能です。

これらすべては、エージェントが一切書き込みを行ってはならない最も厳格なサンドボックスモードである「読み取り専用」モードで実行されます。

Overpatch

2つ目の脆弱性「Overpatch」は、オープンソースのCodex CLIに存在します。ワークスペース書き込みモードでは、エージェントはプロジェクトフォルダ内でのみ書き込みが可能であり、ホームディレクトリを指定したシェルコマンドは拒否されます。

研究者らは、Codex独自のパッチ適用ツールである`apply_patch`を悪用し、意図に反してホームディレクトリへの書き込みを可能にしました。

このツールは、パッチで指定された各パスの親フォルダへの書き込みアクセス権を付与します。’/tmp’ を指定すれば、ディスクのルートへの書き込みアクセス権が付与されます。

実際に動作するエクスプロイトでは、2つの変更を含むパッチが使用されます。1つは「/tmp」を指定し、権限を拡大する以外に有用な動作を行わないもので、もう1つはホームディレクトリへのシンボリックリンクを介して「.zshrc」に1行を追加するものです。

最初の変更を削除すると、書き込みは拒否されます。これがあると、開発者が次に開くターミナルで、攻撃者の記述された行がサンドボックス外で実行されてしまいます。

根本的な誤りは同じ

どちらのバグも、その構造が共通しています。つまり、強制メカニズムが、本来強制すべき対象の内部に存在していたのです。apply_patch は、攻撃者から提供された入力に基づいて自身の権限を決定していました。node_repl は、信頼できるコードと信頼できないコードを区別するための秘密情報を、信頼できないコードと同じメモリ内に保持していました。

いずれの場合も、サンドボックスは内部から「何かを通すように」と指示されていたのです。

この種のバグは新しいものではない。2026年7月、Pillar Securityの研究者たちは、Cursor、Codex、Gemini CLI、およびGoogleのAntigravityにおいて、同じ概念を実証した。そこでは、サンドボックス内に留まるエージェントがファイルを書き込み、その後、サンドボックス外の信頼できるツールがそのファイルを実行するというものだった。

Yomtov氏のXへの投稿に対し、あるコメント投稿者は「V8のコンテキストはグローバル変数を隔離するものであって、メモリを隔離するものではない。したがって、そのサンドボックスは実際には、ヒープが決して承諾しなかった約束に過ぎなかった」と記した。 また別のコメント投稿者は、信頼境界を「間仕切り」と呼んだ。デフォルトで有効になっているこの動作自体も批判の対象となり、ある投稿者は「なぜ信頼できないJavaScriptから特権トークンにアクセスできるのか」と疑問を呈した。

対処法

Accomplishによると、OpenAIはCodex Desktopビルド26.818.21641でHeapjackを、Codex CLI 0.149.0でOverpatchを修正した。

ユーザーはこれらのバージョン以降に更新する必要があります。Yomtov氏は、自身の報告から8日以内に両方の問題を解決したOpenAIの対応を評価しました。

本記事の公開に先立ち、OpenAIにコメントを求めた。