Files
dotfiles/agents/.agents/skills/claude-subagent-playbook/references/codex-sandbox-fix-handover-2026-07-10.md
T
Dmitriy DementievandClaude Fable 5 7607ce2b84 docs(skill): влиты линукс-уроки sandbox из ветки codex-sandbox-fix-20260710
- Зачем:
  - другая сессия на Ubuntu 24.04 задиагностировала молчаливую поломку
    песочницы Codex CLI 0.144.1 (bwrap+userns против AppArmor); знание
    нужно основной линии скилла — Linux-прогон конвейера впереди.
- Что:
  - перенесён references/codex-sandbox-fix-handover-2026-07-10.md
    (диагностика, обход use_legacy_landlock, AppArmor-профиль);
    раздел «Связанные записи» перенацелен с удалённого codex-companion.md
    на codex-exec.md.
  - в codex-exec.md добавлено сквозное правило про линукс-ловушку
    (сигнатура «гуглит, но не может ls»), в lessons.md — датированная
    запись, в handoff — кавеат к пункту про Linux-прогон.
- Проверка:
  - git show origin/codex-sandbox-fix-20260710 — содержимое перенесено
    полностью; перекрёстные ссылки codex-exec.md ↔ handover резолвятся.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 12:43:42 +03:00

7.1 KiB
Raw Blame History

Handover: починка sandbox Codex CLI на Ubuntu 24.04 (2026-07-10)

Для агента, дорабатывающего скилл работы с Codex. Самодостаточно: диагностика и фикс воспроизводимы без контекста исходной сессии.

Симптом

Любая команда внутри sandbox Codex падает до запуска процесса, даже pwd:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Проявляется и в read-only, и в workspace-write. Codex не может ни читать файлы через shell, ни выполнять команды — задачи либо виснут, либо честно завершаются отказом.

Корневая причина (подтверждена kernel audit log)

Codex CLI 0.144.1 (npm) сменил Linux-sandbox backend: раньше был Landlock/seccomp без user namespaces, теперь — vendored bubblewrap (…/@openai/codex-linux-x64/vendor/x86_64-unknown-linux-musl/codex-resources/bwrap), который создаёт unprivileged user namespace + network namespace.

Ubuntu 24.04 с kernel.apparmor_restrict_unprivileged_userns = 1 загоняет такой userns в запретительный AppArmor-профиль unprivileged_userns, который блокирует два шага, нужных bwrap: запись /proc/PID/uid_map и RTM_NEWADDR (поднятие loopback). Доказательство из audit log:

apparmor="AUDIT" operation="userns_create" comm="bwrap" profile="unconfined" target="unprivileged_userns"
apparmor="DENIED" operation="open" name="proc/…/uid_map" profile="unprivileged_userns" denied_mask="wr"

Важные отрицательные результаты (экономят время диагностики):

  • Плагин openai-codex (1.0.5 → 1.0.6) ни при чём — он лишь передаёт режимы sandbox бинарю codex; даунгрейд плагина не помогает.
  • Системный /usr/bin/bwrap падает так же — это не баг vendored-сборки.
  • Система не менялась (машина без ребута 14 недель, политика AppArmor старая) — это дрейф самого Codex CLI, прилетевший с обновлением npm-пакета.

Применённый фикс без sudo (обратимый)

В ~/.codex/config.toml добавлено:

[features]
use_legacy_landlock = true

Backup рядом: ~/.codex/config.toml.bak-20260710. Откат — восстановить backup или удалить две строки.

Проверка (сквозная, через codex-companion)

  • Read-only задача task --wait --fresh («pwd + первая строка /etc/os-release») — команды выполняются, вернула корректные значения.
  • web_search работает: задача сходила на github.com/openai/codex/releases. Нюанс: сетевой доступ из shell-команд внутри sandbox по-прежнему закрыт (npm view виснет) — это корректный read-only режим; инструмент web_search исполняется вне sandbox и не страдает.
  • Изоляция сохранена: запись вне workspace запрещена.

Известное ограничение фикса

use_legacy_landlock чинит только read-only. Режим --write/workspace-write с этим флагом паникует:

permission profiles requiring direct runtime enforcement are incompatible with --use-legacy-landlock

— workspace-write требует именно bwrap-backend. Полный фикс — ниже, нужен sudo.

Полный фикс (sudo; на исходной машине пока не применён)

Вариант A — рекомендуемый, точечный: AppArmor-профиль только для bwrap Codex'а, системное ограничение userns остаётся. Создать /etc/apparmor.d/codex-bwrap:

abi <abi/4.0>,
include <tunables/global>
profile codex-bwrap /home/dmitry/.npm-global/lib/node_modules/@openai/codex/**/codex-resources/bwrap flags=(unconfined) {
  userns,
  include if exists <local/codex-bwrap>
}

Загрузить: sudo apparmor_parser -r /etc/apparmor.d/codex-bwrap. После этого убрать use_legacy_landlock из config.toml и проверить оба режима:

codex sandbox -c 'sandbox_mode="workspace-write"' -- sh -c 'touch ./__p && rm ./__p && echo OK'

Переносимость: путь в профиле — под конкретную машину (~/.npm-global/...); glob ** переживает обновления версий Codex, но если npm-global живёт в другом месте — путь поправить. Перезагружать профиль нужно только при смене самого расположения.

Вариант B — грубый, не рекомендуется: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 (+ файл в /etc/sysctl.d/). Ослабляет защиту всей машины.

Диагностические команды для другой машины

codex --version                                          # 0.144.1+ → bwrap-backend
sysctl kernel.apparmor_restrict_unprivileged_userns      # 1 → будет блокировка
bwrap --ro-bind / / --unshare-net --dev /dev --proc /proc true && echo BWRAP_OK
sudo dmesg | grep -iE 'apparmor.*(userns|bwrap)' | tail  # AUDIT/DENIED — подтверждение

Что стоит внести в скилл

  1. Ловушка: с включённым use_legacy_landlock --write-задачи паникуют — либо профиль AppArmor и убрать флаг, либо жить в read-only.
  2. web_search Codex работает даже при мёртвом shell-sandbox — «гуглит, но не может выполнить ls» — характерная сигнатура именно этой поломки.
  3. Поломка прилетает молча с обновлением npm-пакета codex — при странных отказах первым делом codex --version и дата установки.

Связанные записи

Принесено 2026-07-10 из ветки codex-sandbox-fix-20260710 (исходная машина — Ubuntu 24.04; там сжатая версия жила в codex-companion.md, который в основной линии уже поглощён codex-exec.md). Сжатая версия урока здесь — в codex-exec.md, сквозное правило «Linux: sandbox может молча сломаться обновлением Codex»; датированная запись — в lessons.md.