Абстрактная иллюстрация на глубоком тёмно-синем, почти чёрном фоне: слева стоит высокая герметичная стеклянная камера, её внутреннее пространство заполнено светящимся бледно-голубым кристаллическим материалом; из трещины у основания стекла вырывается единственная яркая циановая нить, тянется вправо вдоль отрезка трубы из матовой стали, покидает трубу и разветвляется на три короткие янтарные нити в открытом тёмном пространстве. Слабая янтарная дуга остаётся запертой внутри стекла. Текст, числа, люди и логотипы организаций отсутствуют. Логотип OrcaRouter скомпонован в правом нижнем углу.
AI Safety Incidents

Два способа выйти из песочницы OpenAI Codex: Heapjack и Overpatch

Автор

Rowan Sterling

Дата публикации

Новые модели · 20Все модели →
Бенчмарки: Artificial Analysis · обновляется ежедневно
Назад ко всем статьям

15 сентября 2026 года Орен Йомтов, ведущий исследователь безопасности в Accomplish AI, опубликовал технический отчёт о двух отдельных способах выхода из песочницы, окружающей агент программирования Codex от OpenAI. Согласно его материалу, оба были переданы в OpenAI 12 августа 2026 года и оба исправлены в течение восьми дней: Heapjack в Codex Desktop сборки 26.818.21641 и Overpatch в Codex CLI 0.149.0. Heapjack — более серьёзная из двух. Атакуемому человеку нужно лишь открыть репозиторий в Codex и задать вопрос о коде, и эксплойт срабатывает в режиме только для чтения, самом строгом режиме, который предлагает продукт, без запроса подтверждения и без чего-либо, отображаемого на экране. Ни одной из уязвимостей не присвоен CVE, и отдельного бюллетеня OpenAI не опубликовано, по данным Cloud Security Alliance, и никто не сообщал о пострадавших от них. Он включён вместе с другими записями года о контроле над агентами в архив инцидентов ИИ, где каждая запись содержит свои исходные документы, степень достоверности и отметку об оспаривании.

Heapjack: токен находился в куче, которую могла прочитать недоверенная сторона

Codex Desktop не спрашивает перед установкой компонента, атакованного Йомтовом. При установке он записывает блок node_repl в глобальный файл конфигурации по пути ~/.codex/config.toml, и Йомтов сообщает, что нет ни варианта явного согласия, ни настройки, которая бы его отключала. Поскольку запись находится в общей конфигурации, а не в выборе отдельного пользователя, обычный пользователь Codex CLI наследует тот же инструмент, даже не будучи спрошенным.

Инструмент {{1}}node_repl{{/1}} сам по себе является нативной программой, которая выполняется вне песочницы. Он может открывать приложения, подключаться к Unix-сокетам и редактировать глобальный файл конфигурации. То, что он запускает внутри песочницы, — это один процесс Node.js, и этот процесс содержит два контекста выполнения JavaScript: доверенный, содержащий собственный код OpenAI, и недоверенный, выполняющий то, что агенту было поручено сделать.

Доверенный контекст доказывает, что ему доверяют, предъявляя случайный токен, создаваемый заново при каждом запуске. Это должно быть границей между двумя контекстами. Но это не так, потому что оба контекста живут в одном изоляте V8 с общей единой кучей памяти, поэтому токен — это строка в памяти, которую может прочитать недоверенный код. Один комментатор, реагируя на раскрытие информации в X, выразил эту мысль резче — в строке, которую процитировал BleepingComputer: «Контексты V8 изолируют глобальные объекты, а не память, так что песочница на самом деле была обещанием, на которое куча никогда не соглашалась». Это характеристика, а не доказательство; доказательство — это proof of concept.

Эксплойт Йомтова делает ровно то, что подразумевает это описание. Недоверенный JavaScript вызывает v8.getHeapSnapshot(), сканирует полученный снимок кучи на строки в формате UUID и проверяет каждого кандидата. При неверной догадке возвращается «not authorized». Правильный токен в сочетании с недопустимым аргументом вместо этого возвращает настоящую ошибку валидации. Разница между двумя сообщениями об ошибке и есть оракул, позволяющий выявить правильное значение.

Имея токен на руках, процесс в песочнице записывает свой 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: инструмент для патчей, который наделял родителем всё, к чему прикасался.

Вторая ошибка кроется в Codex CLI — открытом агенте командной строки, и это ошибка разрешений, а не памяти. В режиме workspace-write агент может писать внутри папки проекта и больше нигде; команда оболочки, нацеленная на домашний каталог, отклоняется. Инструмент apply_patch должен был удерживать эту границу. Вместо этого он выводил свои разрешения из путей, указанных в применяемом патче, и предоставлял доступ на запись в родительский каталог каждого из них.

Укажите в патче путь под /tmp — и разрешение расширится до корня диска, потому что родительским каталогом /tmp является /. В этом и весь трюк.

Рабочий эксплойт использует две записи в одном патче. Первая указывает на /tmp и не делает ничего полезного — она завершается неудачей, поскольку файл не может перезаписать каталог, — и существует лишь для того, чтобы расширить выданные права. Вторая добавляет строку в .zshrc через символическую ссылку в домашний каталог. Уберите первую запись — и в записи будет отказано. Оставьте её — и следующий терминал, который откроет разработчик, выполнит строку атакующего вне песочницы, причём песочница вообще больше не будет участвовать.

Это делает Overpatch багом персистентности, а не одноразовым срабатыванием. Отравленный файл автозапуска выполняется снова при каждой оболочке, которую открывает разработчик, пока кто-нибудь не прочитает .zshrc и не заметит добавленную строку — поэтому Cloud Security Alliance рекомендует искать его, а не ждать появления симптома.

