Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Hermes Agent 安全政策

本文档阐述了 Hermes Agent 的信任模型,明确了该项目视为结构性安全限制的唯一标准,并规定了漏洞报告的适用范围。

1. 漏洞报告方式

请通过 GitHub 安全建议通道 或 security@nousresearch.com 进行私下报告。严禁为安全漏洞创建公开 issue。Hermes Agent 不设漏洞奖励计划。

一份有效的报告应包含以下内容:

  • 简洁的描述及严重性评估;
  • 受影响组件,需通过文件路径和行号范围标识(例如 path/to/file.py:120-145);
  • 环境详细信息(如 hermes --version、提交版本的 SHA 值、操作系统及 Python 版本);
  • 在 main 分支或最新版本上的复现方法;
  • 说明违反了第 2 节中的哪项信任限制。

在提交报告之前,请先阅读第 2 节和第 3 节。对于那些涉及本政策未明确定义为限制条件的规则检测结果的报告,将根据第 3 节被判定为超出报告范围而予以关闭——但请参阅第 3.2 节:此类报告仍可作为普通 issue 或 pull request 提交,只是不能通过私有的安全报告渠道发送。


2. 信任模型

Hermes Agent是一款单租户式的个人智能体。它的处理逻辑采用分层架构,且各层的重要性并不相同。报告生成器与操作员都必须以相同的规则来理解这些层级结构。

2.1 定义

  • 智能体进程:用于运行Hermes Agent的Python解释器,包括其加载的任何Python模块(如智能体技能、插件以及钩子处理程序)。
  • 终端后端:与terminal()工具相连的运行目标。默认情况下,该后端会在主机上直接执行命令;而其他类型的后端则会在容器、云环境中的沙箱或远程主机上执行命令。
  • 输入通道:内容进入智能体上下文的任何途径,包括操作员的输入、网页抓取内容、电子邮件、网关发送的消息、文件读取结果、MCP服务器的响应以及工具的执行结果等。
  • 信任环境:操作员在运行Hermes Agent时默认允许其访问的一组资源——通常指的是操作员自身用户账户在主机上可访问的所有内容。
  • 处理规范:Hermes Agent的文档或代码中明确规定的规则,用于说明某个消费层(如适配器、用户界面、文件写入模块、shell等)应如何处理智能体的输出结果——例如:“控制面板会将智能体的输出以静态HTML格式呈现。”

2.2 局限性:操作系统层面的隔离机制

针对恶意大语言模型的唯一安全防护屏障就是操作系统。 在代理进程内部,没有任何机制能够起到隔离作用——无论是审批机制、输出编辑功能、模式扫描工具,还是允许使用的工具列表,均无法实现有效隔离。凡是试图过滤大语言模型输出内容的进程组件,实际上都只是在受攻击者影响的字符串上运行的启发式规则,而该策略也会将其视为此类组件处理。

Hermes Agent 支持两种基于操作系统的隔离方案。这两种方案针对不同的威胁类型,操作人员需根据实际情况慎重选择。

终端后端隔离

在这种模式下,非默认的终端后端会在容器、远程主机或云端的沙箱环境中执行大语言模型发出的 shell 命令。文件操作工具(如 read_file、write_file、patch)同样通过该后端执行,因为这些工具都是基于 shell 接口实现的——它们无法访问后端未暴露的路径。

可被隔离的内容:代理通过 shell 或文件操作所执行的全部功能。
无法被隔离的内容:代理在其自身 Python 进程中进行的所有操作。这包括作为主机子进程启动的代码执行工具、从代理环境启动的 MCP 子进程、插件加载、钩子触发以及技能加载(所有这些都在代理的解释器中完成)。

当担心大型语言模型会发出具有破坏性的 shell 命令或执行不必要的文件操作,且操作者值得信赖时,将终端后端隔离起来是正确的做法。

完整进程封装

