dcg — защита от разрушительных команд AI-агентов

· 3 мин чтения
ai-agents security hooks guardrails cli rust
📂 Исходный код на GitHub

Высокопроизводительный хук для AI-агентов (Claude Code, Codex, Gemini CLI, Copilot, Cursor и др.), блокирующий опасные команды до их выполнения. 50+ пакетов правил: git, файловая система, базы данных, Kubernetes, облачные провайдеры. Написан на Rust.

dcg — защита от разрушительных команд AI-агентов

AI-агенты иногда запускают катастрофические команды. Вы говорите «поправь конфиг», а получаете rm -rf ./src. Часы несохранённой работы исчезают за секунду. dcg (Destructive Command Guard) решает эту проблему — перехватывает команды до выполнения и блокирует опасные, с задержкой меньше миллисекунды.

Что блокирует

Из коробки, без конфигурации, dcg защищает от самого страшного:

  • core.gitgit reset --hard, git push --force, git stash drop и другие операции, уничтожающие незакоммиченные изменения (всегда активен, отключить нельзя)
  • core.filesystemrm -rf за пределами временных директорий (всегда активен)
  • system.diskmkfs, dd на устройства, fdisk, parted, LVM-удаление (активен по умолчанию)

На Windows автоматически добавляются пакеты windows.filesystem (блокировка del /s, rd /s, Remove-Item -Recurse -Force) и windows.system (защита от vssadmin delete shadows, diskpart, Format-Volume).

Как выглядит блокировка

$ git reset --hard HEAD~5

════════════════════════════════════════════════════════════════
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.
════════════════════════════════════════════════════════════════

Понятное объяснение + предложение безопасной альтернативы. Без паники, без загадочных сообщений.

50+ пакетов правил

Все пакеты кроме core.* и system.disk подключаются опционально через ~/.config/dcg/config.toml:

[packs]
enabled = [
    "database.postgresql",
    "database.redis",
    "kubernetes.kubectl",
    "containers.docker",
    "cloud.aws",
    "infrastructure.terraform",
    "cicd.github_actions",
    "secrets.vault",
]

Одной строкой можно подключить семейство — например, "kubernetes" активирует все подпакеты (kubectl, helm, kustomize).

Полный каталог пакетов:

Категория Примеры
Базы данных PostgreSQL, MySQL, MongoDB, Redis, SQLite, Supabase
Контейнеры Docker, Docker Compose, Podman
Kubernetes kubectl, Helm, Kustomize
Облака AWS, Azure, GCP
Инфраструктура Terraform, Pulumi, Ansible, Atmos
CI/CD GitHub Actions, GitLab CI, CircleCI, Jenkins
Секреты Vault, AWS Secrets Manager, 1Password, Doppler
Хранилища S3, GCS, MinIO, Azure Blob
Бэкапы Borg, Restic, rclone, Velero
Платформы GitHub CLI, GitLab, Railway, Modal, Kamal
Мониторинг Datadog, New Relic, Prometheus, Splunk, PagerDuty
DNS Cloudflare, Route53, nsupdate
Поиск Elasticsearch, OpenSearch, Algolia, Meilisearch
Платежи Stripe, Braintree, Square
Почта Mailgun, SendGrid, Postmark, SES
Балансировщики ELB/ALB/NLB, HAProxy, nginx, Traefik
Очереди Kafka, RabbitMQ, NATS, SQS/SNS
CDN Cloudflare Workers, CloudFront, Fastly
API-шлюзы Apigee, AWS API Gateway, Kong
Windows Файловая система, диск, реестр, PowerShell

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

dcg не просто ищет подстроки. Он различает данные и команду:

  • grep "rm -rf" — это поиск текста, пропускается
  • rm -rf / — это выполнение команды, блокируется

Аналогично: echo "DROP TABLE" пройдёт, psql -c "DROP TABLE" — нет.

Сканирование heredoc и inline-скриптов

dcg анализирует содержимое heredoc-блоков и inline-команд:

