Claude Code за неделю закрыл четыре обхода собственных разрешений. И удалил ultraplan
Если читать changelog Claude Code как список фич, за прошлую неделю не случилось ничего: пара удобных мелочей и удаление одной команды. Если читать его как список закрытых дыр, картина другая. В версиях 2.1.221 и 2.1.222 Anthropic починила четыре разных способа обойти собственную модель разрешений. И один из них ровно тот, которым сейчас пользуется npm-червь.
TL;DR: 2.1.221 закрыл обход разрешений Bash через zsh и поломанные проверки PowerShell на путях с кавычками. 2.1.222 закрыл побег из worktree-изоляции в деструктивные git-команды, обход tool-ограничений через собственные
PreToolUse-хуки в фоновых агентах и, главное, запретил repo-local настройкам включать Remote Control. Плюс ultraplan удалён совсем — через четыре месяца после появления.
Какие дыры закрыли и почему это важнее фич
Все четыре — про одно: диалог подтверждения показывал одно, а выполнялось другое. Это самый неприятный класс багов в агенте, потому что он обесценивает единственный механизм, который у тебя есть.
Обход разрешений Bash через zsh. В 2.1.221 значится: Fixed Bash tool permission bypass where zsh could execute hidden commands. То есть команда, которую ты одобрил, и команда, которую выполнил zsh, могли отличаться. Проверка шла по видимой строке.
Проверки PowerShell на путях с кавычками. Там же: Fixed PowerShell permission checks on paths containing quote characters. Отдельный привет всем, кто работает из Windows — а это, судя по нашей статистике, немалая часть читателей. Кавычка в пути ломала проверку прав.
Побег из worktree-изоляции. В 2.1.222: Fixed worktree-isolated sessions and their subagents being able to run destructive git commands. Изоляция через worktree — это то, что продаётся как безопасный способ дать агенту порулить репозиторием. Выяснилось, что и сессия, и её субагенты могли выполнять деструктивные git-команды в обход изоляции.
Собственные хуки как средство обхода. Тоже 2.1.222: Fixed PreToolUse auto-allow hooks bypassing tool restrictions in background agent tasks. Ты ставишь PreToolUse-хук, чтобы автоматически разрешать безобидные вещи и не жать Enter сто раз. В фоновых задачах агента этот хук снимал и те ограничения, которые ты снимать не собирался. Механизм для удобства работал как механизм для эскалации.
Почему запрет repo-local настроек на Remote Control — главная строчка недели
Потому что до 2.1.222 файл .claude/settings.json внутри клонированного репозитория мог включить автостарт Remote Control. Теперь может только выключить, а включается это исключительно на уровне пользователя через /config.
Формулировка из changelog: Changed Remote Control auto-start so repo-local settings can no longer enable it. Асимметрия здесь и есть суть правильного дизайна: настройка из недоверенного источника вправе ослабить свои же полномочия, но не вправе их себе выдать.
Насколько это не теория, показывает червь ChainDrop, который прошёл по npm 4 августа: найдя GitHub-токен, он коммитит вредоносные хуки в .claude/settings.json до 50 веток на репозиторий, чтобы заражать разработчиков друг от друга в обход реестра пакетов. То есть класс атаки «репозиторий приносит настройки агента с собой» уже эксплуатируется в проде — и это не про Remote Control конкретно, а про всё, что можно включить из файла в репозитории.
Практический вывод, который не зависит от версии Claude Code: .claude/settings.json, .vscode/tasks.json и любые агентские конфиги — это исполняемый код. В ревью их надо смотреть отдельно и внимательнее, чем обычный диф.
Ещё одна мера из той же серии, но полезная сама по себе: в 2.1.221 добавили mode: 'mask' для файлов с кредами внутри песочницы на Linux и WSL. Агент видит, что файл существует и что-то в нём есть, но не видит содержимого. Дешёвый способ не отдавать .env целиком тому, кому достаточно знать, что переменная задана.
Что случилось с ultraplan
Его удалили. Строчка Removed ultraplan feature в 2.1.222 закрывает историю, которая началась 5 апреля, когда мы разбирали его появление в 2.1.90–92.
Официального объяснения нет, но по контексту релизов оно и не нужно. Ultraplan был отдельной сущностью для «планирования в облаке», а за прошедшие месяцы его работу растащили по механизмам, которые оказались общее: dynamic workflows с настраиваемым размером (workflowSizeGuideline появился в 2.1.219), вложенные субагенты до глубины 3 вместо 1 и обычный plan mode. Когда три механизма делают то же самое, четвёртый становится долгом.
Если у тебя в скриптах или в CLAUDE.md осталось упоминание ultraplan — оно теперь мёртвое, и молча. Это единственное, что стоит проверить прямо сейчас.
Что ещё поменялось из полезного
Из мелочей, которые реально меняют рабочий день, самое заметное — Focus view и новое поведение /fork.
- Focus view (2.1.221) — переключатель в меню чата, который прячет активность инструментов за сводкой по каждому ходу. Когда агент делает сорок вызовов подряд, читать это построчно бессмысленно, а сводку — можно.
/forkтеперь создаёт новый worktree (2.1.221). Раньше форк сессии жил в том же рабочем каталоге, и две ветки мысли дрались за одни файлы. Теперь разъезжаются физически./statusпоказывает вид сессии: interactive, attached или unattended. Полезно, когда не помнишь, в фоне у тебя агент или нет — а это ровно тот случай, когда разница в правах максимальная.- Фоновые сессии больше не открывают draft PR по своей инициативе — только если задача этого требует. Меньше мусора в репозитории.
/usageперестал приписывать расход MCP-серверам (2.1.222) и Stats-панель наконец считает кеш-токены в общих суммах (2.1.221). Если ты сверял расход по/usageи не сходилось — вот причина, цифры до этих версий были кривые.WebSearchбольше не падает с 400 на xhigh/max effort без thinking. Мелочь, но она ломала ровно тот режим, в котором ищут сложное.- Плагины из
/pluginактивируются сразу, когда это безопасно, аclaude plugin validateтеперь предупреждает про имена, которые будут отклонены маркетплейсом.
Подводные камни
- Обновление не чинит уже испорченное. Патч запрещает repo-local настройкам включать Remote Control, но если вредоносный хук уже лежит у тебя в
.claude/settings.jsonиз заражённого репозитория, он никуда не денется. Файлы надо проверить руками. - Твои
PreToolUse-хуки могли работать шире, чем ты думал. Если ты полагался на связку «хук авторазрешает + ограничения инструментов держат периметр» в фоновых задачах, до 2.1.222 периметра там не было. Стоит перечитать, что именно ты автоматически разрешал. - Worktree перестал быть железной границей ещё до патча. Если ты гонял агентов в worktree-изоляции и считал, что деструктивные git-команды туда не дотянутся, это было неверно. Смотри reflog в затронутых репозиториях, а не только текущее состояние.
mode: 'mask'только для Linux и WSL. На macOS этого нет, а Mac — основное железо у большой части разработчиков. Маскирование кредов пока не кросс-платформенное./diffтеперь игнорирует твои diff-драйверы иtextconv. Изменение правильное с точки зрения безопасности (сырой git blob вместо того, что подсунул конфиг репозитория), но если у тебя настроен кастомный textconv для бинарников или ноутбуков, диффы станут выглядеть иначе. Это не баг.- Удаление ultraplan не задепрекейтили заранее. Фича просто исчезла в патч-версии. Для инструмента, который зовут из скриптов, это неприятный паттерн, и он повторится.
Альтернативы: чем ещё ограничить агента
sandbox.network.strictAllowlist(появился в 2.1.219) — запрещает всё, чего нет в списке хостов. Самая недооценённая настройка Claude Code: она превращает «агент не должен ходить в интернет» из просьбы в отсутствие маршрута. Ровно то, к чему пришла британская AISI после инцидента с агентами на кибер-полигоне.--ignore-scriptsи прокси-реестр — защита не от Claude Code, а от того, что агент поставит в проект. После ChainDrop это стало обязательным, а не опциональным.- microsoft/agent-governance-toolkit — внешний слой политик (OPA/Cedar) и tamper-evident аудита, если не хочется зависеть от того, насколько корректно работает permission-модель конкретного вендора. Правильный ответ на неделю, в которой нашлось четыре обхода.
- Отдельный юзер в ОС или контейнер под агента — скучно и надёжно. Все четыре бага этой недели упирались в то, что процесс агента мог больше, чем показывал. Границу уровня ОС так не обойти.
Вердикт
Обновляйся сегодня, без раздумий: claude update. Это не релиз с фичами, это релиз, где закрыли четыре обхода модели разрешений, включая два, которые ломали изоляцию фоновых агентов и worktree. Отдельно быстро обновляются те, кто работает из Windows (проверки PowerShell на путях с кавычками) и те, кто автоматизирует подтверждения через PreToolUse-хуки.
Только не считай обновление достаточным. Патч про Remote Control закрывает один вход, а класс атаки «репозиторий приносит с собой настройки твоего агента» уже работает в реальном мире — сходи и прочитай глазами свои .claude/settings.json во всех проектах и ветках. И убери из скриптов ultraplan, он теперь просто не существует.
Как попробовать
- Обнови и сверь версию:
claude update, затемclaude --version. Тебе нужна 2.1.222 или новее, полный changelog лежит в репозитории. - Проверь агентские конфиги на чужие правки, во всех ветках:
git log -p --all -- .claude/settings.json .claude/settings.local.json .vscode/tasks.json. - Проверь, что Remote Control включён там, где ты этого хотел:
/configна уровне пользователя, и убедись, что ни один репозиторий не пытается его поднять. - Перечитай свои хуки:
cat .claude/settings.json | grep -A5 PreToolUse— и подумай, что именно они авторазрешали в фоновых задачах до патча. - Включи то, что стоит включить:
sandbox.network.strictAllowlistсо минимальным списком хостов, а на Linux/WSL —mode: 'mask'для файлов с кредами. И попробуй Focus view в меню чата на длинной задаче, разница в читаемости заметна сразу.