完整进程封装会将代理的所有进程树都在沙箱环境中运行。无论是 shell、代码执行、MCP、文件工具、插件、钩子还是技能加载,所有这些路径都需遵循相同的文件系统、网络、进程以及(如适用)推理策略限制。

Hermes Agent 提供了两种实现方式:

  • Hermes Agent 自带的 Docker 镜像及 Compose 配置。这种方式更为轻量,代理会在标准容器中运行,其挂载点和网络策略由操作者自行配置。
  • NVIDIA OpenShell。OpenShell 通过文件系统、网络(L7 层输出)、进程/系统调用以及推理路由等层面,提供基于声明式的会话级沙箱功能。网络和推理策略支持热更新,同时凭据会从提供商存储库中注入,而不会接触到沙箱的文件系统。 在完整的进程封装之下,Hermes Agent 的进程级启发式机制(§2.4)会在实际边界之上形成多层防护,从而避免意外情况发生。这种安全策略适用于代理需要处理操作员无法控制的输入内容——如开放网页、收到的邮件、多用户频道以及不可靠的 MCP 服务器——以及用于生产环境或共享场景的场景。

那些使用默认的后端并在不可靠的输入源环境下运行,或者期望终端后端沙箱中仅包含不经过 shell 处理的代码路径的操作员,实际上是在违背所支持的安全策略进行操作。

2.3 凭据的隔离范围

Hermes Agent 会对传递给其低信任级进程组件的环境进行过滤,这些组件包括 shell 子进程、MCP 子进程以及代码执行子进程。默认情况下,诸如供应商 API 密钥和网关令牌等凭据会被移除,仅会传递由操作员或已加载的技能明确声明的变量。

这一措施旨在减少凭据的意外泄露,但并非真正的隔离机制。在代理进程内运行的任何组件(包括技能、插件以及钩子处理器)均能够访问代理自身可读取的内容,其中包括内存中的凭据。针对已被攻破的进程组件的防护措施,应是在安装前由操作员进行严格审查(§2.4、§2.5),而非试图净化环境。

2.4 运行时的启发式机制

以下组件用于过滤或警示大语言模型的行为。它们具有辅助作用,而非强制限制。

  • 审批门控能够识别常见的破坏性shell模式,并在执行前要求操作员确认。由于shell具备图灵完备性,仅依靠否定列表来限制shell命令在结构上是不够的。该机制用于检测合作模式下的错误,而非对抗性输出。
  • 输出过滤会移除可视化结果中类似敏感信息的模式。负责生成输出的模块会主动避免出现此类内容。
  • 技能防护机制会扫描已安装技能的内容,查找注入攻击的模式。它仅作为审查辅助工具;对于第三方技能,真正的限制在于操作员在安装前的审核工作。审核技能意味着需要阅读其Python代码和脚本,而不仅仅是SKILL.md描述文件——因为这些技能在导入时会执行任意的Python代码。

2.5 插件信任模型

插件会在代理进程中被加载,并以代理的所有权限运行:它们能够读取与树结构中其他组件相同的凭据、调用相同的工具、注册相同的钩子以及导入相同的模块。对于第三方插件而言,唯一的限制是在安装前必须经过操作员的审核——这一规则与技能的审核规则相同(见§2.4节)。之所以单独提及插件,是因为从架构层面来看,插件通常更为复杂,往往还包含自身的后台服务、网络监听器以及各种依赖项。

恶意插件或存在缺陷的插件本身并不构成Hermes Agent的漏洞。而那些在Hermes Agent插件的安装或发现过程中出现的错误,导致操作员无法看清正在安装的内容,这类问题则属于§3.1节所涵盖的范围。

2.6 外部接口

外部接口指的是本地代理进程之外的任何通道,通过这些通道,调用方可以向代理分发任务、处理审批请求或获取代理的响应。每个外部接口都有其独立的授权模型,但以下规则对所有外部接口均适用。

