Безопасность Hermes Agent
Источник
1. Обзор модели безопасности
Модель безопасности Hermes основана на принципе защиты углублением (defense-in-depth) и включает 7 слоёв:
- Авторизация пользователей — кто может общаться с агентом
- Утверждение опасных команд — человек в цикле для деструктивных операций
- Изоляция контейнеров — Docker/Singularity/Modal песочница
- Фильтрация учётных данных MCP — изоляция переменных окружения
- Сканирование контекстных файлов — обнаружение prompt injection
- Изоляция между сессиями — сессии не могут обращаться к данным друг друга
- Санитизация ввода — валидация рабочей директории для предотвращения shell injection
2. Утверждение опасных команд
Режимы утверждения:
| Режим | Поведение |
|---|---|
| manual | Всегда запрашивает подтверждение |
| smart | Вспомогательная LLM оценивает риск. Низкий риск — автоматически, высокий — блокирует, неопределённый — ручное подтверждение |
| off | Все проверки отключены (эквивалент --yolo) |
3. YOLO режим
Отключает все запросы подтверждения опасных команд на текущую сессию.
Активация:
Визуальные напоминания:
- Красный баннер при запуске:
⚠ YOLO mode — all approval prompts bypassed ⚠ YOLOв строке состояния
Важно: В YOLO режиме все паттерны из списка опасных команд пропускаются без запроса подтверждения. Единственное ограничение — паттерны, которые Hermes считает полностью деструктивными и блокирует даже в YOLO (такие как rm -rf /), но в текущей реализации это те же паттерны из DANGEROUS_PATTERNS.
4. Паттерны, вызывающие утверждение
Все опасные команды определены в DANGEROUS_PATTERNS в tools/approval.py. При обнаружении любого из них пользователю предлагается подтверждение:
5. Паттерны, вызывающие утверждение
| Паттерн | Описание |
|---|---|
rm -r / rm --recursive | Рекурсивное удаление |
rm ... / | Удаление в корне |
chmod 777/666 | Мир/все записи |
chown -R root | Рекурсивная смена владельца на root |
mkfs | Форматирование файловой системы |
dd if= | Копирование диска |
DROP TABLE/DATABASE | SQL DROP |
DELETE FROM (без WHERE) | SQL DELETE без условия |
TRUNCATE TABLE | SQL TRUNCATE |
> /etc/ | Перезапись системного конфига |
systemctl stop/restart/disable/mask | Остановка системных сервисов |
kill -9 -1 | Убийство всех процессов |
curl ... | sh / wget ... | sh | Пайп удалённого контента в shell |
bash <(curl ...) | Выполнение удалённого скрипта |
tee в /etc/, ~/.ssh/, ~/.hermes/.env | Запись в чувствительные файлы |
sed -i на /etc/ | Редактирование системных файлов |
pkill/killall hermes/gateway | Самоубийство процесса |
Примечание: В контейнерах (Docker, Singularity, Modal) проверки опасных команд пропускаются — сам контейнер является границей безопасности.
6. Поток утверждения (CLI)
| Опция | Действие |
|---|---|
| once | Разрешить одно выполнение |
| session | Разрешить этот паттерн до конца сессии |
| always | Добавить в постоянный список разрешений |
| deny | Заблокировать команду (по умолчанию) |
7. Поток утверждения (Gateway/Мессенджеры)
Ответные сообщения:
yes,y,approve,ok,go— одобритьno,n,deny,cancel— отклонить
8. Постоянный список разрешений
Команды, одобренные через "always", сохраняются в config.yaml:
Просмотр и редактирование: hermes config edit
9. Авторизация пользователей (Gateway)
Порядок проверки:
- Флаг
*_ALLOW_ALL_USERSдля платформы - Список утверждённых через pairing
- Списки конкретных платформ (
TELEGRAM_ALLOWED_USERSи т.д.) - Глобальный список (
GATEWAY_ALLOWED_USERS) - Глобальный флаг
GATEWAY_ALLOW_ALL_USERS - По умолчанию: запрет
Списки платформ:
Важно: Если списки не настроены и GATEWAY_ALLOW_ALL_USERS не установлен, все пользователи блокируются.
10. Система DM Pairing
Для гибкой авторизации Hermes использует систему кодов на основе одноразовых кодов.
Как работает:
- Неизвестный пользователь отправляет DM боту
- Бот отвечает 8-символьным кодом pairing
- Владелец выполняет
hermes pairing approve <platform> <code> - Пользователь утверждается навсегда
Настройка поведения:
CLI команды:
Хранение:
%LOCALAPPDATA%\hermes\pairing\{platform}-pending.json%LOCALAPPDATA%\hermes\pairing\{platform}-approved.json%LOCALAPPDATA%\hermes\pairing\_rate_limits.json
11. Изоляция контейнеров (Docker)
Флаги безопасности:
Лимиты ресурсов:
12. Сравнение безопасности терминальных бэкендов
| Бэкенд | Изоляция | Проверка опасных команд | Назначение |
|---|---|---|---|
| local | Нет | Да | Разработка, доверенные пользователи |
| ssh | Удалённая машина | Да | Запуск на отдельном сервере |
| docker | Контейнер | Нет (контейнер — граница) | Продакшн |
| singularity | Контейнер | Нет | HPC окружения |
| modal | Облачная песочница | Нет | Масштабируемая облачная изоляция |
| daytona | Облачная песочница | Нет | Постоянные облачные рабочие пространства |
13. Проброс переменных окружения
Фильтрация по умолчанию:
| Песочница | Фильтр по умолчанию | Переопределение |
|---|---|---|
| execute_code | Блокирует переменные с KEY, TOKEN, SECRET, PASSWORD и т.д. | ✅ Passthrough |
| terminal (local) | Блокирует инфраструктурные переменные Hermes | ✅ Passthrough |
| terminal (Docker) | Без переменных хоста по умолчанию | ✅ Passthrough + docker_forward_env |
| terminal (Modal) | Без переменных/файлов хоста | ✅ Credential files + env passthrough |
| MCP | Всё заблокировано кроме безопасных системных переменных | ❌ Используйте env конфиг |
Проброс переменных для скиллов:
Ручной проброс:
14. Безопасность MCP
Безопасные переменные окружения для MCP:
- переменные
XDG_*.
Конфигурация MCP серверов:
Маскировка учётных данных:
- GitHub PATs (
ghp_...) - OpenAI ключи (
sk-...) - Bearer токены
token=,key=,API_KEY=,password=,secret=
15. Блокировка веб-сайтов
16. SSRF защита
Все инструменты с URL проверяют адреса перед загрузкой. Блокируются:
- Приватные сети (RFC 1918):
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - Loopback:
127.0.0.0/8,::1 - Link-local:
169.254.0.0/16(включая облачные метаданные169.254.169.254) - CGNAT:
100.64.0.0/10(Tailscale, WireGuard) - Облачные метаданные:
metadata.google.internal,metadata.goog
Для разрешения приватных URL:
17. Tirith — предварительное сканирование
Интеграция с tirith для обнаружения:
- Homograph URL атак
- Пайпинг интерпретаторов (
curl | bash) - Terminal injection атак
Примечание: На Windows tirith пропускается (используйте WSL).
18. Защита контекстных файлов от injection
Паттерны обнаружения:
- Инструкции игнорировать предыдущие указания
- Скрытые HTML-комментарии
- Попытки чтения секретов (
.env,credentials,.netrc) - Эксплуатация учётных данных через
curl - Невидимые Unicode символы (zero-width spaces, bidirectional overrides)
При обнаружении:
19. Ленивая установка зависимостей
Hermes устанавливает опциональные пакеты при первом использовании, а не все сразу.
Отключение:
20. Чеклист безопасности для продакшна
- Явные списки разрешений — никогда не используйте
GATEWAY_ALLOW_ALL_USERS=true - Контейнерный бэкенд —
terminal.backend: docker - Лимиты ресурсов — CPU, память, диск
- Хранение секретов — API ключи в
.envс правами 600 - DM Pairing — используйте коды вместо хардкода ID
- Аудит
command_allowlist— периодически проверяйте - Задайте
terminal.cwd— не позволяйте агенту работать из чувствительных директорий - Запуск от не-root — никогда не запускайте gateway от root
- Мониторинг логов — проверяйте
%LOCALAPPDATA%\hermes\logs\ - Обновления — выполняйте
hermes updateрегулярно
Безопасность API ключей:
21. Сетевая изоляция
Для максимальной безопасности запускайте gateway на отдельной машине:
22. Проверка цепочки поставок
Hermes проверяет Python пакеты на наличие известных скомпрометированных версий.
23. Windows и безопасность
| Функция | Статус на Windows |
|---|---|
| Dangerous command approval | Работает |
| YOLO режим | Работает |
| Hardline blocklist | Работает |
| Docker изоляция | Работает (Docker Desktop) |
| Tirith сканирование | Пропускается (нет бинарника) |
| SSRF защита | Работает |
| Context file injection | Работает |