dcg (Destructive Command Guard)
Высокопроизводительный хук для агентов ИИ-программирования, блокирующий деструктивные команды до их выполнения. Защищает работу от случайного удаления в Claude Code, Codex CLI, Gemini CLI, Copilot CLI, VS Code Copilot Chat, Cursor, Hermes Agent, Grok (xAI), Posit Assistant и аналогичных инструментах.
Поддерживаемые инструменты: Claude Code, Codex CLI 0.125.0+, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Cursor IDE, Hermes Agent, Posit Assistant (расширение для Positron/RStudio, отдельный сервер и терминальный клиент pa), Grok (xAI) (нативный ~/.grok/hooks/ и слой совместимости с Claude), Antigravity CLI (agy) (нативный ~/.gemini/config/hooks.json через dcg install --agy), OpenCode (нативный плагин tool.execute.before через dcg install --opencode — см. docs/opencode-integration.md), Pi (через рецепт расширения), Aider (ограниченно — только git-хуки), Continue (только обнаружение)
Быстрая установка
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh?$(date +%s)" | bash -s -- --easy-mode
Работает в Linux, macOS и Windows через WSL. Автоматически определяет платформу, загружает подходящий бинарный файл и настраивает хуки для поддерживаемых агентов: Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat (через совместимость с Claude-хуками), Cursor IDE, Hermes Agent, Posit Assistant и Grok (xAI) (через dcg install --grok для нативного ~/.grok/hooks/dcg.json или через слой совместимости с Claude, который Grok подхватывает автоматически). Для нативного Windows используйте установщик PowerShell ниже.
Windows (нативно, PowerShell)
& ([scriptblock]::Create((irm "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.ps1"))) -EasyMode -Verify
Устанавливает нативный dcg.exe, проверяет обязательную контрольную сумму SHA256, проверяет долгосрочную подпись minisign для релиза (если доступен minisign) и проверяет происхождение через Sigstore/cosign (если доступны cosign и доверенный пакет). Добавляет dcg в пользовательский PATH (-EasyMode), запускает самопроверку (-Verify) и настраивает обнаруженные агентские хуки для Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, Cursor IDE, Hermes Agent и Posit Assistant. Copilot настраивается на уровне пользователя в %COPILOT_HOME%\hooks (или %USERPROFILE%\.copilot\hooks), так что защита применяется ко всем рабочим пространствам. В Windows пакеты windows.filesystem и windows.system включены по умолчанию, поэтому del /s, rd /s, Remove-Item -Recurse (с -Force и без), format и vssadmin delete shadows блокируются сразу после установки. Зафиксировать конкретную версию можно через -Version vX.Y.Z; флаг -RequireMinisign переводит инструмент в режим отказа при недоступности вспомогательной утилиты или верификатора.
TL;DR
Проблема: агенты ИИ-программирования (Claude, Codex, Gemini, Copilot и др.) время от времени выполняют катастрофические команды вроде git reset --hard, rm -rf ./src или DROP TABLE users — и уничтожают часы незафиксированной работы за секунды.
Решение: dcg — высокопроизводительный хук, который перехватывает деструктивные команды до их выполнения, блокирует их с понятными объяснениями и предлагает более безопасные альтернативы.
Зачем использовать dcg?
| Возможность | Что делает |
|---|---|
Защита без настройки |
Блокирует опасные git- и файловые команды сразу после установки |
50+ пакетов безопасности |
Базы данных, Kubernetes, Docker, AWS/GCP/Azure, Terraform и многое другое |
Задержка меньше миллисекунды |
SIMD-ускоренная фильтрация — присутствие хука незаметно |
Сканирование heredoc и встроенных скриптов |
Перехватывает |
Умное определение контекста |
Не блокирует |
Богатый вывод в терминале |
Понятные панели блокировки, контекст правил и предложения в stderr |
Безопасные потоки для агентов |
Машиночитаемый вывод хука остаётся в stdout, а пользовательский интерфейс — в stderr |
Нативная поддержка Codex |
Codex CLI 0.125.0+ получает минимальный JSON-отказ в stdout, который текущие клиенты надёжно применяют |
Плавная деградация |
Простой вывод для CI, каналов, «тупых» терминалов и окружений без цвета |
Режим сканирования для CI |
Хуки перед коммитом и интеграция с CI для отлова опасных команд при code review |
Ограниченная политика отказов |
Таймауты анализа превращаются в явные решения «проверить/заблокировать»; некорректные конверты raw-хуков остаются аудируемыми и настраиваемыми |
Режим объяснений |
|
Быстрый пример
# Агент ИИ пытается выполнить:
$ git reset --hard HEAD~5
# dcg перехватывает и блокирует:
════════════════════════════════════════════════════════════════
BLOCKED dcg
────────────────────────────────────────────────────────────────
Reason: git reset --hard destroys uncommitted changes
Command: git reset --hard HEAD~5
Tip: Consider using 'git stash' first to save your changes.
════════════════════════════════════════════════════════════════
Включение расширенной защиты
# ~/.config/dcg/config.toml
[packs]
enabled = [
"database.postgresql", # Блокирует DROP TABLE, TRUNCATE
"kubernetes.kubectl", # Блокирует kubectl delete namespace
"cloud.aws", # Блокирует aws ec2 terminate-instances
"containers.docker", # Блокирует docker system prune
]
Профили для конкретных агентов
dcg автоматически определяет, какой агент ИИ-программирования его вызывает, и может применять специфическую для агента конфигурацию. Поле trust_level — это вспомогательная метка, которая записывается в JSON-вывод и логи, но не влияет напрямую на оценку правил. Поведенческие отличия определяются остальными полями профиля:
| Опция | Эффект |
|---|---|
|
Исключает пакеты правил из оценки |
|
Добавляет пакеты правил к оценке |
|
Добавляет шаблоны команд, которые обходят запрещающие правила |
|
При значении |
# Больше доверия Claude Code — широкий список разрешений, меньше пакетов
[agents.claude-code]
trust_level = "high"
additional_allowlist = ["npm run build", "cargo test"]
disabled_packs = ["kubernetes"]
# Ограничения для неизвестных агентов — дополнительные правила, без обхода через список разрешений
[agents.unknown]
trust_level = "low"
extra_packs = ["strict_git", "database"] # реальные идентификаторы пакетов/категорий (см. `dcg packs`)
disabled_allowlist = true
extra_packs и disabled_packs принимают те же идентификаторы пакетов и категорий, что и [packs] enabled/disabled: идентификатор категории вроде "database" раскрывается во все входящие в неё подпакеты. Используйте идентификаторы из вывода dcg packs или из docs/packs/README.md; "paranoid" — это режим постепенного ужесточения, а не пакет, поэтому для строгих git-правил включайте реальный пакет strict_git.
Полная документация по поддерживаемым агентам, уровням доверия и параметрам настройки — в docs/agents.md.
Поддержка Codex
dcg теперь рассматривает Codex CLI как полноценный целевой объект хука, а не просто как путь совместимости в форме Claude. Установщик автоматически настраивает Codex CLI 0.125.0+, когда обнаруживает codex в PATH или существующий каталог ~/.codex/.
| Поведение Codex | Обработка в dcg |
|---|---|
Конфигурация хука |
Добавляет хук |
Заблокированная команда |
Завершает работу с кодом 0 и минимальным отказом |
Разрешённая команда |
Завершает работу с кодом 0 при пустых stdout и stderr |
Существующие хуки |
Сохраняет соседние хуки, оставляет dcg первым для Bash и отказывается перезаписывать некорректный JSON |
Валидация |
Покрыта тестами subprocess-протокола и опциональным E2E-тестом с реальным Codex |
Формат входных данных хука у Codex намеренно близок к формату Claude Code, но Codex отклоняет неизвестные поля в выводе хука. dcg определяет payload Codex по непустому полю turn_id и выдаёт только задокументированные поля отказа Codex — тогда заблокированная команда фиксируется именно как заблокированная, а не как сбой хука. Подробности протокола, ручные проверки и решение проблем — в docs/codex-integration.md.
Происхождение и авторы
Проект начался как Python-скрипт Джеффри Эмануэля (Jeffrey Emanuel), который обнаружил, что агенты ИИ-программирования, при всей своей полезности, иногда выполняют катастрофические команды, уничтожающие часы незафиксированной работы. Исходная реализация была простым, но эффективным хуком, перехватывающим опасные git- и файловые команды до их выполнения.
-
Jeffrey Emanuel — исходная концепция и реализация на Python (источник); значительно расширил версию на Rust, добавив модульную систему пакетов (50+ пакетов безопасности), сканирование heredoc и встроенных скриптов, трёхуровневую архитектуру, классификацию контекста, списки разрешений, режим сканирования и раздельные потоки вывода
-
Darin Gordon — первоначальный перенос на Rust с оптимизациями производительности
Первоначальный перенос на Rust сохранил совместимость шаблонов с оригинальной реализацией на Python и добавил выполнение за субмиллисекундное время благодаря SIMD-ускоренной фильтрации и лениво компилируемым регулярным выражениям. Впоследствии Джеффри существенно расширил кодовую базу на Rust, добавив описанные выше возможности.
Аварийный выход / обход блокировки
Если dcg блокирует что-то, что реально нужно выполнить:
| Метод | Область действия | Как использовать |
|---|---|---|
Переменная окружения |
Одна команда |
|
Одноразовый код разрешения |
Одна команда |
Скопируйте короткий код из сообщения о блокировке и выполните |
Постоянный список разрешений |
Правило или команда |
|
Удаление хука |
Все команды |
Удалите или закомментируйте запись dcg в |
DCG_BYPASS=1 отключает всю защиту для данного вызова. Используйте эту опцию осторожно и предпочитайте списки разрешений для регулярных нужд.
Модульная система пакетов
dcg использует модульную систему «пакетов» для организации шаблонов деструктивных команд по категориям. Пакеты можно включать и отключать в файле конфигурации.
Идентификатор категории раскрывается во все входящие в неё подпакеты. Указание голой категории в enabled включает все пакеты под ней: enabled = ["database"] активирует database.postgresql, database.mysql и остальные пакеты категории. При этом отдельный подпакет можно отключить через disabled = ["database.redis"]. Та же логика раскрытия работает для extra_packs/disabled_packs в профилях агентов. Всегда используйте реальные идентификаторы пакетов и категорий из dcg packs / docs/packs/README.md — имя вроде "paranoid" является режимом постепенного ужесточения, а не пакетом.
-
Полный индекс идентификаторов пакетов:
docs/packs/README.md -
Канонические описания и количество шаблонов:
dcg packs --verbose
Включено по умолчанию (без файла конфигурации)
При отсутствии файла конфигурации dcg включает только пакеты, защищающие от наиболее катастрофических и необратимых ошибок:
-
core.filesystem— опасные рекурсивные операцииrmи аналогичное уничтожение файловой системы за пределами буквальных временных подкаталогов (всегда включён; нельзя отключить) -
core.git— деструктивные git-команды, уничтожающие незафиксированную работу, переписывающие историю или удаляющие стэши (всегда включён; нельзя отключить) -
system.disk—mkfs, записьddна устройство,fdisk,parted,mdadm, удаление черезlvm,wipefs(включён по умолчанию; отключить черезdisabled = ["system.disk"])
В Windows по умолчанию дополнительно включены два пакета, чтобы свежая установка сразу блокировала катастрофические нативные операции без какой-либо настройки:
-
windows.filesystem— cmddel /s,rd /s,format <диск>:и PowerShellRemove-Item -Recurse(с-Forceи без; включены псевдонимы),Clear-Content,Clear-RecycleBin(включён по умолчанию только в Windows; отключить черезdisabled = ["windows.filesystem"]или["windows"]) -
windows.system—vssadmin delete shadows/wmic shadowcopy delete(уничтожение теневых копий тома),diskpart,Format-Volume,Clear-Disk,Remove-Partition,cipher /w,bcdedit /delete(включён по умолчанию только в Windows; отключить черезdisabled = ["windows.system"]или["windows"])
Более широкие пакеты windows.misc (reg delete, net user /delete, wsl --unregister, robocopy /MIR) и windows.powershell (удаление ключей реестра/провайдеров, Remove-LocalUser, Disable-ComputerRestore, Remove-VM) подключаются вручную на любой платформе. В Unix пакеты windows.* зарегистрированы, но отключены по умолчанию; включить их (например, для сканирования зафиксированных .ps1/.cmd-скриптов в CI) можно через [packs] enabled = ["windows"].
Все остальные пакеты — включая database.postgresql и containers.docker — подключаются вручную и не активны, пока файл конфигурации их не включит. Команда dcg init создаёт стартовый файл ~/.config/dcg/config.toml, в котором [packs] enabled включает database.postgresql и containers.docker в качестве распространённых примеров, — но это сгенерированный шаблон, а не поведение по умолчанию при отсутствии конфигурации. Чтобы включить любой из приведённых ниже пакетов, добавьте его в [packs] enabled — см. раздел Включение расширенной защиты.
Пакеты хранилища (Storage Packs)
-
storage.s3— защита от деструктивных операций с S3: удаление бакетов, рекурсивное удаление объектов,sync --delete. -
storage.gcs— защита от деструктивных операций с GCS: удаление бакетов, удаление объектов, рекурсивное удаление. -
storage.minio— защита от деструктивных операций клиента MinIO (mc): удаление бакетов, удаление объектов, административные операции. -
storage.azure_blob— защита от деструктивных операций с Azure Blob Storage: удаление контейнеров, удаление блобов,azcopy remove.
Пакеты удалённого доступа (Remote Packs)
-
remote.rsync— защита от деструктивных операций rsync:--deleteи его варианты. -
remote.scp— защита от деструктивных операций SCP: перезапись системных путей. -
remote.ssh— защита от деструктивных операций SSH: удалённое выполнение команд, управление ключами.
Пакеты баз данных (Database Packs)
-
database.postgresql— защита от деструктивных операций PostgreSQL:DROP DATABASE,TRUNCATE,dropdb. -
database.mysql— защита MySQL/MariaDB. -
database.mongodb— защита от деструктивных операций MongoDB:dropDatabase,dropCollection,removeбез критериев. -
database.redis— защита от деструктивных операций Redis:FLUSHALL,FLUSHDB, массовое удаление ключей. -
database.sqlite— защита от деструктивных операций SQLite:DROP TABLE,DELETEбезWHERE, случайная потеря данных. -
database.snowflake— защита встроенных запросовsnow sql, файлов, stdin, вложенных источников, деструктивных операций с данными, конвейеров, хранилищ и привилегий аккаунта. -
database.supabase— защита от деструктивных операций Supabase CLI: сброс базы данных, откат миграций, удаление функций/секретов/хранилища, удаление проектов, изменения инфраструктуры. -
database.bigquery— защита CLIbqи GoogleSQL от удаления датасетов (DROP SCHEMA), перезаписи таблиц, неотфильтрованных DML (WHERE TRUE— идиома полного перебора в GoogleSQL) и настроек, сокращающих окно восстановления через time travel.
Пакеты контейнеров (Container Packs)
-
containers.docker— защита от деструктивных операций Docker:system prune,volume prune, принудительное удаление. -
containers.compose— защита от деструктивных операций Docker Compose:down -v, удаляющая тома. -
containers.podman— защита от деструктивных операций Podman:system prune,volume prune, принудительное удаление.
Пакеты Kubernetes
-
kubernetes.kubectl— защита от деструктивных операций kubectl:delete namespace,drain, массовое удаление. -
kubernetes.helm— защита от деструктивных операций Helm:uninstall,rollbackбез--dry-run. -
kubernetes.kustomize— защита от деструктивных операций Kustomize в сочетании сkubectl deleteили при применении без проверки.
Пакеты облачных провайдеров (Cloud Provider Packs)
-
cloud.aws— защита от деструктивных операций AWS CLI:terminate-instances,delete-db-instance,s3 rm --recursive. -
cloud.azure— защита от деструктивных операций Azure CLI:vm delete,storage account delete,resource group delete. -
cloud.gcp— защита от деструктивных операций gcloud:instances delete,sql instances delete,gsutil rm -r.
Пакеты CDN
-
cdn.cloudflare_workers— защита от деструктивных операций Cloudflare Workers, KV, R2 и D1 через Wrangler CLI. -
cdn.cloudfront— защита от деструктивных операций AWS CloudFront: удаление дистрибутивов, политик кэширования, функций. -
cdn.fastly— защита от деструктивных операций Fastly CLI: удаление сервисов, доменов, бэкендов, VCL.
Пакеты API-шлюзов (API Gateway Packs)
-
apigateway.apigee— защита от деструктивных операций Google Apigee CLI и apigeecli. -
apigateway.aws— защита от деструктивных операций AWS API Gateway CLI для REST API и HTTP API. -
apigateway.kong— защита от деструктивных операций Kong Gateway CLI, deck CLI и Admin API.
Пакеты инфраструктуры (Infrastructure Packs)
-
infrastructure.ansible— защита от деструктивных операций Ansible: опасные shell-команды, запуск плейбуков без проверки. -
infrastructure.atmos— защита от деструктивных операций Atmos:terraform deploy(с auto-approve),clean,destroy,state rm/taint,helmfile destroy. -
infrastructure.pulumi— защита от деструктивных операций Pulumi:destroy,upс-y(auto-approve). -
infrastructure.terraform— защита от деструктивных операций Terraform:destroy,taint,applyс-auto-approve.
Системные пакеты (System Packs)
-
system.disk— защита от деструктивных операций с дисками: записьddна устройства,mkfs, изменение таблицы разделов (fdisk/parted), управление RAID (mdadm), операции с файловой системой btrfs, device-mapper (dmsetup), сетевые блочные устройства (nbd-client), LVM-команды (pvremove,vgremove,lvremove,lvreduce,pvmove). -
system.permissions— защита от опасных изменений прав доступа:chmod 777, рекурсивныйchmod/chownсистемных каталогов. -
system.services— защита от опасных операций с сервисами: остановка критических сервисов, изменение конфигурации init.
Пакеты CI/CD
-
cicd.circleci— защита от деструктивных операций CircleCI: удаление контекстов, секретов, orb/пространств имён, конвейеров. -
cicd.github_actions— защита от деструктивных операций GitHub Actions: удаление секретов/переменных, DELETE-запросы черезgh apiк/actions-эндпоинтам. -
cicd.gitlab_ci— защита от деструктивных операций GitLab CI/CD: удаление переменных, артефактов, отмена регистрации раннеров. -
cicd.jenkins— защита от деструктивных операций Jenkins CLI/API: удаление заданий, узлов, учётных данных, истории сборок.
Пакеты управления секретами (Secrets Management Packs)
-
secrets.aws_secrets— защита от деструктивных операций с AWS Secrets Manager и SSM Parameter Store:delete-secret,delete-parameter. -
secrets.doppler— защита от деструктивных операций Doppler CLI: удаление секретов, конфигураций, окружений, проектов. -
secrets.onepassword— защита от деструктивных операций 1Password CLI: удаление элементов, документов, пользователей, групп, хранилищ. -
secrets.vault— защита от деструктивных операций Vault CLI: удаление секретов, отключение движков аутентификации/секретов, отзыв lease/токенов, удаление политик.
Платформенные пакеты (Platform Packs)
-
platform.github— защита от деструктивных операций GitHub CLI: удаление репозиториев, gist, релизов, SSH-ключей. -
platform.gitlab— защита от деструктивных операций GitLab: удаление проектов, релизов, защищённых веток, вебхуков. -
platform.kamal— защита от деструктивных операций Kamal 2.x, разрушающих стек (kamal remove), удаляющих каталоги данных аксессуаров (kamal accessory remove), отключающих маршрутизацию через прокси, переводящих приложение в офлайн или удаляющих образы, необходимые дляkamal rollback. -
platform.modal— защита от деструктивных операций платформы Modal: рекурсивное удаление томов, принудительная остановка приложений (--force), удаление секретов. -
platform.railway— защита от деструктивных операций Railway CLI и Public API: удаление проектов, окружений, сервисов, функций, томов, переменных, деплойментов.
Пакеты DNS
-
dns.cloudflare— защита от деструктивных операций Cloudflare DNS: удаление записей, зон, точечное уничтожение через Terraform. -
dns.generic— защита от деструктивных или рискованных операций DNS-инструментов: удаление черезnsupdate, передача зон. -
dns.route53— защита от деструктивных операций AWS Route53: удаление хостинговых зон, DELETE-изменения наборов записей.
Почтовые пакеты (Email Packs)
-
email.mailgun— защита от деструктивных операций Mailgun API: удаление доменов, маршрутов, списков рассылки. -
email.postmark— защита от деструктивных операций Postmark API: удаление серверов, шаблонов, подписей отправителей. -
email.sendgrid— защита от деструктивных операций SendGrid API: удаление шаблонов, API-ключей, аутентификации доменов. -
email.ses— защита от деструктивных операций AWS Simple Email Service: удаление идентификаторов, шаблонов, наборов конфигурации.
Пакеты флагов функциональности (Feature Flag Packs)
-
featureflags.flipt— защита от деструктивных операций Flipt CLI и API. -
featureflags.launchdarkly— защита от деструктивных операций LaunchDarkly CLI и API. -
featureflags.split— защита от деструктивных операций Split.io CLI и API. -
featureflags.unleash— защита от деструктивных операций Unleash CLI и API.
Пакеты балансировщиков нагрузки (Load Balancer Packs)
-
loadbalancer.elb— защита от деструктивных операций AWS Elastic Load Balancing (ELB/ALB/NLB): удаление балансировщиков нагрузки, целевых групп, отмена регистрации целей в живом трафике. -
loadbalancer.haproxy— защита от деструктивных операций HAProxy: остановка сервиса, отключение бэкендов через runtime API. -
loadbalancer.nginx— защита от деструктивных операций nginx: остановка сервиса, удаление файлов конфигурации. -
loadbalancer.traefik— защита от деструктивных операций Traefik: остановка контейнеров, удаление конфигурации, API-удаления.
Пакеты очередей сообщений (Messaging Packs)
-
messaging.kafka— защита от деструктивных операций Kafka CLI: удаление топиков, групп потребителей, сброс смещений, удаление записей. -
messaging.nats— защита от деструктивных операций NATS/JetStream: удаление потоков, потребителей, записей key-value, объектов, аккаунтов. -
messaging.rabbitmq— защита от деструктивных операций RabbitMQ: удаление очередей/обменников, очистка очередей, удаление vhost, сброс состояния кластера. -
messaging.sqs_sns— защита от деструктивных операций AWS SQS и SNS: удаление очередей, очистка сообщений, удаление топиков, удаление подписок.
Пакеты мониторинга (Monitoring Packs)
-
monitoring.datadog— защита от деструктивных операций Datadog CLI/API: удаление мониторов и дашбордов. -
monitoring.newrelic— защита от деструктивных операций New Relic CLI/API: удаление сущностей и ресурсов алертинга. -
monitoring.pagerduty— защита от деструктивных операций PagerDuty CLI/API: удаление сервисов и расписаний (что может нарушить маршрутизацию инцидентов). -
monitoring.prometheus— защита от деструктивных операций Prometheus/Grafana: удаление временных рядов, дашбордов, источников данных. -
monitoring.splunk— защита от деструктивных операций Splunk CLI/API: удаление индексов, DELETE-вызовы REST API.
Платёжные пакеты (Payment Packs)
-
payment.braintree— защита от деструктивных операций Braintree/PayPal: удаление клиентов, отмена подписок через API/SDK. -
payment.square— защита от деструктивных операций Square CLI/API: удаление каталожных объектов или клиентов (что может нарушить платёжные потоки). -
payment.stripe— защита от деструктивных операций Stripe CLI/API: удаление вебхук-эндпоинтов и клиентов, ротация API-ключей без координации.
Пакеты поисковых движков (Search Engine Packs)
-
search.algolia— защита от деструктивных операций Algolia: удаление индексов, очистка объектов, удаление правил/синонимов и API-ключей. -
search.elasticsearch— защита от деструктивных операций Elasticsearch REST API: удаление индексов,delete-by-query, закрытие индексов, изменение настроек кластера. -
search.meilisearch— защита от деструктивных операций Meilisearch REST API: удаление индексов, удаление документов,delete-batch, удаление API-ключей. -
search.opensearch— защита от деструктивных операций OpenSearch REST API и удаления доменов через AWS CLI.
Пакеты резервного копирования (Backup Packs)
-
backup.borg— защита от деструктивных операций borg:delete,prune,compact,recreate. -
backup.rclone— защита от деструктивных операций rclone:sync,delete,purge,dedupe,move. -
backup.restic— защита от деструктивных операций restic: удаление снимков, обрезка данных, удаление ключей, очистка кэша. -
backup.velero— защита от деструктивных операций velero: удаление бэкапов, расписаний, мест хранения.
Пакеты Windows
Нативная защита от деструктивных команд для Windows (cmd.exe + PowerShell). Пакеты windows.filesystem и windows.system включены по умолчанию в Windows (в Unix отключены и подключаются вручную); пакеты windows.misc и windows.powershell подключаются вручную на всех платформах. Все шаблоны нечувствительны к регистру.
-
windows.filesystem— рекурсивное/принудительное уничтожение файловой системы: cmddel /s,rd /s/rmdir /s,format <диск>:; PowerShellRemove-Item -Recurse(с-Forceи без;-Forceлишь расширяет охват на скрытые/защищённые от записи элементы; псевдонимыrm/del/rd/riвключены),Clear-Content,Clear-RecycleBin. В список разрешений внесены только предварительные просмотры с-WhatIfдля командлетов/псевдонимов, которые его поддерживают, а также удаление в temp-каталогах. -
windows.system— катастрофические дисковые/системные операции:vssadmin delete shadowsиwmic shadowcopy delete(уничтожение теневых копий тома — характерный признак ransomware),diskpart,Format-Volume,Clear-Disk,Remove-Partition,Initialize-Disk/Reset-PhysicalDisk,cipher /w,bcdedit /delete. -
windows.misc— уничтожение реестра/аккаунтов/сервисов/WSL/копий:reg delete,net user|localgroup /delete,sc delete,schtasks /delete,wsl --unregister(уничтожает дистрибутив WSL),robocopy /MIR(зеркалирование с удалением). -
windows.powershell— деструктивные командлеты PowerShell: удаление ключей реестра/провайдеров (Remove-Item HKLM:\,Remove-ItemProperty,Remove-PSDrive),Remove-LocalUser/Remove-LocalGroup,Unregister-ScheduledTask,Disable-ComputerRestore, принудительныеStop-Computer/Restart-Computer,Remove-VM/Remove-AppxPackage.
Пресет «Осторожная компания в Windows» (Careful Company Windows)
Все остальные пакеты отвечают на вопрос: «уничтожит ли эта команда что-нибудь?». Данный пресет также отвечает на вопросы: «отправляет ли эта команда наши данные куда-то» и «отключает ли она механизмы контроля?» — что особенно важно, когда агент работает на рабочей станции Windows с отключёнными запросами разрешений инструментов. Одна и та же политика применяется к статически проверяемым командам, передаваемым через PowerShell или cmd.exe, включая экранирование каретой в Cmd, управляющие префиксы, вложенные cmd /c / call и цепочки команд. Пресет подключается вручную на любой платформе; одна строка включает всю политику:
[packs]
enabled = ["careful_company_running_windows"]
При включении именно этого идентификатора пресета дедлайн оценки хука по умолчанию составляет 3000 мс вместо обычных 1000 мс, если в конфигурации или DCG_HOOK_TIMEOUT_MS явно не задано другое значение. Это изменяет только время, доступное для принятия того же решения о закрытии при сбое. Проверить действующее значение и его источник можно командой dcg config --format json.
Это включает шесть описанных ниже подпакетов и уже имеющееся покрытие уничтожения данных, которое также нужно этой политике: текущие пакеты windows., database. (включая Snowflake), storage., remote., backup., secrets. и cloud.. Состав — это явный зафиксированный список, а не правило по префиксу, поэтому будущий пакет, добавленный в одну из используемых категорий, не войдёт в эту политику безопасности автоматически — его придётся добавить намеренно. (Будущий подпакет careful_company_running_windows. войдёт — через обычное раскрытие категории.) Любой участник можно исключить индивидуально через disabled = ["remote.rsync"].
-
careful_company_running_windows.email— отправка почты с рабочей станции:Send-MailMessage,System.Net.Mail.SmtpClient, автоматизация Outlook через COM,sendMailMicrosoft Graph, эндпоинты отправки транзакционных почтовых API,aws ses send-email, SMTP CLI-инструменты (blat,swaks,msmtp,git send-email,curl --mail-rcpt) и правила постоянной пересылки (New-InboxRule -ForwardTo,Set-Mailbox -ForwardingSmtpAddress). -
careful_company_running_windows.chat— чат и назначения вебхуков: входящие вебхуки и Web API Slack с правом записи, коннекторы Teams и триггеры Power Automate, Discord, Telegram, Google Chat, Twilio, Zapier/IFTTT, PagerDuty, перехватчики запросов —webhook.site,interact.sh. -
careful_company_running_windows.upload— примитивы HTTP-загрузки файлов (-InFile,-Form,curl -T,-F field=@file,--data-binary @file,--post-file,WebClient.UploadFile,GetRequestStream,MultipartFormDataContent, BITS-загрузки), сервисы обмена файлами,gh gist create,certreq -Post, тела запросов, построенные из файла или буфера обмена. -
careful_company_running_windows.transfer— исходящая передача файлов: scp/sftp/WinSCP на удалённый адрес, скриптовый FTP,tftp put, rsync и rclone на удалённый ресурс, загрузки в облачное хранилище (aws s3 cpлокальное→s3://,az storage blob upload, azcopy,gsutil cp→gs://, b2/s3cmd/mc/wrangler r2), одноранговые отправители, монтирование WebDAV и LOLBin-копирование (esentutl /y,print /D:). -
careful_company_running_windows.tunnel— каналы, открывающие рабочую станцию или обходящие инспекцию: ngrok, cloudflared, devtunnel/code tunnel, localtunnel,tailscale funnel,ssh -R/-D, chisel/frp, ncat/netcat/socat, сырые сокеты PowerShell,netsh interface portproxy, DNS-туннели и домены обратного вызова. -
careful_company_running_windows.guardrails— отключение системы безопасности: Defender (Set-MpPreference -Disable*/-ExclusionPath), брандмауэр, сервисы EDR и журналов событий, BitLocker,Set-ExecutionPolicy Bypass, ведение журнала блоков скриптов, очистка журналов событий, собственныеDCG_BYPASS,dcg uninstall, выдача разрешений (dcg allowlist add,dcg allow-once), переопределения конфигурации в рантайме (DCG_DISABLE/DCG_PACKS/DCG_CONFIG) и конфигурация хуков агента, а также непроверенный удалённый код (iwr | iex,powershell -EncodedCommand, удалённые payload mshta/regsvr32). Диагностика остаётся открытой:dcg explain,dcg allowlist listиdcg allowlist validateвнесены в список разрешений.
Ложноположительные срабатывания — это ключевое проектное ограничение. Правила требуют положительных свидетельств утечки данных: прикреплённого файла, известного хоста-получателя, мутирующего метода — поэтому обычные GET-запросы, загрузки через -OutFile/curl -o и все установки пакетных менеджеров проходят беспрепятственно (единственное исключение — запросы к известным сервисам обмена файлами или вставки, которые лишь предупреждают, а не блокируют). Запросы, все адресаты которых являются внутренними (loopback, RFC1918, .internal/.corp/*.local, простые интранет-имена хостов), внесены в список разрешений; при этом эндпоинты метаданных облака (169.254.169.254, metadata.google.internal) намеренно из него исключены. Поиск по токену (Select-String "Send-MailMessage" *.ps1) и dcg explain "<команда>" никогда не блокируются. git push на именованный remote не затрагивается, SMB-копирование на корпоративный ресурс — вне области применения.
Действительно неоднозначные случаи предупреждают вместо блокировки (серьёзность Medium: команда выполняется, решение записывается) — POST со встроенным телом так же часто является GraphQL-запросом, как и утечкой данных. При необходимости можно повысить строгость:
[policy.rules]
"careful_company_running_windows.upload:cli-http-mutating-request" = "deny"
"careful_company_running_windows.upload:ps-http-mutating-request" = "deny"
|
Примечание
|
В этом пресете есть одна встроенная граница доверия, о которой следует знать. Пока любой пакет |
Другие внутренние инструменты первой стороны такого исключения не получают и должны добавляться в список разрешений — это сохраняет разрешение узким и задокументированным:
dcg allowlist add-command "mytool publish --to https://artifacts.corp.internal" \
-r "First-party internal publisher" --user
Прочие пакеты
-
package_managers— защита от опасных операций пакетных менеджеров: публикация пакетов, удаление критических системных пакетов. -
strict_git— более строгая защита git: блокирует все принудительные push, rebase и операции перезаписи истории.
Включите пакеты в ~/.config/dcg/config.toml:
[packs]
enabled = [
# Базы данных
"database.postgresql",
"database.redis",
"database.supabase",
# Контейнеры и оркестрация
"containers.docker",
"kubernetes", # Включает все подпакеты kubernetes
# Облачные провайдеры
"cloud.aws",
"cloud.gcp",
# Управление секретами
"secrets.aws_secrets",
"secrets.vault",
# CI/CD
"cicd.jenkins",
"cicd.gitlab_ci",
# Очереди сообщений
"messaging.kafka",
"messaging.sqs_sns",
# Поисковые движки
"search.elasticsearch",
# Резервное копирование
"backup.restic",
# Платформы
"platform.github",
"platform.railway",
# Мониторинг
"monitoring.splunk",
]
Пользовательские пакеты (Custom Packs)
Создавайте собственные пакеты безопасности для вашей организации с помощью YAML-файлов. Пользовательские пакеты позволяют задавать шаблоны для внутренних инструментов, скриптов развёртывания и проприетарных систем — без изменения кода dcg.
[packs]
custom_paths = [
"~/.config/dcg/packs/*.yaml", # Пользовательские пакеты
".dcg/packs/*.yaml", # Пакеты уровня проекта
]
Подробное руководство по созданию пакетов, справочник схемы и примеры — в docs/custom-packs.md.
Перед развёртыванием проверьте пакет:
dcg pack validate mypack.yaml
Конфигурация сканирования heredoc:
[heredoc]
# Включить сканирование heredoc и встроенных скриптов (python -c, bash -c и т.д.).
enabled = true
# Бюджет таймаута на извлечение (в миллисекундах).
timeout_ms = 50
# Ограничения ресурсов для извлечённых тел.
max_body_bytes = 1048576
max_body_lines = 10000
max_heredocs = 10
# Необязательный фильтр по языкам (сканировать только эти языки). Опустите для «всех».
# languages = ["python", "bash", "javascript", "typescript", "ruby", "perl", "go"]
# Запасное поведение heredoc (строгий режим может блокировать вместо этого).
fallback_on_parse_error = true
fallback_on_timeout = true
Переопределения CLI для сканирования heredoc:
-
--heredoc-scan/--no-heredoc-scan -
--heredoc-timeout <мс> -
--heredoc-languages <язык1,язык2,…>
Документация по heredoc:
-
docs/adr-001-heredoc-scanning.md(архитектура и обоснование) -
docs/patterns.md(создание шаблонов и инвентарь) -
docs/security.md(модель угроз и реагирование на инциденты)
Трёхуровневая архитектура heredoc
Сканирование heredoc и встроенных скриптов использует трёхуровневый конвейер, разработанный для производительности и точности:
Входная команда
│
▼
┌─────────────────┐
│ Уровень 1: │ ─── Нет совпадения ──► РАЗРЕШИТЬ (быстрый путь, <100 мкс)
│ Триггер │
│ (RegexSet) │
└────────┬────────┘
│ Совпадение
▼
┌─────────────────┐
│ Уровень 2: │ ─── Ошибка/Таймаут ──► РЕЗЕРВНОЕ СКАНИРОВАНИЕ или БЛОКИРОВКА (строгий режим)
│ Извлечение │
│ (<1 мс) │
└────────┬────────┘
│ Успех
▼
┌─────────────────┐
│ Уровень 3: │ ─── Нет совпадения ──► РАЗРЕШИТЬ
│ AST │ ─── Совпадение ──► БЛОКИРОВАТЬ
│ (<5 мс) │
└─────────────────┘
Уровень 1: Обнаружение триггеров (<100 мкс)
Сверхбыстрая фильтрация с помощью регулярных выражений для обнаружения признаков heredoc. Использует скомпилированный RegexSet для сопоставления с O(n) по всем триггерным шаблонам одновременно:
static HEREDOC_TRIGGERS: LazyLock<RegexSet> = LazyLock::new(|| {
RegexSet::new([
r"<<-?\s*(?:['\x22][^'\x22]*['\x22]|[\w.-]+)", // Heredocs
r"<<<", // Here-строки
r"\bpython[0-9.]*\b.*\s+-[A-Za-z]*[ce]", // python -c/-e
r"\bruby[0-9.]*\b.*\s+-[A-Za-z]*e", // ruby -e
r"\bnode(js)?[0-9.]*\b.*\s+-[A-Za-z]*[ep]", // node -e/-p
r"\b(sh|bash|zsh)\b.*\s+-[A-Za-z]*c", // bash -c
// ... другие шаблоны
])
});
Команды без каких-либо триггерных шаблонов сразу переходят к РАЗРЕШЕНИЮ — дальнейшая обработка не требуется.
Уровень 2: Извлечение содержимого (<1 мс)
Для команд, совпавших с триггером, извлекается фактическое содержимое для оценки:
-
Heredocs:
cat <<EOF … EOF→ извлекает тело между разделителями -
Here-строки:
cat <<< "содержимое"→ извлекает содержимое в кавычках -
Встроенные скрипты:
python -c "код"→ извлекает аргумент с кодом
Извлечение ограничено настраиваемыми лимитами:
-
Максимальный размер тела (по умолчанию: 1 МБ)
-
Максимальное количество строк (по умолчанию: 10 000)
-
Максимальное количество heredoc на команду (по умолчанию: 10)
-
Таймаут (по умолчанию: 50 мс)
pub struct ExtractionLimits {
pub max_body_bytes: usize,
pub max_body_lines: usize,
pub max_heredocs: usize,
pub timeout_ms: u64,
}
Уровень 3: Сопоставление с AST-шаблонами (<5 мс)
Извлечённое содержимое анализируется с помощью языкозависимых AST-грамматик (через tree-sitter/ast-grep) и сопоставляется со структурными шаблонами:
// Пример: обнаружение subprocess.run с shell=True и rm -rf
let pattern = r#"
call_expression {
function: attribute { object: "subprocess" attr: "run" }
arguments: argument_list {
contains string { contains "rm -rf" }
contains keyword_argument { keyword: "shell" value: "True" }
}