Hermes Agent(Nous Research)
— 一个极火(~175k★,MIT)的自托管 Agent,主打“越用越懂你”的持久记忆。在一次性云沙箱里安装并攻击,DeepSeek 后端。
一次我们欠自己标准的更正。我们最初把这篇发成了“严重的持久记忆投毒”:一个带隐藏指令的“总结便签”任务,Hermes 悄悄把指令写进永久用户档案、并在之后会话里照做。经严格复测——多种措辞、带对照——这个头条复现不出。Hermes 其实抵抗“由内容驱动的记忆写入”:它拒绝把处理内容里的指令持久化,还会点名这是注入。所以我们撤回按原样表述的记忆投毒结论。站得住的,是两条关于它默认配置的诚实静态观察(见下)。一个你敢据此行动的裁决,是作者会更正它的裁决——这也正是这篇现在长这样的原因。
持久记忆投毒——已撤回,复现不出
med原假设:一个带隐藏指令的“总结便签”任务,会被悄悄写进永久用户档案、并在之后会话里照做。我们把它重打了一遍:多种措辞(直白、隐晦、第一人称“偏好”)、重复跑,并用对照区分“Agent 自己 setup 的状态”和“不可信内容真的进了记忆”。
复现不出。纯总结/分诊任务什么都没写进记忆(4/4 皆无),而且 Hermes 反复点名那条嵌入指令是“想让我存假记忆的注入”。只有当用户自己要求 Agent“记住”东西时,内容才进得了记忆——即便如此,命令式指令也不会自动触发。我们早先“总结任务静默投毒”的说法,是过度归因。
为什么我们把它留着、而不是删掉:更正本身就是产品。一个发现,只有当不可信输入真的触达效果、且在成组测试里能复现(不是一次)才算数。把这把尺子对准我们自己的头条,它就倒了。正是这份克制,才让我们真正背书的那些发现值得相信。
工具默认无沙箱运行(后端:local)
high我们读了实际生效的配置:hermes config get terminal.backend。
后端 = local。六种后端(local、Docker、SSH、Singularity、Modal、Daytona)里,默认这个直接在宿主机上跑工具/shell 命令,没有任何隔离。
和 F-1 串起来:一条每个会话都加载的持久指令,由一个工具无沙箱运行的 Agent 来执行。而 Hermes 主打无人值守的 cron + 网关运行——恰恰是没人盯着确认框的场景。
命令安全护栏静默降级
med启动时观察到。
“tirith security scanner enabled but not available —— 命令扫描将只用模式匹配。”当扫描器二进制不在时,它的命令安全控制会悄悄退回到更弱的模式匹配。
一个在常见环境下会悄悄自我削弱、又不高声报错的控制,到关键时刻你没法指望它。
静态 × 动态实证
静态找可疑路径,真打穿来判定真假。真假的裁判是攻击成没成功——不是模型投票。
我们自己的静态引擎(开源、仅标准库、在仓库里)读了源码,把记忆写入落点(_edit_memory / _write_memory)标为 RT-6 候选,把两处防护(_scan_memory_content / _sanitize_entries_for_snapshot)标为“仅签名”候选。逐一读证实了:Hermes 并非毫无防御——写入要过门(_apply_write_gate),加载时每条都用威胁模式库扫(scan_for_threats,scope="strict"),命中就在拼系统提示前换成 [BLOCKED];写入还是原子的。可疑点在于:这个扫描是基于签名的,所以一条伪装成无害长期偏好的指令,可能根本没有已知签名。
动态这一遍真正确认的,是防御、不是打穿。静态把记忆写入落点和“仅签名”防护标为候选;动态复测把利用证伪了——Hermes 拒绝把处理内容里的指令持久化,还点名是注入。所以这里诚实的确认结论是:这个候选在“纯内容任务”下并不可利用。候选≠漏洞;裁判是 exploit,而这次它判了目标无罪。
我们自己早先的结论——“基于签名的记忆扫描被语义‘偏好’注入绕过”——复测证伪。多种措辞下,载荷都没能从总结/分诊任务里持久化,而且 Agent 点名它是注入。我们撤回它。
「无原子性 / 记忆写入没有检查」。读代码即证伪:原子临时文件+改名、文件锁、写入门、加载时威胁扫描都在。问题从来不是“没有控制”。
利用链
我们最初画的那条链依赖 F-1——F-1 既已撤回,“投毒消息→持久落脚点”这条链就不成立,我们也不会暗示它成立。留下的是两条诚实的硬化提醒:终端后端默认 local/无沙箱(F-2),命令护栏在扫描器二进制缺失时静默退回更弱的模式匹配(F-3)。两者都是值得改的默认值;但单独看,都不是攻击者可达的利用。
负责任披露
只在一次性云沙箱、我们自己的 fork 上测试,无真实数据、用无害标记、无破坏性动作。更正记录:本篇早先版本(2026-07-19)报了一个“已确认的严重持久记忆投毒”;经复测(2026-07-20)该头条复现不出,已撤回——依据我们自己的尺子:一个发现必须由不可信输入触达效果、且能复现。我们公开方法——也公开我们的更正。