Оба бага помещают механизм контроля внутрь контролируемого объекта.

Формулировка самого Йомтова — это та часть, которая выходит за пределы Codex. apply_patch вычислял собственные разрешения на основе ввода, предоставленного злоумышленником. node_repl хранил секрет, отделяющий доверенный код от недоверенного, в памяти, которую недоверенный код мог прочитать. В каждом случае песочнице изнутри давали указание что-то пропустить.

Эта схема не нова. BleepingComputer, сообщивший о раскрытии 20 сентября 2026 года, отмечает, что в июле 2026 года исследователи Pillar Security продемонстрировали ту же идею в Cursor, Codex, Gemini CLI и Google Antigravity, где агент, остающийся внутри своей песочницы, записывает файл, который затем выполняет доверенный инструмент вне песочницы. Что отличает пару в Codex — это обход режима «только для чтения» в Heapjack и отсутствие какой-либо настройки, позволяющей отключить компонент, который его содержит.

Исправления, а также что OpenAI сказала и о чём умолчала

OpenAI исправила Heapjack в сборке Codex Desktop 26.818.21641 и Overpatch в Codex CLI 0.149.0, сообщает Accomplish. Оба исправления вышли в течение восьми дней после отчёта от 12 августа — к 20 августа, если буквально читать эту хронологию, — и Йомтов отдал OpenAI должное за этот разворот.

OpenAI не опубликовала отдельного бюллетеня по безопасности ни для одной из этих уязвимостей, и ни одной из них не был присвоен идентификатор CVE; Cloud Security Alliance фиксирует оба этих отсутствия в исследовательской заметке от 22 сентября 2026 года. На просьбу о комментарии представитель OpenAI сообщил BleepingComputer: «Мы благодарим исследователей за то, что они связались с нами и поделились своими находками. Мы устранили обе проблемы в августе, но постоянно усиливаем наши песочницы, а недавние обновления ужесточают контроль над тем, куда агенты могут записывать файлы, и расширяют тестирование этих механизмов защиты на разных платформах».

Это заявление подтверждает исправления и ничего не говорит о механизмах. В нём не сказано, устранили ли августовские изменения сам шаблон проектирования или закрыли два конкретных пути выхода из него. Никто за пределами 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 (задокументировано, но из одного или вторичного источника), не оспаривается, реального ущерба не зафиксировано. Эта оценка — правильная оптика для чтения остальной части материала, потому что разделение между тем, что подтверждают несколько сторон, и тем, что утверждает только сам обнаруживший, проходит через всю историю.

Установлено — в том смысле, что об этом заявляет более одной стороны:

Раскрытие существует и датировано. Отчёт Йомтова был опубликован 15 сентября 2026 года; обе уязвимости были сообщены OpenAI 12 августа 2026 года и, по его словам, исправлены в течение восьми дней.

• OpenAI подтверждает, что приняла меры в августе. Её представитель сообщил BleepingComputer, что обе проблемы были устранены, и это независимо от обнаружившего их лица подтверждает хронологию «сообщение — исправление», хотя компания не опубликовала ни уведомления, ни собственного технического отчёта.

• Исправленные версии указаны согласованно. Сборка 26.818.21641 для Codex Desktop и версия 0.149.0 для Codex CLI приводятся в сообщении Accomplish, повторяются в BleepingComputer и фигурируют в бюллетене от 22 сентября 2026 года, выпущенном Национальной группой реагирования на компьютерные инциденты и координационным центром Уганды, которая присвоила этой паре рейтинг «Red».

• Ни CVE, ни рекомендаций поставщика, ни сообщений об эксплуатации. В заметке Cloud Security Alliance от 22 сентября 2026 года отмечается отсутствие как CVE, так и отдельной рекомендации OpenAI, а также сообщается об отсутствии подтверждённых случаев, когда организация обнаружила бы механизм закрепления Overpatch в системе.

• Архив ничего из этого не оспаривает. Запись помечена как неоспариваемая (disputed: false), а её оценка достоверности отражает характер источников, а не какие-либо разногласия по поводу фактов.

Не установлено или установлено никем, кроме самого нашедшего:

• Детали механизма принадлежат Йомтову. Оракул снимка кучи, общий файловый дескриптор, предоставление родительского каталога — всё это взято из его описания и его proof of concept. Cloud Security Alliance, чья заметка является наиболее подробным сторонним резюме в обращении, описывает свою работу как синтез его рассказа и материалов BleepingComputer и не утверждает, что воспроизводила какой-либо из эксплойтов или проверяла какое-либо из исправлений. Бюллетень CERT.UG содержит тот же материал.

• Диапазоны уязвимых версий так и не были опубликованы. Указаны только версии с исправлениями, поэтому нет списка того, какие из более ранних сборок содержали каждую уязвимость.

• Не указано, защищена ли пропатченная установка от всего класса ошибок, а не только от этих двух случаев. Фраза 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 какие-либо из них помимо двух повышений версии.

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.

В конце стоит не смешивать две вещи. Одна — пара багов в широко используемом агенте для программирования, о которых сообщили 12 августа 2026 года, исправили в течение восьми дней и закрыли в двух номерах сборок. Другая — вопрос проектирования, который называет Йомтов: можно ли обеспечить соблюдение песочницы с помощью кода, который она должна содержать, — и на этот вопрос номер версии не отвечает. Ни Accomplish, ни OpenAI не заявили, что августовские изменения его решают.

© 2026 OrcaRouter

Провайдерам

Управляете инференс-платформой? Разместите свои модели на OrcaRouter.

providers@orcarouter.ai

Присоединяйтесь к сообществу

Discordsupport@orcarouter.aiXLinkedInGitHubYouTube