Claude Code 2.1.251 закрывает четыре способа обойти проверку разрешений
Symlink, подменённый после проверки, правила deny, переставшие действовать через путь поиска с symlink, команда маркетплейса, указывающая за пределы своего плагина, и скрипт workflow, прочитанный до одобрения. Четыре исправления в одном релизе — и все это один и тот же баг.
Claude Code 2.1.251 вышел 28 августа 2026 года с changelog, достаточно длинным, чтобы похоронить в нём самое интересное. Четыре исправления в нём имеют одну и ту же форму: что-то дотянулось до файла, который проверка разрешений не одобряла. Если читать их вместе, они перестают выглядеть как четыре бага и начинают выглядеть как один класс.
Проверка прошла, а потом путь поменялся
Главное исправление — хрестоматийная гонка между моментом проверки и моментом использования. По changelog, файловые инструменты «следовали за symlink, подменённым внутри рабочего каталога после проверки разрешений», и могли «читать или писать за пределами одобренного расположения». Вы одобряете правку src/config.ts, путь разрешается, проверка говорит «да» — и между этим «да» и записью запись превращается в symlink, указывающий в другое место.
Что стоит усвоить — кто именно может выполнить эту подмену. Скрипт postinstall, file watcher, dev-сервер, раннер тестов или собственная предыдущая Bash-команда агента работают, пока сессия открыта. Рабочий каталог — не тихое место, и доверенным он никогда не был.
У Grep и Glob была версия той же дыры на чтение: правила deny из Read(...) не применялись к файлам, до которых добирались через путь поиска с symlink. Правило deny на secrets/** действовало при прямом чтении и молча переставало действовать, когда тот же файл находился через symlink, ведущий внутрь.
Два пути, пришедшие из конфигурации, а не от вас
Другие два зашли через файлы, которые едут вместе с репозиторием. Команды плагина, объявленные в записи маркетплейса, могли указывать за пределы каталога плагина; теперь такие пути отклоняются с явной ошибкой path traversal. А инструмент Workflow читал scriptPath за пределами того, что сессии разрешено читать, до того, как срабатывала проверка разрешений, — и затем цитировал содержимое в сообщении об ошибке, что превращает заблокированное чтение в успешное.
Тот же релиз продолжает затягивать настройки
Ещё с полдесятка изменений в 2.1.251 указывают в ту же сторону и одинаково относятся к склонированному репозиторию как к недоверенному вводу:
- Настройки проекта больше не могут включать подробную бета-трассировку и логирование сырых тел API-запросов. Это были ваши тела запросов.
ANTHROPIC_CUSTOM_HEADERSиз управляемых или проектных настроек теперь требует одобрения, когда задаёт заголовок с учётными данными, организацией/тенантом, маршрутизацией или поведением API — напримерAuthorizationилиHost.envв.claude/settings.jsonна уровне проекта больше не задаётCLAUDE_CONFIG_DIR,CLAUDE_CODE_TMPDIRиTMPDIR/TMP/TEMP— задавайте их в оболочке, пользовательских или управляемых настройках.- Проверки разрешений Bash перестали автоматически одобрять присваивание арифметического выражения целочисленной переменной оболочки (
OPTIND=1/0,RANDOM=2+2), которое до сих пор проскакивало как безобидное. - Управляемые сервером настройки, которые терминируют TLS песочницы, направляют её трафик через прокси, подставляют учётные данные или ослабляют изоляцию песочницы, теперь требуют одобрения, прежде чем применятся.
Ни одно из этих изменений само по себе не является эффектным эксплойтом. Вместе они закрывают расстояние между «система разрешений сказала нет» и «файл так и остался непрочитанным».
Обновление
claude update или переустановка из npm. Две заметки той же недели: 2.1.250 вышел в тот же день и содержит только исправления ошибок, а 2.1.248 (27 августа) добавил --restricted — то же самое, что CLAUDE_CODE_RESTRICTED=1, — который убирает инструменты, запускающие команды или код, отключает WebFetch, если вы не назвали его в --tools, держит файловые инструменты внутри рабочего каталога, отказывает в bypassPermissions и полностью игнорирует пользовательские, проектные и локальные файлы настроек. Этот флаг и исправления этой недели — один и тот же аргумент с двух сторон: настройки и пути, которые вам подаёт репозиторий, — это ввод, а не конфигурация.
Исправление маркетплейса, в частности, приходит через неделю после того, как 2.1.238 дал каталогам реальный охват, позволив маркетплейсу плагинов выпускать собственные заголовки аутентификации: чем больше может запись маркетплейса, тем прочнее должна держаться граница каталога вокруг неё.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.