fix(scripts): check-permissions.py does not flag allow rules for secrets read/delete #57
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Линтер
check-permissions.pyпроверяет permission-правила в.opencode/opencode.jsonи агентах: флагаетallowдля паттернов изDANGEROUS_PATTERNS(деструктивные команды, git clone, ssh-удаления и т.п.). Обнаружено во время работы над PR #55 (issue #54/#56): после ослабления линтера для docker/force-push паттернов проверялось, что линтер продолжается ловить реальные угрозы. Тест показал, чтоallowдляrm .env*иcat .env*НЕ флагаются линтером, хотя это прямая дыра — агент может читать или удалять файлы секретов безask/deny.Задача
Расширить
DANGEROUS_PATTERNSв.opencode/scripts/check-permissions.pyтак, чтобыallowдля паттернов чтения/удаления секретных файлов флагался как нарушение. Конкретно нужно ловить (неполный список — см. «Граничные случаи» для полного охвата):rm .env*(удаление секретов)cat .env*(чтение секретов через cat)git -C *префиксом если применимоКонтракты
python3 .opencode/scripts/check-permissions.pyexit 0 если нарушений нет, exit 1 если есть.DANGEROUS_PATTERNS— список кортежей(regex, reason, [scope]);scopeопционален ("agent"/"all"), если отсутствует —"all".check_rules()автоматически — менять функцию не нужно, только список.denyдля.env*/id_ed25519/id_rsa/*.pem/*secrets*вopencode.jsonНЕ флагаются (проверяется толькоaction != "allow").Инварианты
docker rm *,docker system prune*,docker volume rm *,git push --force*,git push -f*) продолжают НЕ флагаться.rm -rf,git clone,ssh * rm/reboot,git clean,sudo,docker rmi,docker network rm,git push --delete*.opencode.jsonостаётся валидным после правки скрипта (скрипт меняется, конфиг — нет).Граничные случаи
cat .env*vscat .env.production— glob должен покрывать оба.rm .env*vsrm -f .envvsrm -rf .env— нужно ли ловить все вариантыrmсекретов, или достаточноrm .env*? Решить при имплементации.head .env*/tail .env*/less .env*/more .env*/grep * .env*— другие способы чтения секретов. Решить, включать ли все или толькоcat.cp .env* */mv .env* *— копирование/перемещение секретов.ssh * cat .env*/ssh * rm .env*— секреты на удалённых хостах (уже частично покрываетсяssh * rm *для rm, но не для cat).git -C * rm .env*— удаление секретов через git.docker exec * cat .env*/docker exec * rm .env*— секреты в контейнерах (ноdocker exec * rm *ужеdenyв конфиге, так что может не бытьallow)..env*уже покрывает.env,.env.local,.env.production."all"(по умолчанию, без третьего элемента).Влияние на связанные компоненты
ci.yml): линтер запускается в CI; после добавления паттернов, если в конфиге найдётсяallowдля секретов — CI упадёт. Нужно убедиться, что текущий конфиг НЕ содержит такихallow(предварительная проверка показала, чтоcat .env*/rm .env*отсутствуют вallow, но это надо перепроверить при имплементации).allowдля секретов — CI начнёт падать. Нужно проверить всех агентов в.opencode/agents/*.md.Вне scope
npm install/pip installи т.п. — это уже вDANGEROUS_PATTERNS.DANGEROUS_PATTERNS(например, не выносить в отдельный конфиг-файл) — только расширить список.check_rules()/parse_agent_bash_rules()/parse_global_bash_rules().opencode.jsonpermission-блок.Критерии приемки
python3 .opencode/scripts/check-permissions.pyexit 0 на текущем конфиге (после merge PR #55).allowправила"cat .env*": "allow"вopencode.json(временно) — линтер флагает его как нарушение.allowправила"rm .env*": "allow"— линтер флагает его.denyправила для.env*/ключей НЕ флагаются.opencode.jsonостаётся валидным.allowдля секретов).