深い紺黒の背景に描かれた抽象的なイラスト:左側には背の高い密閉ガラスチャンバーが立ち、その内部は淡い青に光る結晶質の素材でびっしり満たされている。ガラス底部付近の傷から一本の鮮やかなシアンの細線が漏れ出し、右へ伸びるヘアライン仕上げの鋼管に沿って走り、管を離れて暗い空間の中で三本の短い琥珀色の糸に分岐する。かすかな琥珀色の弧がガラス内部に閉じ込められたまま残っている。文字、数字、人物、組織のロゴは一切表示されていない。OrcaRouterのロゴが右下隅に合成されている。
AI Safety Incidents

OpenAI Codexサンドボックスから抜け出す2つの方法:HeapjackとOverpatch

著者

Rowan Sterling

公開日

最新モデル · 20すべてのモデルを見る →
ベンチマーク:Artificial Analysis · 毎日更新
すべての記事に戻る

2026年9月15日、Accomplish AIのプリンシパル・セキュリティ研究者であるOren Yomtovは、OpenAIのコーディングエージェントCodexを取り囲むサンドボックスから抜け出す2つの別々の方法について、技術的報告を公開した。両方とも2026年8月12日にOpenAIへ報告され、8日以内に修正されたと、彼の記事は伝えている。Codex Desktopビルド26.818.21641のHeapjackと、Codex CLI 0.149.0のOverpatchである。Heapjackのほうが深刻だ。攻撃を受ける側は、Codexでリポジトリを開き、コードについて質問するだけでよく、しかも製品が提供する最も厳格なモードである読み取り専用で動作し、承認プロンプトも表示されず、画面上にも何も表示されない。Cloud Security Allianceによると、どちらの欠陥にもCVEは割り当てられず、OpenAIの単独アドバイザリも公開されておらず、これらによって被害を受けた人も報告されていない。これは、今年の他のエージェント制御に関する項目と並んでAIインシデントアーカイブの中で記録されており、各記録には出典文書、信頼度評価、異議ありフラグが付されている。

Heapjack: トークンは、信頼できない側が読み取れるヒープ内に存在していた

Codex Desktopは、Yomtovが攻撃したコンポーネントをインストールする前に確認を求めない。インストール時に、グローバル設定ファイルである~/.codex/config.tomlにnode_replブロックを書き込む。Yomtovは、オプトインも、それを無効にする設定も存在しないと報告している。このエントリはユーザーごとの選択ではなく共有設定に存在するため、通常のCodex CLIユーザーは一度も確認されることなく同じツールを継承する。

node_repl ツールはそれ自体がサンドボックスの外で動作するネイティブプログラムです。アプリケーションを開いたり、Unix ソケットに接続したり、グローバル設定ファイルを編集したりできます。これがサンドボックス内で起動するのは単一の Node.js プロセスであり、そのプロセスは 2 つの JavaScript 実行コンテキストを保持します。1 つは OpenAI 自身のコードを含む信頼されたコンテキスト、もう 1 つはエージェントに実行を依頼された内容を実行する信頼されていないコンテキストです。

信頼されたコンテキストは、実行ごとに新しく生成されるランダムなトークンを提示することで、自身が信頼されていることを証明する。それが2つのコンテキスト間の境界となるはずだ。しかしそうはなっていない。両方のコンテキストが、単一のメモリヒープを共有する単一のV8アイソレート内に存在するためだ。そのためトークンはメモリ上に置かれた文字列にすぎず、信頼されていないコードから読み取れる。Xでの開示に反応したコメント投稿者は、BleepingComputerが引用した次の一文で、より率直に要点を述べた。「V8のコンテキストが隔離するのはグローバルであってメモリではない。だからそのサンドボックスは、実際にはヒープが決して同意しなかった約束だったのだ」。それは一つの特徴づけであって証拠ではない。証拠は概念実証だ。

Yomtovのエクスプロイトは、まさにその説明が示唆する通りのことを行う。信頼できないJavaScriptがv8.getHeapSnapshot()を呼び出し、得られたスナップショットを走査してUUIDの形をした文字列を探し、各候補を試す。推測が間違っていれば「not authorized」が返る。正しいトークンと無効な引数を組み合わせた場合は、代わりに本物の検証エラーが返る。この2つのエラーメッセージの違いが、正しい値を特定するオラクルとなる。

