Hermes Agent 采用纵深防御安全模型。本页涵盖所有安全边界——从命令审批到容器隔离,再到消息平台上的用户授权。1.
用户授权 — 谁可以与 Agent 通信(允许列表、DM 配对)
3.
容器隔离 — Docker/Singularity/Modal 沙箱及加固配置
4.
MCP 凭据过滤 — MCP 子进程的环境变量隔离
5.
上下文文件扫描 — 检测项目文件中的 prompt(提示词)注入
6.
跨会话隔离 — 会话之间无法访问彼此的数据或状态;cron 任务存储路径已针对路径遍历攻击进行加固
7.
输入清理 — 终端工具后端中的工作目录参数会经过允许列表验证,以防止 shell 注入
危险命令审批#
在执行任何命令之前,Hermes 会将其与一份精心维护的危险模式列表进行比对。若匹配,用户必须明确批准。审批模式#
审批系统支持三种模式,通过 ~/.hermes/config.yaml 中的 approvals.mode 配置:| 模式 | 行为 |
|---|
| manual(默认) | 始终提示用户审批危险命令 |
| smart | 使用辅助 LLM 评估风险。低风险命令(如 python -c "print('hello')" )自动批准,真正危险的命令自动拒绝,不确定的情况升级为手动提示。 |
| off | 禁用所有审批检查——等同于使用 --yolo 运行。所有命令无需提示即可执行。 |
设置 approvals.mode: off 将禁用所有安全提示。仅在受信任的环境(CI/CD、容器等)中使用。
YOLO 模式#
YOLO 模式会绕过当前会话中所有危险命令审批提示。可通过以下三种方式激活:1.
CLI 标志:使用 hermes --yolo 或 hermes chat --yolo 启动会话
3.
环境变量:设置 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 和 gateway 会话中均可使用。在内部,它会设置 HERMES_YOLO_MODE 环境变量,该变量在每次命令执行前都会被检查。当 YOLO 激活时,Hermes 会显示两个持久的视觉提醒,以确保用户不会忘记审批提示已被绕过:当 YOLO 已激活时,会话开始时显示一条红色横幅:⚠ YOLO mode — all approval prompts bypassed。YOLO 关闭时隐藏,以保持默认横幅整洁。
状态栏中所有宽度层级均显示 ⚠ YOLO 片段,随着 YOLO 的切换实时更新(富文本渲染器和纯文本回退均支持)。
YOLO 模式会禁用会话中所有危险命令安全检查——但硬性黑名单除外(见下文)。仅在完全信任所生成命令的情况下使用(例如,在一次性环境中经过充分测试的自动化脚本)。
对于破坏性会话斜杠命令(/clear、/new / /reset、/undo、/exit --delete),CLI 在执行前也会提示确认。参见斜杠命令——破坏性命令的确认提示。硬性黑名单(始终生效的底线)#
某些命令极具破坏性——不可逆的文件系统清除、fork 炸弹、直接写入块设备——无论以下任何情况,Hermes 都拒绝执行:黑名单是 --yolo 之下的底线。它在审批层看到命令之前就会触发,且没有任何覆盖标志。当前涵盖的模式(非详尽列表;与 tools/approval.py::UNRECOVERABLE_BLOCKLIST 保持同步):| 模式 | 为何列为硬性规则 |
|---|
rm -rf / 及明显变体 | 清除文件系统根目录 |
rm -rf --no-preserve-root / | 明确表示"我就是要删根目录"的变体 |
:(){ :|:& };: (bash fork 炸弹) | 使主机挂起直至重启 |
mkfs.* 作用于已挂载的根设备 | 格式化运行中的系统 |
dd if=/dev/zero of=/dev/sd* | 清零物理磁盘 |
将不受信任的 URL 通过管道传给 sh(作用于根文件系统顶层) | 远程代码执行攻击面过大,无法批准 |
若触发黑名单,工具调用会向 Agent 返回一条说明性错误,且不执行任何操作。如果某个合法工作流确实需要这些命令(例如,你是一个清除并重装流水线的操作者),请在 Agent 外部运行。审批超时#
当危险命令提示出现时,用户有一段可配置的时间来响应。若在超时内未响应,命令将默认被拒绝(故障关闭)。在 ~/.hermes/config.yaml 中配置超时:触发审批的条件#
以下模式会触发 审批提示(定义于 tools/approval.py):| 模式 | 描述 |
|---|
rm -r / rm --recursive | 递归删除 |
rm ... / | 在根路径下删除 |
chmod 777/666 / o+w / a+w | 全局/其他用户可写权限 |
chmod --recursive 配合不安全权限 | 递归全局/其他用户可写(长标志) |
chown -R root / chown --recursive root | 递归 chown 为 root |
mkfs | 格式化文件系统 |
dd if= | 磁盘复制 |
> /dev/sd | 写入块设备 |
DROP TABLE/DATABASE | SQL DROP |
DELETE FROM(不含 WHERE) | 不含 WHERE 的 SQL DELETE |
TRUNCATE TABLE | SQL TRUNCATE |
> /etc/ | 覆盖系统配置 |
systemctl stop/restart/disable/mask | 停止/重启/禁用系统服务 |
kill -9 -1 | 杀死所有进程 |
pkill -9 | 强制杀死进程 |
| Fork 炸弹模式 | Fork 炸弹 |
bash -c / sh -c / zsh -c / ksh -c | 通过 -c 标志执行 shell 命令(包括组合标志如 -lc) |
python -e / perl -e / ruby -e / node -c | 通过 -e/-c 标志执行脚本 |
curl ... | sh / wget ... | sh | 将远程内容通过管道传给 shell |
bash <(curl ...) / sh <(wget ...) | 通过进程替换执行远程脚本 |
tee 写入 /etc/、~/.ssh/、~/.hermes/.env | 通过 tee 覆盖敏感文件 |
> / >> 写入 /etc/、~/.ssh/、~/.hermes/.env | 通过重定向覆盖敏感文件 |
xargs rm | xargs 配合 rm |
find -exec rm / find -delete | find 配合破坏性操作 |
cp/mv/install 写入 /etc/ | 复制/移动文件到系统配置目录 |
sed -i / sed --in-place 作用于 /etc/ | 就地编辑系统配置 |
pkill/killall hermes/gateway | 防止自我终止 |
gateway run 配合 &/disown/nohup/setsid | 防止在服务管理器外启动 gateway |
容器绕过:在 docker、singularity、modal 或 daytona 后端运行时,危险命令检查会被跳过,因为容器本身就是安全边界。容器内的破坏性命令不会危害宿主机。
审批流程(CLI)#
在交互式 CLI 中,危险命令会显示内联审批提示: ⚠️ DANGEROUS COMMAND: recursive delete
rm -rf /tmp/old-project
[o]nce | [s]ession | [a]lways | [d]eny
Choice [o/s/a/D]:
session — 在本次会话剩余时间内允许此模式
always — 添加到永久允许列表(保存至 config.yaml)
审批流程(Gateway/消息平台)#
在消息平台上,Agent 会将危险命令详情发送到聊天中,并等待用户回复:回复 yes、y、approve、ok 或 go 以批准
回复 no、n、deny 或 cancel 以拒绝
运行 gateway 时,HERMES_EXEC_ASK=1 环境变量会自动设置。永久允许列表#
通过"always"批准的命令会保存到 ~/.hermes/config.yaml:这些模式在启动时加载,并在所有后续会话中静默批准。使用 hermes config edit 查看或删除永久允许列表中的模式。
用户授权(Gateway)#
运行消息 gateway 时,Hermes 通过分层授权系统控制谁可以与机器人交互。授权检查顺序#
_is_user_authorized() 方法按以下顺序检查:1.
每平台允许所有用户标志(如 DISCORD_ALLOW_ALL_USERS=true)
3.
平台专属允许列表(如 TELEGRAM_ALLOWED_USERS=12345,67890)
4.
全局允许列表(GATEWAY_ALLOWED_USERS=12345,67890)
5.
全局允许所有用户(GATEWAY_ALLOW_ALL_USERS=true)
平台允许列表#
在 ~/.hermes/.env 中以逗号分隔的值设置允许的用户 ID:若未配置任何允许列表且未设置 GATEWAY_ALLOW_ALL_USERS,则所有用户均被拒绝。Gateway 在启动时会记录警告:No user allowlists configured. All unauthorized users will be denied.
Set GATEWAY_ALLOW_ALL_USERS=true in ~/.hermes/.env to allow open access,
or configure platform allowlists (e.g., TELEGRAM_ALLOWED_USERS=your_id).
DM 配对系统#
为实现更灵活的授权,Hermes 提供了基于验证码的配对系统。无需预先提供用户 ID,未知用户会收到一次性配对码,由机器人所有者通过 CLI 批准。3.
机器人所有者在 CLI 上运行 hermes pairing approve <platform> <code>
在 ~/.hermes/config.yaml 中控制未授权私信的处理方式:pair 为默认值。未授权的 DM 会收到配对码回复。
平台部分会覆盖全局默认值,因此可以在 Telegram 上保持配对,同时让 WhatsApp 保持静默。
安全特性(基于 OWASP + NIST SP 800-63-4 指南):| 特性 | 详情 |
|---|
| 验证码格式 | 8 位字符,来自 32 位无歧义字母表(不含 0/O/1/I) |
| 随机性 | 密码学安全(secrets.choice()) |
| 验证码有效期 | 1 小时过期 |
| 速率限制 | 每用户每 10 分钟 1 次请求 |
| 待处理上限 | 每平台最多 3 个待处理验证码 |
| 锁定 | 5 次失败的批准尝试 → 1 小时锁定 |
| 文件安全 | 所有配对数据文件执行 chmod 0600 |
| 日志 | 验证码永不记录到 stdout |
存储: 配对数据存储于 ~/.hermes/pairing/,按平台分为独立的 JSON 文件:{platform}-pending.json — 待处理的配对请求
{platform}-approved.json — 已批准的用户
_rate_limits.json — 速率限制和锁定追踪
容器隔离#
使用 docker 终端后端时,Hermes 对每个容器应用严格的安全加固。Docker 安全标志#
每个容器均使用以下标志运行(定义于 tools/environments/docker.py):资源限制#
容器资源可在 ~/.hermes/config.yaml 中配置:文件系统持久化#
持久模式(container_persistent: true):从 ~/.hermes/sandboxes/docker/<task_id>/ 绑定挂载 /workspace 和 /root
临时模式(container_persistent: false):工作区使用 tmpfs——清理后所有内容丢失
对于生产 gateway 部署,使用 docker、modal 或 daytona 后端,将 Agent 命令与宿主机系统隔离。这样可以完全消除危险命令审批的需要。
若向 terminal.docker_forward_env 添加名称,这些变量会被有意注入容器供终端命令使用。这对于任务专属凭据(如 GITHUB_TOKEN)很有用,但也 意味着容器内运行的代码可以读取并泄露这些变量。
终端后端安全对比#
| 后端 | 隔离 | 危险命令检查 | 适用场景 |
|---|
| local | 无——在宿主机上运行 | ✅ 是 | 开发、受信任用户 |
| ssh | 远程机器 | ✅ 是 | 在独立服务器上运行 |
| docker | 容器 | ❌ 跳过(容器即边界) | 生产 gateway |
| singularity | 容器 | ❌ 跳过 | HPC 环境 |
| modal | 云沙箱 | ❌ 跳过 | 可扩展的云隔离 |
| daytona | 云沙箱 | ❌ 跳过 | 持久化云工作区 |
环境变量透传 {#environment-variable-passthrough}