Hermes Agent中的外部接口:

  • 网关平台适配器。 大多数消息传递集成均以插件形式存在,存放于 plugins/platforms/<name>/ 目录中(如 Telegram、Discord、Slack、电子邮件、短信等)。一些通用的基础类型以及少量传统的/直接的适配器则位于 gateway/platforms/ 目录下(如 base.py、Signal、服务器 API、Webhook 等),这些适配器通过 gateway/platform_registry.py 实现延迟发现与加载功能。
  • 网络暴露的 HTTP 接口。 服务器 API 适配器、控制面板插件、看板插件对应的 HTTP 端点,以及任何其他连接监听套接字的插件。
  • 编辑器/IDE 适配器。 ACP 适配器(位于 acp_adapter/)以及类似的可接收本地客户端进程请求的集成方案。
  • TUI 网关(tui_gateway/)。 为 Ink 终端界面提供的 JSON-RPC 后端,可通过本地 IPC 方式进行访问。

统一规则:

  1. 凡是跨越信任边界的数据通道均需进行授权。 对于网络中的消息传递和HTTP通道,其边界为整个网络:授权意味着由系统管理员配置允许的调用方列表。而对于本地编辑器及IPC通道(如ACP、TUI网关),其边界为主机用户账户:此时授权依赖于操作系统的访问控制机制(如文件权限、仅允许环回连接),除非有明确的网络认证层,否则不会向本地用户之外的实体开放该通道。

  2. 每台已启用的网络适配器都必须拥有允许列表。 在生成允许列表之前,这些适配器应拒绝处理代理任务、解析授权信息或传输输出数据。若未配置允许列表,相关代码路径将直接报错,此类错误属于第3.1条规定的错误范畴。

  3. 会话标识符仅用于路由管理,而非授权限制。 了解其他调用方的会话ID并不能赋予访问其授权信息或输出数据的权限;授权始终需要通过允许列表(或操作系统层面的等效机制)进行再次验证。

  4. 在允许的列表范围内,所有调用者的信任度都是相同的。
    Hermes Agent不会在单个适配器中为不同的调用者设置不同的权限等级。
    需要对不同调用者实施差异化权限控制的操作员,应分别启动多个Agent实例,并为它们配置独立的允许列表。

  5. 将仅限本地的接口绑定到非回环接口上属于紧急情况下的操作员决策(§3.2)。
    控制面板及插件相关的其他HTTP服务器默认均为回环模式;若通过--host 0.0.0.0或类似参数将其暴露在外,那么加强公共访问安全(§4)的责任便由操作员承担。

  • 从声明的操作系统级隔离状态中逃逸(§2.2):攻击者控制的代码路径进入了该安全策略所规定的受限状态。
  • 未经授权访问外部界面:来自已配置授权列表之外的调用方(即允许访问的列表,或操作系统层面针对本地IPC接口的相应授权列表)执行任务、接收输出数据或处理审批请求(§2.6)。
  • 凭据泄露:通过本应防止此类行为的机制(如环境清理错误、适配器日志记录问题、将凭据传输至上游节点的传输错误等),将操作员的凭据或会话授权信息泄露到可信环境之外的目标地点。
  • 违反信任模型文档规定:代码行为与此项策略、Hermes Agent的官方文档内容,或是操作员的合理预期相悖——包括那些Hermes Agent已明确规定其输出数据应如何被消费层(如控制面板、网关适配器、文件写入工具、命令行shell等)处理的场景,而某些代码路径却违背了这些规定。

3.2 不在覆盖范围内

