22 сентября 2026 г.
Песочница ИИ-агента - не броня: два побега из OpenAI Codex

Песочница ИИ-агента - это ограда, а не сейф. Исследователи дважды за месяц вырвались из изоляции OpenAI Codex: сначала запись вырвалась из папки проекта на весь диск, потом агент вытащил свой же ключ доступа из общей памяти. OpenAI закрыл обе дыры за восемь дней. Дальше разберу, что это значит для тебя.
Паниковать не надо: Codex по умолчанию заперт довольно плотно, и обе дыры уже залатаны. Важнее другое. Сам механизм побега показывает, где у песочницы агента тонко и на что нельзя полагаться, когда ты пускаешь ИИ в свой код и свой компьютер.
Что вообще произошло
Команда исследователей из Accomplish разобрала песочницу Codex - среды, внутри которой кодинг-агент исполняет команды, - и нашла два способа из неё выбраться. Способы назвали Overpatch и Heapjack. О находках сообщили OpenAI 12 августа 2026 года, и обе дыры закрыли примерно за восемь дней.
Оба побега вели к одному итогу: агент выполнял код за пределами песочницы, там, где по задумке не должен. В одном случае - без единого запроса на подтверждение, то есть в обычном рабочем режиме, а не в каком-то опасном «разрешить всё». Overpatch починили в Codex CLI версии 0.149.0, Heapjack - в сборке Codex Desktop 26.818.21641. Если у тебя новее, ты уже в порядке.
Что такое песочница агента
Кодинг-агенту мало просто писать текст. Он запускает команды: ставит пакеты, гоняет тесты, правит файлы. А значит, в теории может снести не тот каталог, слить содержимое диска в сеть или выполнить чужую команду, которую ему подсунули через промпт. Песочница нужна ровно для этого - ограничить, что агенту можно трогать.
У Codex три режима. Read-only - агент только читает файлы и всё, что за рамками, спрашивает у тебя. Workspace-write - можно править файлы и запускать команды внутри рабочей папки, это режим по умолчанию. И full-access (он же --yolo) - без песочницы и без подтверждений, официально помечен как «не рекомендуется». Плюс к режимам сеть наружу по умолчанию выключена: агент не ходит в интернет, пока ты сам не разрешишь.

Как песочница устроена под капотом
Codex не изобретает изоляцию сам, а опирается на механизмы операционной системы. На macOS это Seatbelt (тот самый sandbox-exec): профиль запрета по умолчанию, где явно перечислены папки, в которые писать можно, а всё остальное закрыто. На Linux связка из двух частей: Landlock отвечает за файловую систему, а seccomp фильтрует системные вызовы и режет доступ к сети.
Идея правильная: агент живёт внутри клетки, стенки которой держит ядро ОС, а не сам агент. Проблема в том, что клетка сложная, и в её конструкции есть детали, где охрана и заключённый оказываются по одну сторону решётки. Именно за эти детали и зацепились оба побега.
Побег первый: запись вырвалась из папки
Overpatch крутится вокруг инструмента apply_patch - через него агент вносит правки в файлы аккуратными патчами. Тонкость была в том, что этот инструмент выдавал право писать не строго в указанный файл, а в его родительскую папку. Дальше дело техники: патч из двух записей, одна из которых ведёт через символическую ссылку к домашнему файлу настроек оболочки, а вторая расширяет разрешённую зону до корня диска.
Итог - запись, которая должна была остаться внутри проекта, дотягивается до всего диска. А поскольку формально это всё ещё «правка файла патчем», система не показывала запрос на подтверждение. То есть в обычном режиме, без опасных флагов, агент мог записать файл там, где ему быть не положено.

Побег второй: агент выдал свой ключ
Heapjack тоньше и опаснее, потому что срабатывал даже в самом строгом режиме read-only. Он касался десктопного Codex, где доверенный и недоверенный код крутились в одном движке JavaScript и делили одну область памяти. Недоверенный код снимал слепок этой памяти и вытаскивал из него ключ доступа - тот самый токен, которым агент подтверждает свои запросы к родительскому процессу.
С ключом на руках код подделывал собственный запрос и отправлял его по тому же каналу, по которому общаются доверенная и недоверенная части. Родительский процесс принимал подделку за легитимную команду и исполнял её уже вне песочницы. Ни правок файлов, ни разрешений на запись для этого не требовалось - хватало чтения.
Почему сторож оказался внутри клетки
У обоих побегов один корень. То, что должно было следить за соблюдением правил, находилось внутри того, за чем оно следило. Инструмент патчей сам решал, куда можно писать. Проверка запросов доверяла ключу, который лежал в одной памяти с недоверенным кодом. В обоих случаях граница проходила не там, где мы думали.
Это общий закон изоляции: если механизм контроля живёт в том же пространстве, что и то, что он контролирует, рано или поздно контролируемый до него дотянется. Настоящая граница - это когда стенку держит что-то снаружи и заведомо более сильное: отдельный процесс, ядро ОС, виртуальная машина. Сами авторы находки после этого стали гонять весь агент внутри виртуалки, считая недоверенным вообще всё, что внутри.
Что с этим делать
Хорошая новость: чтобы защититься, экзотика не нужна. Работают простые правила.
- Обнови инструмент. Codex CLI от 0.149.0 и Desktop от 26.818.21641 обе дыры уже закрыты. Держи агентов свежими - патчи безопасности выходят регулярно.
- Держи сеть выключенной. По умолчанию она и так закрыта. Не открывай её агенту без нужды: без выхода наружу даже сбежавший код мало что унесёт.
- Оставь подтверждения. Режим с запросом на выход за границы песочницы (
on-request) - это твоя точка контроля. Отключаешь подтверждения ради скорости - берёшь риск на себя. - Работай в ветке и читай диффы. Отдельная ветка, чистый
git statusперед запуском и просмотр изменений глазами, как обычный pull request. Зелёная галочка теста - не то же самое, что «я понял, что тут написано». - Не верь чужому коду. Full-access - только для репозиториев, которым ты доверяешь. Для чужого проекта или разбора незнакомой кодовой базы держи read-only.
- Нужна настоящая изоляция - бери виртуалку. Если гоняешь агента на действительно недоверенном коде, вынеси его в отдельную виртуальную машину или контейнер. Тогда граница держится снаружи, а не изнутри.
Главный вывод не в том, что Codex дырявый. Он как раз заперт плотнее многих. Вывод в том, что песочница любого агента - это удобная страховка от случайностей, а не крепость. Относись к агенту как к мощному, но не до конца предсказуемому исполнителю: дай ему ровно столько прав, сколько нужно для задачи, и ни на грамм больше.