トークンを手にすると、サンドボックス化されたプロセスは自身のJSONリクエストをファイルディスクリプタ1に書き込む——それは、信頼されたコンテキストがネイティブ親プロセスに到達するために使うのと同じstdoutパイプである。親はトークンを検証し、有効なものを見つけると、その作業を実行する。概念実証では、その作業はシステムのopenコマンドであり、これはリクエストをlaunchdに渡し、アプリケーションをCodexのプロセスツリーの完全に外側で起動する。同じトークンは任意のUnixソケットへの接続を許可し、その中にはDockerデーモンソケットも含まれ、グローバル設定ファイルを編集するためのツールにまで到達する。

そのすべては読み取り専用で動作する。慎重なユーザーが、目の前のリポジトリが信頼できないまさにその理由で選ぶモードだ。どの段階でも承認プロンプトは表示されなかった。実際のシナリオは短い。クローンしたリポジトリをCodexで読み取り専用モードで開き、コードについて質問する。そのリポジトリを書いた者は誰であれ、そのマシン上でサンドボックス外のコマンド実行を手にすることになり、画面上にはそのことは何も表示されない。

Comparison card titled 'Two escapes, one shape', subtitled 'Both broke the boundary from the inside, and neither showed the user anything.' Two columns headed Heapjack and Overpatch carry six rows: Surface, reading 'Codex Desktop, node_repl tool' and 'Codex CLI, apply_patch tool'; Root cause, reading 'Trusted and untrusted V8 contexts share one memory heap' and 'Write permission derived from the parent folder of each path in a patch'; Defeats, reading 'Read-only mode, the strictest setting' and 'Workspace-write confinement'; Approval prompt, reading 'None shown' in both columns; Outcome, reading 'Unsandboxed native execution via launchd, plus Docker socket access' and 'Persistent execution from a modified .zshrc on the next terminal'; and Fixed in, reading 'Desktop build 26.818.21641' and 'CLI 0.149.0'. An amber footer strip reads 'Both enforcement mechanisms lived inside the component they were meant to enforce.'

Overpatch: 手を加えたあらゆるものにその親を与えてしまうパッチツール

2つ目の欠陥は、オープンソースのコマンドラインエージェントであるCodex CLIにあり、メモリのバグではなくパーミッションのバグです。workspace-writeモードでは、エージェントはプロジェクトフォルダ内にのみ書き込みでき、それ以外の場所には書き込めません。ホームディレクトリを対象としたシェルコマンドは拒否されます。apply_patchツールはその一線を守るはずでした。そうではなく、適用するパッチで指定されたパスから権限を導き出し、それぞれの親ディレクトリへの書き込みアクセスを許可していました。

パッチ内で /tmp 配下のパスを指定すると、/tmp の親は / なので、許可範囲がディスクのルートまで広がります。これがこの手口のすべてです。

動作するエクスプロイトは、単一のパッチ内の2つのエントリを利用する。最初のエントリは /tmp を指定しており、何の役にも立たない。ファイルはディレクトリを上書きできないため失敗し、許可範囲を広げるためだけに存在している。2つ目のエントリは、ホームディレクトリへのシンボリックリンクを介して .zshrc に1行を追記する。最初のエントリを削除すれば、書き込みは拒否される。それを残しておくと、開発者が次に開くターミナルが攻撃者の行をサンドボックス外で実行し、サンドボックスはもはや全く介在しなくなる。

つまりOverpatchは単発ではなく、永続化バグだ。汚染された起動ファイルは、誰かが.zshrcを読んで追記された行に気づくまで、開発者が開くすべてのシェルで再び実行される。Cloud Security Allianceのガイダンスが、症状を待つのではなく、そうしたものを探しに行くこととしているのはそのためだ。

どちらのバグも、強制の仕組みを、強制される対象の内側に置いてしまっている。

