Безопасность
Hermes Agent разработан с использованием модели глубокоэшелонированной защиты. На этой странице рассматриваются все границы безопасности — от утверждения команд до изоляции контейнера и авторизации пользователей на платформах обмена сообщениями.
Обзор
Модель безопасности имеет восемь уровней:
- Авторизация пользователя — кто может разговаривать с агентом (белые списки, соединение DM)
- Одобрение опасного командования — участие человека в разрушительных операциях
- Безопасность записи файлов — список запретов и дополнительная изолированная среда записи для
write_file/patch - Изоляция контейнера — Docker/Singularity/модальная песочница с усиленными настройками.
- Фильтрация учетных данных MCP — изоляция переменных среды для подпроцессов MCP.
- Сканирование контекстных файлов — оперативное обнаружение внедрения в файлы проекта.
- Межсессионная изоляция — сеансы не могут получить доступ к данным или состоянию друг друга; Пути хранения заданий cron защищены от атак с обходом пути
- Очистка ввода — параметры рабочего каталога в бэкэнде терминального инструмента проверяются на соответствие списку разрешенных, чтобы предотвратить внедрение оболочки.
Утверждение опасной команды
Прежде чем выполнить любую команду, Hermes сверяет ее с тщательно подобранным списком опасных шаблонов. Если совпадение найдено, пользователь должен явно одобрить его.
Режимы одобрения
Система утверждения поддерживает три режима, настроенных через approvals.mode в ~/.hermes/config.yaml:
approvals:
mode: smart # smart | manual | off
timeout: 300 # seconds to wait for user response (default: 300)
cron_mode: deny # deny | approve — what cron jobs do when they hit a dangerous command
mcp_reload_confirm: true # /reload-mcp asks before invalidating the MCP tool cache
destructive_slash_confirm: true # /clear, /new, /reset, /undo prompt before discarding state
Полный комплект ключей:
| Ключ | По умолчанию | Что он контролирует |
|---|---|---|
режим |
умный |
Политика одобрения опасных команд оболочки — см. таблицу ниже. |
тайм-аут |
300 |
Секунды Hermes ожидает ответа об утверждении, прежде чем истечет время ожидания. |
cron_mode |
отрицать |
Как задания cron ведут себя бездумно, когда вызывают опасную командную строку. deny блокирует команду (агент должен найти другой путь); approve автоматически одобряет все в контексте cron. |
mcp_reload_confirm |
правда |
Если это правда, /reload-mcp запрашивает перед пересборкой набора инструментов MCP. Перестроение делает недействительным кэш подсказок поставщика (схемы инструментов находятся в системной подсказке), поэтому следующее сообщение повторно отправляет полные входные токены. Пользователи, которые нажимают Всегда одобрять, переключают этот ключ на «ложь». |
destructive_slash_confirm |
правда |
Если установлено значение true, деструктивные команды слэша сеанса (/clear, /new, /reset, /undo) запрашивают перед отменой состояния диалога. Диалоговое окно с тремя опциями (Однократное одобрение/Всегда утверждать/Отмена), направляемое через встроенные кнопки «да/нет» в Telegram, Discord и Slack; резервный текст в другом месте. Пользователи, которые нажимают Всегда одобрять, переключают этот ключ на «false». TUI использует собственное модальное наложение (задайте HERMES_TUI_NO_CONFIRM=1, чтобы отказаться от него). |
| Режим | Поведение |
|---|---|
| умный (по умолчанию) | Используйте вспомогательный LLM для оценки риска. Команды с низким уровнем риска (например, python -c "print('hello')") автоматически одобряются только для этой команды. Действительно опасные команды автоматически отклоняются. Сомнительные случаи переходят к подсказке вручную. |
| руководство | Всегда запрашивайте у пользователя подтверждение опасных команд. |
| выкл. | Отключите все проверки одобрения — это эквивалентно запуску с --yolo. Все команды выполняются без подсказок. |
Установка approvals.mode: off отключает все запросы безопасности. Используйте только в доверенных средах (CI/CD, контейнеры и т. д.). |
|
| ### Режим ЙОЛО |
Режим YOLO обходит все запросы на одобрение опасных команд для текущего сеанса. Его можно активировать тремя способами:
- Флаг CLI: запустите сеанс с помощью
hermes --yoloилиhermeschat --yolo - Команда косой черты: введите
/yoloво время сеанса, чтобы включить или выключить ее. - Переменная среды: установите
HERMES_YOLO_MODE=1
Команда /yolo представляет собой переключатель — каждое ее использование включает или выключает режим:
> /yolo
⚡ YOLO mode ON — all commands auto-approved. Use with caution.
> /yolo
⚠ YOLO mode OFF — dangerous commands will require approval.
Режим YOLO доступен как в сеансах CLI, так и в сеансах шлюза. Внутри он устанавливает переменную среды HERMES_YOLO_MODE, которая проверяется перед каждым выполнением команды.
Когда YOLO активен, Hermes показывает два постоянных визуальных напоминания, поэтому трудно забыть, что запросы на одобрение игнорируются:
- Красная строка-баннер в начале сеанса, когда YOLO уже активен:
⚠ Режим YOLO — все запросы на одобрение игнорируются. Скрывается, когда YOLO выключен, поэтому баннер по умолчанию остается незагроможденным. — Фрагмент⚠ YOLOв строке состояния на всех уровнях ширины, обновляемый в реальном времени при включении или выключении YOLO (рендеринг форматированного текста и резервный вариант простого текста).Для деструктивных команд слэша сеанса (🚨 Danger
Режим YOLO отключает все проверки безопасности опасных команд для сеанса — кроме жесткого черного списка (см. ниже). Используйте только в том случае, если вы полностью доверяете генерируемым командам (например, хорошо проверенным сценариям автоматизации в одноразовых средах)./clear,/new//reset,/undo,/quit --delete—/exit --deleteявляется псевдонимом), CLI также запрашивает подтверждение перед их запуском. См. Команды слэша — запросы подтверждения для деструктивных команд.
Жесткий черный список (всегда на этаже)
Некоторые команды настолько катастрофичны — необратимые очистки файловой системы, форк-бомбы, прямая запись на блок-устройства — что Hermes отказывается выполнять их независимо от:
--yolo//yoloвключеноapprovals.mode: выключено- Задания Cron выполняются в автономном режиме утверждения. – Пользователь явно нажимает «разрешить всегда».
Черный список находится этажом ниже --yolo. Он срабатывает до того, как уровень утверждения увидит команду, и флаг переопределения отсутствует. Рассматриваемые на данный момент шаблоны (не исчерпывающие; синхронизируются с tools/approval.py::UNRECOVERABLE_BLOCKLIST):
| Узор | Почему это жестко |
|---|---|
rm -rf / и очевидные варианты |
Очищает корень файловой системы |
rm -rf --no-preserve-root / |
Явный вариант «да, я имею в виду root» |
:(){:\|:& };: (бомба-вилка) |
Привязывает хост до перезагрузки |
mkfs.* на смонтированном корневом устройстве |
Форматирует живую систему |
dd if=/dev/zero of=/dev/sd* |
Обнуляет физический диск |
Передача ненадежных URL-адресов в sh на верхнем уровне rootfs |
Вектор атаки с удаленным выполнением кода слишком широк, чтобы его можно было одобрить |
Если вы попадете в черный список, вызов инструмента вернет агенту пояснительную ошибку, и ничего не запустится. Если законному рабочему процессу требуется одна из этих команд (например, вы являетесь оператором конвейера очистки и переустановки), запустите ее вне агента.
Пользовательские правила запрета (approvals.deny)
Жесткий черный список фиксирован и поставляется в виде кода. approvals.deny является его редактируемым пользователем аналогом: список шаблонов glob, которые безоговорочно блокируют соответствующие команды терминала — перед проверяются --yolo, /yolo и approvals.mode: off. Используйте его для запуска yolo-with-Exceptions: «позволяйте агенту делать все, кроме этих конкретных вещей, когда-либо».
approvals:
deny:
- "git push --force*"
- "*curl*|*sh*"
- "dd if=* of=/dev/*"
Подробности:
- Шаблоны представляют собой fnmatch glob (
*,?,[...]), сопоставляемые без учета регистра со всем текстом команды.git push --force*соответствуетgit push --force origin main, но не соответствуетgit push origin main. - Сопоставление выполняется по тем же нормализованным/деобфусцированным вариантам команд, которые использует детектор опасных шаблонов, поэтому простые приемы цитирования (
git pu""sh --force) не ускользают от правил. - Цитирование YAML: всегда цитируйте шаблоны. Пустой ведущий
*является псевдонимом YAML и не может быть проанализирован;{,!и:имеют свои собственные значения YAML. Одинарные кавычки наиболее безопасны для содержимого оболочки. - Правила запрета применяются к бэкэндам, имеющим доступ к хосту (локальный, SSH, Docker, установленный на хосте). Серверные части изолированных контейнеров, как и всегда, полностью пропускают защитный стек — ничто из того, что они запускают, не может коснуться хоста.
- Отклоненная команда возвращает агенту ошибку BLOCKED, сообщая ему не повторять попытку и не перефразировать. Ничего не бежит.
Как и остальная часть конфигурации утверждения, изменения вступают в силу немедленно (кеш конфигурации имеет ключ mtime) — перезапуск сеанса не требуется.
📝 Note
Модель угроз Правила запрета — это ограждение от честного, но неправильного агента, та же модель угроз, что и детектор опасных шаблонов. Они не являются «песочницей» против заведомо состязательного процесса — для этого используйте изолированный бэкэнд (Docker, Modal) или среду с ограниченным исходящим доступом.Тайм-аут одобрения
При появлении опасной командной строки у пользователя есть настраиваемое время для ответа. Если в течение таймаута не получен ответ, команда по умолчанию отклонена (закрытие при сбое).
Настройте таймаут в ~/.hermes/config.yaml:
approvals:
timeout: 300 # seconds (default: 300)
Что вызывает одобрение
Следующие шаблоны вызывают запросы на одобрение (определенные в tools/approval.py):
| Узор | Описание |
|---|---|
rm -r / rm --recursive |
Рекурсивное удаление |
рм... / |
Удалить в корневом пути |
chmod 777/666 / o+w / a+w |
Разрешения на запись для всех/других |
chmod --recursive с небезопасными разрешениями |
Рекурсивный мир/записываемый другими (длинный флаг) |
chown -R root / chown --recursive root |
Рекурсивное управление root |
мкфс |
Формат файловой системы |
дд, если= |
Копия диска |
> /dev/sd |
Записать на блокировку устройства |
УДАЛЕНИЕ ТАБЛИЦЫ/БАЗЫ ДАННЫХ |
SQL ПАДЕНИЕ |
УДАЛЕНИЕ ОТ (без ГДЕ) |
SQL DELETE без WHERE |
УСЕЧАТЬ ТАБЛИЦУ |
SQL УСЕЧЕНИЕ |
> /etc/ |
Перезаписать конфигурацию системы |
systemctl стоп/перезапуск/отключение/маска |
Остановить/перезапустить/отключить системные службы |
убить -9 -1 |
Убить все процессы |
pkill -9 |
Принудительное уничтожение процессов |
| Выкройки вилочных бомб | Вилочные бомбы |
bash -c / sh -c / zsh -c / ksh -c |
Выполнение команд оболочки через флаг -c (включая комбинированные флаги, такие как -lc) |
python -e / perl -e / ruby -e / node -c |
Выполнение скрипта через флаг -e/-c |
завиток... \| sh/wget...\| ш |
Перенаправить удаленный контент в оболочку |
bash <(curl...) / sh <(wget...) |
Выполнить удаленный скрипт через подстановку процесса |
tee в /etc/, ~/.ssh/, ~/.hermes/.env |
Перезаписать конфиденциальный файл через тройник |
> / >> в /etc/, ~/.ssh/, ~/.hermes/.env |
Перезаписать конфиденциальный файл с помощью перенаправления |
xargs rm |
xargs с rm |
найти -exec rm / найти -удалить |
Находка с разрушительными действиями |
cp/mv/install в /etc/ |
Скопировать/переместить файл в конфигурацию системы |
sed -i / sed --in-place в /etc/ |
Редактирование конфигурации системы на месте |
pkill/killall Hermes/шлюз |
Предотвращение самоликвидации |
gateway run с &/disown/nohup/setsid |
Предотвращает запуск шлюза за пределами диспетчера служб |
docker stop/kill/restart, docker Compose down/stop/kill/restart |
Жизненный цикл контейнера (также отслеживает глобальные флаги и docker-compose) |
docker -H/--host/--context, DOCKER_HOST=/DOCKER_CONTEXT= |
Перенаправление демона Docker — команда нацелена на другой (часто удаленный) демон |
использование контекста докера |
Переключает демон по умолчанию для всех будущих команд Docker |
podman --remote/-r/--url/--connection/--identity, CONTAINER_HOST= |
Перенаправление удаленного демона Podman |
Обход контейнера: при работе в бэкэндах docker, singularity, modal, daytona или vercel_sandbox проверки опасных команд пропускаются, поскольку контейнер сам по себе является границей безопасности. Деструктивные команды внутри контейнера не могут нанести вред хосту. |
|
| ### Поток утверждения (CLI) |
В интерактивном интерфейсе командной строки опасные команды отображают встроенный запрос на одобрение:
⚠️ DANGEROUS COMMAND: recursive delete
rm -rf /tmp/old-project
[o]nce | [s]ession | [a]lways | [d]eny
Choice [o/s/a/D]:
Четыре варианта:
- once — разрешить это однократное выполнение
- session — разрешить этот шаблон до конца сеанса.
- всегда — добавить в постоянный белый список (сохраняется в
config.yaml) - deny (по умолчанию) — заблокировать команду
Поток утверждения (шлюз/обмен сообщениями)
На платформах обмена сообщениями агент отправляет в чат сведения об опасной команде и ждет ответа пользователя:
– Ответьте да, да, одобрить, ок или идти, чтобы одобрить. – Чтобы отклонить, ответьте нет, n, отклонить или отменить.
Переменная среды HERMES_EXEC_ASK=1 автоматически устанавливается при запуске шлюза.
Постоянный белый список
Команды, одобренные с помощью «всегда», сохраняются в ~/.hermes/config.yaml:
# Permanently allowed dangerous command patterns
command_allowlist:
- rm
- systemctl
Эти шаблоны загружаются при запуске и автоматически одобряются во всех последующих сеансах.
💡 Tip
Используйтеhermes config edit, чтобы просмотреть или удалить шаблоны из вашего постоянного белого списка.История разрешений на добычу полезных ископаемых («подсказывают утверждения Hermesа»)
Вместо того, чтобы отвечать на одни и те же запросы сеанс за сеансом, вы можете прошлые решения об утверждении в предложениях по белому списку:
hermes approvals suggest # dry run — prints a numbered proposal
hermes approvals suggest --apply 1,3 # merge picks into command_allowlist
hermes approvals suggest --json # machine-readable output
Команда сканирует базу данных сеанса (~/.hermes/state.db) на наличие
классифицированные как опасные команды, которые фактически выполнялись, т. е. команды, которые вы
утверждено — объединяет их в шаблоны (git push * или Опасный класс
ключ для составных команд) и ранжирует их по частоте одобрения:
Proposed command_allowlist additions (from approval history, last 90 days):
1. git push * — approved 14x
2. docker restart/stop/kill (container lifecycle) — approved 9x (class key)
Правила безопасности:
- Ничто не применяется автоматически — запуск по умолчанию доступен только для чтения;
только явный
--apply N[,M...]записывает вconfig.yaml. - Деструктивные занятия никогда не предлагаются, как бы часто они ни предлагались.
одобрено: рекурсивное удаление,
sudo, запись на диск/устройство, учетные данные и редактирование конфигурации системы, передача данных в оболочку, SQL DROP/TRUNCATE, уничтожение процессов и каждый бескомпромиссный класс полностью исключен.rm -rf build/одобрено 100 times по-прежнему никогда не дает записиrm. - Предложения, уже включенные в существующий список
command_allowlist, пропускаются.
Полезные флаги: --days N (окно истории, по умолчанию 90), --min-count N
(минимальное количество разрешений для соответствия, по умолчанию 2), --limit N и --db PATH.
Безопасность записи в файл {#file-write-safety}
Прежде чем write_file или patch коснутся диска, Hermes проверяет целевой путь на наличие списка запрещенных файлов и дополнительной песочницы. Заблокированные записи немедленно возвращают агенту сообщение об ошибке — нет запроса на одобрение и нет возможности переопределить его из пользовательского интерфейса чата. Модель по-прежнему может утверждать, что редактирование прошло успешно; когда display.file_mutation_verifier включен (по умолчанию), доверяйте нижнему колонтитулу проверки мутации файла, а не итоговой сводке помощника.
Защищенные пути (всегда заблокированы)
Эти категории всегда запрещены, даже если HERMES_WRITE_SAFE_ROOT не установлен:
| Категория | Примеры |
|---|---|
| Хранилища учетных данных ОС | ~/.ssh/, ~/.aws/, ~/.kube/, /etc/sudoers, ~/.netrc |
| Магазины сертификатов Hermes | auth.json, .env, .anthropic_oauth.json, mcp-tokens/, pairing/ под HERMES_HOME (активный профиль и глобальный корень) |
| Секретные файлы проекта | .env, .env.local, .env.production, .envrc в любом месте на диске |
Чувствительные пути внутри безопасного корня по-прежнему заблокированы — указание HERMES_WRITE_SAFE_ROOT на $HOME не позволяет писать ~/.ssh/id_rsa.
Нарушения безопасного root-доступа возвращают Запись запрещена: '…' находится за пределами HERMES_WRITE_SAFE_ROOT (…). Блоки пути к учетным данным используют Запись запрещена: '…' — это защищенный файл системы/учетных данных.
HERMES_WRITE_SAFE_ROOT (необязательная песочница)
Если они установлены, write_file и patch могут указывать только на пути внутри перечисленных префиксов каталогов. Все, что находится снаружи, жестко блокируется и не проходит через одобрение опасного командования.
- Устанавливается автоматически в официальном образе Docker (
HERMES_WRITE_SAFE_ROOT=/opt/data) - Поддерживает несколько корней, разделенных
:в Unix или;в Windows. - Не добавляйте в
~/.hermes/.envслучайно. Если вы установите его в каталог проекта, агент не сможет писать в~/.hermes/cron/jobs.json, навыки профиля или другое состояние Hermes за пределами этого префикса.
Чтобы разрешить одновременно рабочее пространство и дом Hermes:
export HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes
Снимите настройку переменной, чтобы восстановить неограниченную запись (с учетом списка запретов защищенного пути). Полная ссылка: HERMES_WRITE_SAFE_ROOT.
Крон и прочие состояния Hermesа
Не просите агента «исправить» ~/.hermes/cron/jobs.json напрямую. Используйте инструмент cronjob, hermes cron или /cron — они обновляют хранилище заданий через поддерживаемый API. То же самое относится и к другим управляющим файлам Hermes, когда безопасность записи блокирует прямое редактирование.:::Примечание: Глубокоэшелонированная защита, а не жесткие границы
Защита от записи применяется только к write_file и patch. Инструмент «терминал» запускается от имени того же пользователя ОС и по-прежнему может «кошать» или перезаписывать запрещенные пути с помощью команд оболочки. Список запретов уменьшает случайные повреждения и дает моделям четкий сигнал остановки; он не помещает в «песочницу» враждебный или скомпрометированный агент.