DCG: защита от деструктивных команд в AI-агентах

dcg (Destructive Command Guard)

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 и встроенных скриптов

Перехватывает python -c "os.remove(…​)" и встроенные shell-скрипты

Умное определение контекста

Не блокирует grep "rm -rf" (данные), но блокирует rm -rf / (выполнение)

Богатый вывод в терминале

Понятные панели блокировки, контекст правил и предложения в stderr

Безопасные потоки для агентов

Машиночитаемый вывод хука остаётся в stdout, а пользовательский интерфейс — в stderr

Нативная поддержка Codex

Codex CLI 0.125.0+ получает минимальный JSON-отказ в stdout, который текущие клиенты надёжно применяют

Плавная деградация

Простой вывод для CI, каналов, «тупых» терминалов и окружений без цвета

Режим сканирования для CI

Хуки перед коммитом и интеграция с CI для отлова опасных команд при code review

Ограниченная политика отказов

Таймауты анализа превращаются в явные решения «проверить/заблокировать»; некорректные конверты raw-хуков остаются аудируемыми и настраиваемыми

Режим объяснений

dcg explain "команда" показывает, почему что-то заблокировано

Быстрый пример

# Агент ИИ пытается выполнить:
$ 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-вывод и логи, но не влияет напрямую на оценку правил. Поведенческие отличия определяются остальными полями профиля:

Опция Эффект

disabled_packs

Исключает пакеты правил из оценки

extra_packs

Добавляет пакеты правил к оценке

additional_allowlist

Добавляет шаблоны команд, которые обходят запрещающие правила

disabled_allowlist

При значении true игнорирует все записи в списке разрешений

# Больше доверия 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

Конфигурация хука

Добавляет хук PreToolUse Bash в ~/.codex/hooks.json

Заблокированная команда

Завершает работу с кодом 0 и минимальным отказом hookSpecificOutput в stdout; предупреждение для пользователя остаётся в stderr

Разрешённая команда

Завершает работу с кодом 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_BYPASS=1 <команда>

Одноразовый код разрешения

Одна команда

Скопируйте короткий код из сообщения о блокировке и выполните dcg allow-once <код>

Постоянный список разрешений

Правило или команда

dcg allowlist add core.git:reset-hard -r "причина"

Удаление хука

Все команды

Удалите или закомментируйте запись dcg в ~/.claude/settings.json (или в эквивалентном файле вашего агента)

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.diskmkfs, запись dd на устройство, fdisk, parted, mdadm, удаление через lvm, wipefs (включён по умолчанию; отключить через disabled = ["system.disk"])

В Windows по умолчанию дополнительно включены два пакета, чтобы свежая установка сразу блокировала катастрофические нативные операции без какой-либо настройки:

  • windows.filesystem — cmd del /s, rd /s, format <диск>: и PowerShell Remove-Item -Recurse-Force и без; включены псевдонимы), Clear-Content, Clear-RecycleBin (включён по умолчанию только в Windows; отключить через disabled = ["windows.filesystem"] или ["windows"])

  • windows.systemvssadmin 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 — защита CLI bq и 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 — рекурсивное/принудительное уничтожение файловой системы: cmd del /s, rd /s/rmdir /s, format <диск>:; PowerShell Remove-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, sendMail Microsoft 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 cpgs://, 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"
Примечание

В этом пресете есть одна встроенная граница доверия, о которой следует знать. Пока любой пакет careful_company_running_windows. включён, команда с исполняемым файлом hfdt (с необязательным указанием пути) допускается *без оценки каких-либо пакетов вообще — не только пакетов этого пресета. hfdt rm -rf /data разрешается при включённом пресете и блокируется при выключенном. Исключение является структурным, а не текстовым: оно требует, чтобы hfdt был фактическим исполняемым файлом всей команды, и отклоняет цепочки, перенаправление и подстановку процессов — то есть hfdt …; Invoke-RestMethod … и hfdt $(…) оцениваются в обычном порядке. Если вы не используете этот инструмент, исключение никогда не сработает; если используете — считайте его явным решением полностью доверять ему. См. docs/careful-company-windows.md.

Другие внутренние инструменты первой стороны такого исключения не получают и должны добавляться в список разрешений — это сохраняет разрешение узким и задокументированным:

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" }
        }
© 2026 meganuke