此处所说的“超出处理范围”意指“根据本政策,这不属于安全漏洞”。它并不意味着“无需进行报告”。对于规则引擎的优化建议、增强功能的创意以及用户体验方面的改进,均可通过常规的 issue 或 pull request 形式提交——审核系统总能发现更多规律,文案表述也能愈发精准,适配器的行为表现也始终有提升空间。这类内容不会通过私人披露渠道处理,也不会收到相关通知。

  • 规则引擎规避行为(§2.4)——包括绕过审核系统的正则表达式限制、文案处理规则规避、Skills Guard 规则模式规避,以及针对未来规则的类似举报。这些并非硬性限制,突破它们并不构成本政策定义下的安全漏洞。

  • 提示词注入行为本身。通过注入内容、幻觉现象、训练数据干扰或其他任何方式,迫使大语言模型产生异常输出,其本身并不属于安全漏洞。若仅声称“成功实现了提示词注入”,但未引发 §3.1 所规定的连锁反应,则根据本政策不属于可处理的举报内容。

  • 选择隔离模式所带来的后果。那些表明在特定策略允许的范围内运行的代码路径能够执行该策略所准许的操作的报告,并不属于漏洞。例如:在本地后端环境下能够获取主机状态的shell工具或文件;在仅对shell进行沙箱隔离的终端后端隔离模式下仍能获取主机状态的代码执行子进程或MCP;那些其前置条件要求预先拥有对配置文件或操作员凭证的写入权限的报告(因为这些内容本就处于可信环境中)。

  • 已记录的应急配置。操作员手动选择的、用于明确禁用安全保护的配置选项,如--insecure以及控制面板或其他组件中的同类标志位、被禁用的审批流程、生产环境下的本地后端使用、绕过Hermes-Home安全机制的开发配置等。针对此类配置产生的报告并不属于漏洞——这正是这些标志位存在的意义所在。

  • 社区贡献的能力与插件。 第三方能力(包括社区能力仓库)及第三方插件处于操作员审核范围之内,而非 Hermes Agent 的信任范围之内(§2.4、§2.5)。任何执行恶意操作的插件或能力,都是未经审核的组件所导致的预期故障表现,而非 Hermes Agent 的漏洞。若在 Hermes Agent 能力或插件的安装过程中出现错误,导致操作员无法查看实际安装的内容,则属于 §3.1 的覆盖范围。

  • 无外部管控的公开暴露。 在未设置身份验证、VPN 或防火墙的情况下,将网关或 API 暴露于公共互联网。

  • 在允许使用 shell 的环境下存在工具级的读写限制。 若某个路径可通过终端工具访问,那么其他文件处理工具也能访问该路径这一事实并无额外意义。


4. 加强部署安全

最重要的加强措施便是将隔离机制(§2.2)与代理程序所处理内容的信任等级相匹配。除此之外:

  • 请以非 root 用户身份运行 Agent。所提供的容器镜像默认已实现这一要求。
  • 请将凭证存储在具有严格权限的操作员凭证文件中,切勿将其保存在主配置文件或版本控制系统中。在 OpenShell 环境下,应使用提供商存储机制而非磁盘上的凭证文件。
  • 未经 VPN、Tailscale 或防火墙保护,切勿将网关或 API 暴露于公共互联网。在 OpenShell 环境下,可通过网络策略层来限制数据外发。
  • 对于每个已启用的网络适配器,请配置允许的调用者列表(参见 §2.6)。
  • 在安装第三方技能及插件之前,请先进行审查(参见 §2.4、§2.5)。对于技能而言,这意味着需要查看其 Python 代码及脚本,而不仅仅是 SKILL.md 文件。Skills Guard 的报告以及安装审计日志可作为审查依据。
  • Hermes Agent 为 MCP 服务器的发布以及 CI 流水线中的依赖项/包变更提供了供应链防护机制;详情请参阅 CONTRIBUTING.es.md 文件。

5. 暴露问题反馈

  • 协调反馈期限:自问题报告发出之日起 90 天内,或直至修复版本发布为止,以先到者为准。
  • 反馈渠道:可通过 GHSA 讨论帖进行反馈,或发送邮件至 security@nousresearch.com。
  • 致谢机制:除非报告者要求匿名,否则其姓名将在版本说明中予以致谢。