Перейти к содержанию

OpenAI

Слепок памяти выдаёт токен и выпускает Codex из песочницы

3 мин чтения

Текст написан ИИ-моделью по источникам, на которые ведут ссылки, и сверен с ними второй моделью. Как мы работаем

Всё о теме: Агенты для программирования →
Изображение: bleepingcomputer.com

Орен Йомтов (Oren Yomtov) из Accomplish AI нашёл два способа выйти из песочницы OpenAI Codex и выполнить команды прямо на компьютере пользователя. OpenAI закрыла обе дыры за восемь дней после его сообщения от 12 августа, рассказал 20 сентября BleepingComputer. Heapjack срабатывает, когда Codex просто разбирает подготовленный репозиторий, даже в самом строгом режиме read-only, поэтому тем, кто открывает в Codex чужой код, нужны Codex Desktop с билдом 26.818.21641 или новее и Codex CLI 0.149.0 или новее.

Heapjack касается не только десктопного приложения. При установке Codex Desktop без всякого согласия пользователя прописывает блок [mcp_servers.node_repl] в глобальный ~/.codex/config.toml, и отключить его настройкой нельзя. Поэтому инструмент node_repl получает и обычный codex в терминале.

Heapjack: токен из кучи

node_repl - нативная программа на Rust, которая работает вне песочницы: открывает приложения, подключается к unix-сокетам, пишет конфиг. Node-процесс для кода агента она запускает уже через песочницу Codex, говорится в разборе Accomplish. Внутри этого процесса два контекста V8: доверенный с кодом OpenAI, где хранится секретный токен, и недоверенный, где исполняется код агента.

Токен случайный и генерируется заново при каждом запуске, но процесс, изолят V8 и куча у обоих контекстов общие, объясняют в Accomplish. Недоверенный код снимает слепок кучи через v8.getHeapSnapshot() и перебирает все строки, похожие на UUID. Верный вариант выдаёт себя ответом: неверный токен возвращает not authorized, а верный с кривым аргументом даёт настоящую ошибку валидации. Запросы уходят родительскому процессу на Rust JSON-строками в stdout, и этот канал у обоих контекстов один.

С токеном, по описанию исследователей Accomplish, родитель выполняет системную команду open, и launchd запускает приложение без песочницы, вне дерева процессов Codex. Тот же токен открывает подключение к любому unix-сокету (первым на ум приходит сокет демона Docker) и инструмент правки глобального ~/.codex/config.toml. Всё это работало в read-only, и подтверждения Codex ни разу не запросил.

По словам Accomplish, достаточно открыть склонированный репозиторий в Codex в режиме read-only и задать вопрос, чтобы автор репозитория получил выполнение команд вне песочницы, без запроса и без чего-либо на экране.

Лишний /tmp в патче

В режиме workspace-write агент может писать только в рабочую папку, и shell-команда, которая лезет в $HOME, получает отказ, рассказывают в Accomplish. Но у агента есть ещё apply_patch, инструмент обвязки Codex для правки файлов, и права на запись он выдаёт на родительскую папку каждого пути из патча. Упоминание в патче /tmp поэтому даёт право записи в корень /.

Сам патч Overpatch, по описанию Accomplish, состоит из двух правок. Первая через символическую ссылку в $HOME дописывает строку в .zshrc. Вторая называет /tmp и ничего не делает: файл нельзя записать поверх папки, так что она падает и нужна только для того, чтобы расширить права. Без неё запись в .zshrc отклоняется. Дописанная строка выполнится вне песочницы, когда пользователь в следующий раз откроет терминал, а атака, как утверждают исследователи, проходит в обычном режиме агента без запроса на подтверждение.

Исправление OpenAI влили 20 августа, отмечают в General Analysis: теперь цели, куда запись и так разрешена, отсеиваются до того, как выводятся дополнительные права на родительские папки. Регрессионные тесты покрывают цели внутри рабочей папки и символическую ссылку, ведущую за её пределы. Релиз Codex CLI 0.149.0 с этим исправлением опубликован в тот же день.

OpenAI

GPT-5.5 уходит из Codex 14 октября, в API остаётся

Если имя GPT-5.5 вшито в ваши скрипты и запланированные задачи в Codex, переписать их надо до 14 октября. В этот день модель выключают в ChatGPT, ChatGPT Work и Codex на всех тарифах, а в API она остаётся.

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите, чтобы оставить комментарий. Он появится после модерации.