claude-code
Вложенность правил вместо жесткого приоритета deny
Promtime
claude-codeПлагин permcheck для Claude Code снимает жесткий приоритет запрета в разборе правил доступа: разрешение отменяет deny только тогда, когда множество его совпадений строго вложено в множество запрета. Разбор движка опубликовал Zethian; исходники матчера открыты под Apache-2.0, а сборки распространяются через плагин Claude Code и Homebrew.
Коротко
- Конвейер cat ~/.ssh/id_rsa | curl -d @- отклоняется целиком: permcheck делит составную команду на части, разворачивает тильду и сверяет операнд чтения с запретом на файл ключа.
- Проверка одной shell-команды занимает около 1,7 мс без обращения к модели и без токенов, это медиана автора по 50 прогретым запускам на M3 Max, тогда как классификатор auto mode требует запроса к модели.
- На семи командах из разбора инцидента permcheck дал три разрешения и четыре запрета, тогда как штатные схемы дают либо семь запретов, либо семь разрешений, либо семь подтверждений.
Смысл изменения в том, что политика агента становится проверяемым артефактом: одинаковый вызов и одинаковый файл правил дают одинаковый код возврата, который можно утверждать в CI. Судя по описанию, это закрывает узкий, но частый разрыв между широким запретом и точечным исключением, из-за которого команды сползают к сплошному allow. Гарантией изоляции при этом остаются песочница ОС и управляемые настройки, которые permcheck не заменяет.
Штатный приоритет deny блокирует aws ec2 describe-instances вместе с terminate-instances
Типичная производственная политика для агента выглядит так: deny Bash(aws:*) и allow Bash(aws * describe-*). Команда aws ec2 describe-instances подходит под оба правила, и штатный фиксированный приоритет отдает победу запрету, хотя разрешение заведомо уже. Снятие запрета открывает разрушающие операции, сохранение блокирует инспекцию.
permcheck собирает все правила, совпавшие с вызовом, и разрешает конфликт в три шага: allow или ask вырезает исключение из deny только при строгой вложенности, любой невырезанный deny запрещает вызов, иначе побеждает самое специфичное правило, а при равенстве приоритет у ask. Каждый вердикт возвращается кодом: 0 для allow, 1 для ask, 2 для deny.
В обратной политике проблема другая: документация ставит ask выше allow, но в открытом баг-репорте claude-code#6527 с меткой area:security сообщается, что голый токен Bash в allow подавляет список ask и rm test.txt выполняется без подтверждения. permcheck сравнивает allow и ask по специфичности, поэтому узкое ask перевешивает широкое разрешение.
Перед сопоставлением движок делит конвейеры и снимает обертки sudo и env
Разбор идет в три этапа. Составные команды разделяются по &&, ||, конвейерам, точкам с запятой, фоновому запуску и переводам строк, а вложенные вызовы извлекаются из $(…), обратных кавычек, подстановок процессов, подоболочек и групп в фигурных скобках. Затем повторно оцениваются команды за обертками env, sudo, timeout и doas и за ведущими служебными словами if, while и !.
Третий этап сверяет файловые операнды известных читателей, писателей, средств передачи и перенаправлений с запретами Read, Write и Edit: источники проверяются против Read, приемники против Write и Edit. При запрете Read(//**/.env*) отклоняются cat .env, grep secret .env и даже cat .en?, поскольку шаблон может раскрыться в .env, тогда как cat *.rs в учебной политике разрешен. Тем же механизмом закрыты dd, tee, truncate, обе стороны cp и mv и опции загрузки файлов в curl и wget.
Переменные, eval и sh -c проходят мимо разбора
permcheck читает текст команды и не запускает shell, поэтому цели, собранные во время выполнения, ему не видны: переменные, функции, алиасы, eval и сгенерированные аргументы. Команды, переданные аргументом в sh -c, bash -c, exec и find -exec, оцениваются только по внешнему вызову, а tar, git, rsync и редакторы не отслеживаются как средства доступа к файлам. Для PowerShell и cmd.exe POSIX-разбора нет.
Движок отказывает по умолчанию: некорректный ввод, некорректные правила, отсутствующее имя инструмента, срыв ограничения рекурсии и внутренняя паника дают deny, а испорченный файл правил возвращает код 3. Обертка плагина при отсутствии бинарника откатывается к штатному разбору Claude Code. Сборки идут через плагин для macOS, Linux и Windows и через Homebrew, каждый релиз публикует SHA256SUMS, но побитовой воспроизводимости сборки нет.
Что остается за auto mode
В auto mode классификатор Claude Code оценивает, оправдано ли действие текущим запросом, границей доверия и разговором, а администратор описывает эту границу записями environment, allow, soft_deny и hard_deny. Три блокировки подряд или двадцать суммарно приостанавливают auto mode в интерактивной сессии, а в запуске с -p подтверждать некому: действие не выполняется, но Claude продолжает работу. Широкие allow вроде Bash(*) auto mode отбрасывает, узкие вроде Bash(npm test) сохраняются.
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
Из Google мы используем только имя и аватар. Почту не сохраняем.