Yomtov自身のフレーミングは、Codexの範囲を超えて通用する部分だ。apply_patchは、攻撃者が供給した入力から自らの権限を計算していた。node_replは、信頼できるコードと信頼できないコードを分ける秘密を、信頼できないコードが読み取れるメモリ上に保持していた。いずれの場合も、サンドボックスは内側から、何かを通すように告げられていた。

この手口は目新しいものではない。2026年9月20日にこの開示を報じたBleepingComputerによると、2026年7月にはPillar Securityの研究者がCursor、Codex、Gemini CLI、GoogleのAntigravity全体で同じ手法を実証した。サンドボックス内にとどまるエージェントがファイルを書き込み、後からサンドボックス外の信頼されたツールがそれを実行するというものだ。Codexのこの2件を際立たせているのは、Heapjackにおける読み取り専用バイパスと、それを担うコンポーネントを無効化する設定が一切ないことだ。

修正内容、そしてOpenAIが明言したこととしていないこと

OpenAIはAccomplishによると、Codex Desktopビルド26.818.21641でHeapjackを、Codex CLI 0.149.0でOverpatchを修正した。両方とも8月12日の報告から8日以内、このタイムラインを素直に読めば8月20日までに実装され、Yomtovはこの改善をOpenAIの功績だと評した。

OpenAIはどちらの脆弱性についても単独のセキュリティアドバイザリを公開せず、CVE識別子も割り当てられなかった。Cloud Security Allianceは2026年9月22日付のリサーチノートに、そのいずれも存在しないことを記録している。コメントを求められ、OpenAIの広報担当者はBleepingComputerに次のように述べた。「研究者の皆様がご連絡くださり、調査結果を共有してくださったことに感謝します。両方の問題には8月に対処しましたが、私たちはサンドボックスの強化を継続しており、最近の更新ではエージェントがファイルを書き込める場所に関する制御を厳格化し、それらの保護のプラットフォーム全体でのテストを拡大しています。」

その声明は修正内容を確認しているが、仕組みについては何も述べていない。8月の変更が設計パターンを取り除いたのか、それともそこから抜け出す2つの特定の経路を塞いだのかについては述べていない。OpenAIの外部の誰も、そうしたことは言っていない。

Timeline card titled 'Report to public write-up: 34 days', subtitled 'The fix came in eight. The explanation did not come for another month.' Four dates sit on a horizontal rail: 12 AUG, 'Reported to OpenAI', noting both flaws came in one report from Oren Yomtov at Accomplish; 20 AUG, 'Fixed within eight days', noted as arithmetic from the stated eight-day figure, with OpenAI confirming it acted in August; 15 SEP, 'Write-up published', noted as the date the archive files this record under; and 22 SEP, 'Third-party reaction', noting the Uganda CERT advisory rated Red and the Cloud Security Alliance research note. A footer strip reads 'No CVE was assigned at any point on this timeline, and no standalone OpenAI advisory was published.'

何が確立されており、何が一人の研究者に依拠しているのか

アーカイブはこの項目を調査結果として記録している。重大度は高、地域は世界、信頼度はB——文書化されているが、情報源は単一または二次情報源によるもの——であり、異議はなく、実際の被害も記録されていない。この評価こそ、この記事の残りを読むための適切なレンズだ。なぜなら、複数の関係者が確認していることと、発見者だけが主張していることの分裂が、記事全体を貫いているからだ。

複数の当事者がそう述べているという意味で、確立されている:

• この開示は存在し、日付も記載されている。Yomtovの報告記事は2026年9月15日に公開され、両方の欠陥は2026年8月12日にOpenAIへ報告され、彼の説明によれば8日以内に修正された。

• OpenAIは8月に対応したことを認めた。同社の広報担当者はBleepingComputerに対し、両方の問題に対処したと述べた。これは、同社が自ら勧告も技術的説明も公表していないものの、発見者とは独立に、報告から修正までのタイムラインを裏付けるものだ。

• 修正版は一貫して示されている。Codex Desktop のビルド 26.818.21641 と Codex CLI のバージョン 0.149.0 は Accomplish が提示し、BleepingComputer もこれを繰り返し報じ、さらに 2026年9月22日付の Uganda National Computer Emergency Response Team and Coordination Center の勧告にも記載されており、同勧告はこのペアを「Red」と評価している。

