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>
This commit is contained in:
1 parent
89ebd1d327
commit
7607ce2b84
4 files changed
+129
-1
No files matched your search
+5
-1
@@ -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 конвейер»** — калиброван парой случаев, уточнять.
|
||||
|
||||
@@ -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;
|
||||
|
||||
+104
@@ -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 <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/`). Ослабляет защиту всей машины.
|
||||
|
||||
## Диагностические команды для другой машины
|
||||
|
||||
```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).
|
||||
@@ -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`).
|
||||
Reference in new issue
Block a user