From 7607ce2b84fab35890b6acd378781937ead717b7 Mon Sep 17 00:00:00 2001 From: Dmitriy Dementiev Date: Fri, 10 Jul 2026 12:43:42 +0300 Subject: [PATCH] =?UTF-8?q?docs(skill):=20=D0=B2=D0=BB=D0=B8=D1=82=D1=8B?= =?UTF-8?q?=20=D0=BB=D0=B8=D0=BD=D1=83=D0=BA=D1=81-=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=B8=20sandbox=20=D0=B8=D0=B7=20=D0=B2=D0=B5=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20codex-sandbox-fix-20260710?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - другая сессия на 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 --- ...odex-revyuer-write-i-sliyanie-handoffov.md | 6 +- .../references/codex-exec.md | 8 ++ .../codex-sandbox-fix-handover-2026-07-10.md | 104 ++++++++++++++++++ .../references/lessons.md | 12 ++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 agents/.agents/skills/claude-subagent-playbook/references/codex-sandbox-fix-handover-2026-07-10.md diff --git a/agents/.agents/skills/claude-subagent-playbook/handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md b/agents/.agents/skills/claude-subagent-playbook/handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md index d5d2557..2d6f16c 100644 --- a/agents/.agents/skills/claude-subagent-playbook/handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md +++ b/agents/.agents/skills/claude-subagent-playbook/handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md @@ -52,7 +52,11 @@ через авто-аппрув. 2. **Linux-прогон рецептов codex-exec.md** — вся эмпирика прямого exec Windows-ная (Git Bash); особенно пути `$SCRATCH` и поведение - классификатора авторежима. + классификатора авторежима. Кавеат с линукс-машины (ветка + `codex-sandbox-fix-20260710`, влита сюда): sandbox Codex 0.144.1 там + сломан AppArmor'ом, обход `use_legacy_landlock` даёт только read-only — + write-режим (то есть обе наши ветки) ждёт AppArmor-профиля под sudo; + рецепты — references/codex-sandbox-fix-handover-2026-07-10.md. 3. **Раннер-«переваривание шумного результата»** в новой формулировке не обкатан (пока не понадобился — вердикты были короткими). 4. **Порог «мелочь vs конвейер»** — калиброван парой случаев, уточнять. diff --git a/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md b/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md index 05609ef..3e2fda4 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md @@ -38,6 +38,14 @@ `codex`, `jq`, редиректы под Windows работают). `$SCRATCH` задавай forward-slash-путём (`/c/Users/...`), не `C:\...`; пути в аргументах кавычь; в выводах под Windows возможны `\r`. +- **Linux: sandbox может молча сломаться обновлением Codex.** CLI 0.144.1 + сменил backend на bwrap+userns; Ubuntu 24.04 с + `apparmor_restrict_unprivileged_userns=1` глушит любые команды до запуска + (`bwrap: loopback: Failed RTM_NEWADDR`). Сигнатура: web_search работает, + а `pwd` в sandbox — нет. Обход без sudo `use_legacy_landlock=true` чинит + только read-only (write-режим с ним паникует); полный фикс — AppArmor- + профиль. Диагностика и рецепты — + [codex-sandbox-fix-handover-2026-07-10.md](codex-sandbox-fix-handover-2026-07-10.md). - **Блок классификатора — решение пользователя.** Если запуск не прошёл permission-гейт, дай пользователю готовую команду с префиксом `!` в чат или попроси сменить режим разрешений. Сработавший путь — прямой exec; diff --git a/agents/.agents/skills/claude-subagent-playbook/references/codex-sandbox-fix-handover-2026-07-10.md b/agents/.agents/skills/claude-subagent-playbook/references/codex-sandbox-fix-handover-2026-07-10.md new file mode 100644 index 0000000..cefa5ae --- /dev/null +++ b/agents/.agents/skills/claude-subagent-playbook/references/codex-sandbox-fix-handover-2026-07-10.md @@ -0,0 +1,104 @@ +# 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` добавлено: + +```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 , +include +profile codex-bwrap /home/dmitry/.npm-global/lib/node_modules/@openai/codex/**/codex-resources/bwrap flags=(unconfined) { + userns, + include if exists +} +``` + +Загрузить: `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/`). Ослабляет защиту всей машины. + +## Диагностические команды для другой машины + +```bash +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](codex-exec.md), сквозное правило «Linux: sandbox может молча +сломаться обновлением Codex»; датированная запись — в +[lessons.md](lessons.md). diff --git a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md index bc85385..1ea9553 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md @@ -154,3 +154,15 @@ general-purpose на Опусе — обкатан дважды (постано различие — мандат промптом; подстраховка — сверка `git status --porcelain` до/после ревью. Непроверенное — в handoff 2026-07-10 (сеть под workspace-write-песочницей для поиска). + +## 2026-07-10 — Linux: sandbox-инцидент Codex CLI 0.144.1 (другая сессия, Ubuntu 24.04) + +Обновление npm-пакета codex молча сломало песочницу: backend сменился на +bwrap+userns, AppArmor Ubuntu 24.04 блокирует его до запуска команд. +Характерная сигнатура: «гуглит, но не может выполнить `ls`» (web_search +исполняется вне sandbox). Обход без sudo — `use_legacy_landlock=true` +(только read-only, write паникует); полный фикс — AppArmor-профиль +`codex-bwrap` (на той машине не применён, write ждёт sudo). При странных +отказах Codex первым делом — `codex --version` и дата обновления. +Подробности — references/codex-sandbox-fix-handover-2026-07-10.md +(принесено из ветки `codex-sandbox-fix-20260710`).