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 文档或代码中关于消费层(适配器、UI、文件写入器、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 字符串在结构上是不完整的。该门控用于检测协作模式下的错误,而非对抗性输出;
- 输出过滤:会从可视化结果中移除类似敏感信息的模式。有责任心的输出生成者会主动避免此类情况;
- Skills Guard:会扫描已安装的技能内容,查找注入模式。它仅作为审查辅助工具;对于第三方技能,其安全限制仍在于安装前的操作者审查。审查技能意味着要阅读其 Python 代码和脚本,而不仅仅是 SKILL.md 描述——因为这些技能在导入时就会执行任意 Python 代码。
2.5 插件的信任模型
插件会在智能体进程中被加载,并以智能体的全部权限运行:它们可以读取相同的凭证、调用相同的工具、注册相同的钩子,以及导入与树结构中其他组件相同的模块。对于第三方插件,其安全限制同样是在安装前由操作者进行审查——这一规则与技能相同(第 2.4 节),之所以单独提及,是因为插件在架构上更为复杂,通常还包含自己的后台服务、网络监听器及依赖项。
恶意插件或存在缺陷的插件本身并不构成 Hermes Agent 的漏洞。如果 Hermes Agent 在插件安装或检测过程中出现故障,导致操作者无法看到实际安装的内容,则属于第 3.1 节规定的报告范围。
2.6 外部输入通道
外部输入通道指的是智能体本地进程之外的任何途径,通过这些途径,调用者可以向智能体分发任务、处理审批或接收智能体的输出。每个通道都有其独立的授权模型,但以下规则均适用。
Hermes Agent 内部的输入通道包括:
- 网关平台适配器:位于
gateway/platforms/目录中的消息集成(如 Telegram、Discord、Slack、电子邮件、短信等),以及作为插件提供的类似适配器; - 网络中暴露的 HTTP 接口:API 服务器适配器、控制面板插件、看板插件对应的 HTTP 端点,以及任何其他绑定监听套接字的插件;
- 编辑器/IDE 适配器:ACP 适配器(
acp_adapter/)及类似集成,它们可接收本地客户端进程的请求; - TUI 网关(
tui_gateway/):用于 Ink 终端 UI 的 JSON-RPC 后端,通过本地 IPC 进行通信。
**统一适用规则:**1. 凡是跨越信任边界的所有接口均需进行授权。 对于网络中的消息传递接口和HTTP接口,其边界为整个网络:授权意味着由操作员配置的允许调用者列表。而对于本地编辑器接口及IPC接口(如ACP、TUI网关),其边界为主机用户账户:授权依赖于操作系统级别的访问控制(如文件权限、仅允许环回连接),若没有额外的网络认证层,此类接口不得向本地用户之外的实体开放。
-
每个已启用的网络适配器都必须拥有允许列表。 在建立允许列表之前,这些适配器必须拒绝处理代理任务、拒绝响应请求或拒绝传输输出。若未配置允许列表,相关代码路径将直接触发错误,此类错误属于第3.1条所规定的错误范畴。
-
会话标识符仅用于路由管理,而非授权限制。 了解其他调用者的会话ID并不能赋予其访问该调用者处理结果或输出数据的权限;授权始终需要通过允许列表(或操作系统层面的等效机制)进行重新验证。
-
在授权范围内,所有调用者享有相同的信任级别。 Hermes Agent不会针对单个适配器内的不同调用者设置不同的权限等级。若需要区分不同调用者的权限,操作员需为每个调用者运行独立的代理实例,并为它们配置各自的允许列表。
-
将仅限本地的接口绑定到非环回接口上属于操作员的紧急决策(见第3.2条)。 控制面板及插件相关的其他HTTP服务默认均为环回模式;若通过
--host 0.0.0.0或类似方式将其暴露到外部,那么加强其公共访问安全性(见第4条)的责任便由操作员承担。
3. 覆盖范围
3.1 属于覆盖范围的场景
- 突破操作系统级声明的隔离策略(见第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用户身份运行代理。默认情况下,提供的容器镜像已实现了这一要求。
- 将凭证存储在操作员的凭证文件中,并设置严格的权限限制,绝不能将其保存在主配置文件中或版本控制系统中。在OpenShell模式下,应使用供应商存储机制而非磁盘上的凭证文件。
- 未经VPN、Tailscale或防火墙保护,切勿将网关或API暴露到公共互联网上。在OpenShell模式下,可通过网络策略层来限制外部访问。
- 为每个已启用的网络适配器配置相应的允许调用者列表(见第2.6条)。
- 在安装第三方技能和插件之前,务必对其进行审查(见第2.4条、第2.5条)。对于技能类组件,审查工作不仅包括查看SKILL.md文件,还需阅读其对应的Python代码及脚本。Skills Guard的检测结果以及安装审计日志都是审查的依据。
- Hermes Agent为MCP服务器的发布以及CI流程中的依赖项/包变更提供了供应链安全防护机制;更多详细信息请参阅
CONTRIBUTING.es.md文档。
5. 漏洞披露
- 协调一致的披露时间窗口:自报告提交之日起90天内,或直到相关修复版本发布为止,以较早者为准。
- 披露渠道:可通过GHSA漏洞报告论坛,或发送邮件至security@nousresearch.com进行报告。
- 致谢机制:除非报告人要求匿名,否则其姓名将在版本说明中予以致谢。