• CVE はなく、ベンダーのアドバイザリもなく、悪用の報告もない。2026年9月22日の Cloud Security Alliance の注記は、CVE と OpenAI の単独アドバイザリのいずれも存在しないことを記録しており、組織が Overpatch の永続化メカニズムが設置されているのを発見したという確認済みの事例は報告していない。

• アーカイブはそのいずれについても異を唱えていない。記録は「disputed false」とマークされており、その信頼度評価は、事実に関する見解の相違ではなく、情報源のパターンを反映したものである。

確立されていない、または発見者以外の誰によっても確立されていない:

• メカニズムの詳細はYomtovのものだ。ヒープスナップショットオラクル、共有ファイルディスクリプタ、親ディレクトリの付与——そのすべては彼の記事と概念実証に由来する。Cloud Security Allianceは、その注記が流通している中で最も詳細な第三者要約であるが、彼の説明とBleepingComputerの報道を統合したと説明しており、どちらのエクスプロイトも再現したとも、どちらの修正もテストしたとも述べていない。CERT.UGの勧告は同じ資料をまとめたものである。

• 脆弱なバージョン範囲は公開されていません。修正バージョンのみが示されているため、どの以前のビルドが各脆弱性を含んでいたかの一覧はありません。

• パッチを適用したインストールが、これら2つの事例ではなくバグのクラス全体に対して安全なのかどうかは明言されていない。OpenAIの「サンドボックスを継続的に強化している」というのは一般的なコミットメントであり、特定のメカニズムについての主張ではない。

• どちらの脆弱性も悪用されたという報告はない。それは報告がないというだけのことであり、存在しないと判明したわけではない。また実証コードが示すとおり、Heapjack の経路ではユーザーが気づくような痕跡が画面上に何も残らない。

ユーザーが操作できる対象

Codex Desktop のビルド 26.818.21641 より古いもの、または Codex CLI バージョン 0.149.0 より古いものを使っている人は、Accomplish が引く境界線の脆弱な側に位置しており、更新がこの開示で提示される唯一の対処法です。さらに Cloud Security Alliance は、信頼できないリポジトリを扱った過去の Codex Desktop セッションを、launchd や open の活動、および Docker ソケット接続について監査すること、またシェルの起動ファイル — .zshrc、.bashrc およびそれらに相当するもの — を、ユーザーが記述したのではなく追記されたコマンドについて確認することを推奨しています。

同じ注記は、リポジトリが信頼できない場合に読み取り専用モードを保護策として扱うべきではないと勧告しており、これはHeapjackが独自に導き出す結論でもある。その構造的な提言はさらに踏み込んでいる。共有シークレットや慣習の代わりにプロセスとメモリを物理的に分離すること、認証情報をエージェントの手の届かない場所に保つこと、プロジェクト外のパスを参照するパッチを一目で疑わしいものとして扱うことだ。これらは第三者による提案である。OpenAIが2回のバージョンアップ以外にこれらのいずれかを採用したかどうかは公表されていない。

Abstract illustration on a deep navy-black field: a thick curved wall of frosted glass arcs across the frame; embedded in its far face, where nothing on the inside can reach it, sits a small precision mechanism of brushed brass and steel — a knurled dial, a sprung lever and a fine threaded rod — glowing faintly amber through the frosting. On the near side a small blue sphere rests at the foot of the wall and a thin blue line rises from it, stopping flat against the inner surface. A cold horizon of pale light runs beyond the wall. No text, numbers, people or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

最後に、区別しておく価値のあることが2つある。1つは、広く使われているコーディングエージェントにおける2件のバグで、2026年8月12日に報告され、8日以内に修正され、2つのビルド番号でクローズされた。もう1つは、Yomtovが挙げた設計上の問い、すなわち、サンドボックスが、本来封じ込めるはずのコードによって強制できるのかどうかという問いであり、これはバージョン番号が答える類のものではない。AccomplishもOpenAIも、8月の変更がそれに決着をつけたとは述べていない。