Start Debugging

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 указывают в ту же сторону и одинаково относятся к склонированному репозиторию как к недоверенному вводу:

Ни одно из этих изменений само по себе не является эффектным эксплойтом. Вместе они закрывают расстояние между «система разрешений сказала нет» и «файл так и остался непрочитанным».

Обновление

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.

< Назад