# Будет заблокировано — dcg увидит os.remove() внутри python -c
python -c "import os; os.remove('/important/file')"

# Тоже — рекурсивно извлечёт внутреннюю команду из bash -c
bash -c "git reset --hard HEAD~1"

Трёхуровневая архитектура: триггер (быстрый regex, <100μs) → извлечение (<1ms) → AST-анализ (<5ms). На каждом уровне возможен ранний выход — команды без подозрительных паттернов пропускаются мгновенно.

Агент-специфичные профили

dcg автоматически определяет, какой AI-агент его вызывает, и применяет соответствующие настройки:

[agents.claude-code]
trust_level = "high"
additional_allowlist = ["npm run build", "cargo test"]
disabled_packs = ["kubernetes"]

[agents.unknown]
trust_level = "low"
extra_packs = ["paranoid"]
disabled_allowlist = true

Можно дать Claude Code больше свободы (расширенный allowlist, отключение Kubernetes-защиты), а незнакомым агентам — усиленный режим с полным отключением allowlist-обходов.

Поддерживаемые агенты

dcg работает с десятком AI-инструментов:

Агент Статус
Claude Code Полная интеграция через ~/.claude/settings.json
Codex CLI 0.125.0+ Нативный PreToolUse-хук в ~/.codex/hooks.json
Gemini CLI Автоматическая настройка
GitHub Copilot CLI Пользовательский хук через ~/.copilot/hooks/
VS Code Copilot Chat Через совместимость с Claude-хуками
Cursor ~/.cursor/hooks.json
Hermes Agent Через ~/.hermes/config.yaml
Grok (xAI) Нативные хуки в ~/.grok/hooks/
Antigravity CLI Через ~/.gemini/config/hooks.json
OpenCode Через community-плагин
Aider Только git-хуки
Continue Только обнаружение

Установка

curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh?$(date +%s)" | bash -s -- --easy-mode

Скрипт сам определяет платформу, скачивает бинарник, проверяет SHA256-контрольную сумму и настраивает хуки для всех найденных агентов. Для Windows — PowerShell-установщик.

Философия fail-open

Если dcg не может безопасно проанализировать команду (таймаут, ошибка парсинга, превышение лимитов) — он пропускает её, а не блокирует. Лучше пропустить одно опасное действие, чем сломать рабочий процесс ложной блокировкой.

Для высокобезопасных сред можно включить fail-closed режим:

[general]
fail_closed = true

Обход защиты

Когда действительно нужно выполнить заблокированную команду:

  • DCG_BYPASS=1 <команда> — разовый обход
  • dcg allow-once <код> — одноразовое разрешение по коду из сообщения
  • dcg allowlist add core.git:reset-hard -r "причина" — постоянное правило
  • dcg explain "команда" — понять, почему команда блокируется

Кастомные пакеты

Можно создавать собственные пакеты правил в YAML для внутренних инструментов:

[packs]
custom_paths = [
    "~/.config/dcg/packs/*.yaml",
    ".dcg/packs/*.yaml",
]

Валидация: dcg pack validate mypack.yaml.

Технические детали

  • Язык: Rust (nightly, Edition 2024)
  • Производительность: SIMD-ускоренная фильтрация, sub-millisecond latency
  • Конфигурация: TOML, многоуровневая (системный → пользовательский → проектный → env-переменные)
  • Вывод: rich-терминал для людей на stderr, machine-readable JSON для агентов на stdout
  • Режимы: scan (CI/pre-commit), explain, doctor, simulate, test
  • Лицензия: MIT

Итог

dcg — это пара строк в конфиге, которые однажды спасут вас от rm -rf не в той директории или git reset --hard не на той ветке. Установка за 30 секунд, накладные расходы незаметны, а спокойствия добавляет значительно. Обязательный инструмент для всех, кто работает с AI-агентами в терминале.

Источник: https://github.com/Dicklesworthstone/destructive_command_guard