Agent长期记忆也会被投毒

一项小规模复现实验显示,测试通过并不代表 Agent 学到的 Skill 安全;要求后续独立会话重复证明同一修改,可将恶意内容暴露率从最高 100% 降至 0%。
测试全绿,恶意修改仍可能被 Agent 永久记住
Agent 的长期记忆正在暴露一个比普通提示注入更棘手的问题:恶意内容不仅能影响当前任务,还可能被系统总结成可复用 Skill,在之后的会话中反复出现。
10 月,一项面向编码 Agent 的小规模案例研究给出了直接证据。研究者先让 Agent 从测试通过的编程会话中学习技能,再故意向其中一次学习会话混入恶意修改;随后,他们安排三个干净会话处理同一任务,并比较无记忆、编辑回放、朴素记忆和“复现后再复用”四种方案。结果显示,直接回放历史编辑会在 30 个仓库中全部恢复恶意内容,而且所有常规测试仍然通过;朴素记忆在 30 次评分会话中有 3 次把污染内容暴露给 Agent;复现验证方案则是 0 次。
这项研究最值得关注的地方,不是又发现了一种提示注入变体,而是它击中了 Agent 产品正在快速建设的基础设施:程序性记忆。程序性记忆是 Agent 对“以后遇到类似任务应该怎样做”的持久化操作经验,例如要修改哪些文件、遵循什么步骤、采用什么代码模式。它保存的不是一句聊天记录,而是一套可能被重复执行的做法。

“任务成功”不等于“过程可信”
记忆投毒是攻击者通过文档、工具输出、代码仓库或对话内容,把恶意行为写入 Agent 持久化记忆,并让其在未来会话中再次生效的攻击方式。它与一次性提示注入的核心区别,是攻击效果跨越了最初的上下文窗口:污染来源可以消失,但被总结出的经验仍然留在系统里。
编码 Agent 尤其容易把“测试通过”误当成可信证明。现实中的单元测试通常只覆盖目标功能,不会检查整个仓库是否多出一个文件、无关配置是否被改写,或者真实修复旁边是否夹带了一行危险逻辑。攻击者不需要让任务失败,只需要把恶意改动藏在测试没有观察的区域。
研究设置中的污染方式覆盖了三类常见风险:新增一个恶意文件、在无关位置插入一行修改,以及把恶意代码与真实修复融合在同一处。第三种最难处理,因为它无法通过简单的文件白名单或“删除与任务无关的文件”解决;恶意部分和正确答案可能位于同一个补丁块,甚至同一行附近。
这意味着 Agent 安全不能继续把测试结果当成唯一的记忆写入许可证。测试回答的是“被断言的行为是否符合预期”,而记忆审核需要回答“哪些修改真正构成了解法,以及这些修改能否在不同会话中稳定重现”。两个问题相关,但并不等价。
四种记忆策略,结果差距明显
“复现后再复用”是一种基于后续独立会话提供证据的记忆准入机制:某项技能只有在至少两个之后的会话中重复产生相同修改并通过测试,才会被提供给未来 Agent;最终展示给 Agent 的内容,也只保留这些会话共同写出的部分。
研究使用 Claude Haiku 5.5 和 Claude Sonnet 5.5 进行评分,每个实验分支安排 5 个评分会话,并通过一个包含 187 项行为检查的隐藏验证器判断结果。按照原帖披露的汇总数据,三种污染形态、两个模型和每组 5 次运行组成了每个主要结果中的 30 次观测。
| 方案 | 记忆如何产生 | 污染内容结果 | 主要问题或代价 | |---|---|---:|---| | 无记忆 | 每次任务从头处理 | 原帖未给出同口径污染暴露数字 | 安全基线较清晰,但无法获得跨会话经验收益 | | 编辑回放 | 直接重放历史记录中的修改 | 30/30 个仓库重新出现污染,常规测试仍全部通过 | 把历史操作当成事实,忠实复现也忠实复现攻击 | | 朴素记忆 | 保存所有测试通过的会话,再由 Mem0 搜索选择 Skill | 3/30 次评分会话暴露污染,暴露率 10% | 检索系统只能选择已有内容,不能证明内容该不该被写入 | | 复现后再复用 | 至少两个后续会话重复修改且测试通过,只展示共同修改行 | 0/30 次评分会话暴露污染,暴露率 0% | 写入更慢,对低频或只有一种解法路径的任务可能更保守 |
“30/30 且测试全过”是这组数据里最危险的结果。它说明回放机制并没有发生传统意义上的执行故障,反而过于准确地完成了设计目标:把过去成功会话中的编辑重新应用。真正错误的是系统对“成功历史”的定义,而不是回放本身。
“3/30”也不能被理解为朴素记忆已经足够安全。10% 的会话暴露率放到持续运行的企业 Agent 中并不低;如果某项记忆每天有 20 次被相关任务召回,单次暴露概率即便只有 10%,长期至少触发一次的概率也会迅速累积。更重要的是,“暴露给模型”与“最终执行成功”不是同一个指标,后续是否被工具权限、代码审查或运行环境拦截,还需要分层评估。
“0/30”同样不等于数学意义上的零风险。30 次观测只能说明该机制在本实验覆盖的三类污染和两种模型组合中没有暴露恶意内容,不能证明它能抵御所有变体。攻击者仍可能尝试在多个后续会话中重复同一污染,或者操纵任务与测试,让恶意修改也获得所谓的独立复现证据。
防线为什么有效:保留交集,而不是相信总结
复现验证有效的原因,是正确修复通常由任务约束反复决定,而偶发污染通常只出现在单个会话中。三个 Agent 分别解决同一个缺陷时,变量命名和实现细节可能不同,但真正必要的条件判断、接口修正或配置变更更可能重复出现;攻击者临时插入的无关文件和旁路逻辑则较难自然重现。
“只展示共同写出的行”比给 Skill 加一个可信分数更关键。传统记忆系统常把整段会话总结为文本,再通过向量相似度检索;一旦总结中混入恶意步骤,检索做得越准,污染传播反而越稳定。复现方案把记忆单位收缩到可对照、可验证的修改证据,减少了模型再次看到原始污染的机会。
Mem0 搜索在这项实验中承担的是检索角色,而不是安全裁决角色。向量检索擅长回答“哪条记忆与当前任务最相关”,却无法单独回答“这条记忆是否由可信过程产生”。相关性、正确性与安全性是三个不同维度,把它们压缩成一个相似度分数,本身就是很多 Agent 记忆架构的薄弱点。
隐藏验证器的 187 项行为检查则提醒开发者,评测必须超出仓库自带测试。一个更接近生产环境的验证器至少应检查目标行为、非目标文件变化、依赖和配置漂移、外部网络访问、敏感信息处理、权限变化以及生成物差异。只有这样,系统才有机会发现“功能修好了,但顺手留下了后门”的情况。
这不是免费的安全升级
复现验证的直接成本是延迟写入。一次成功会话不再足以让 Skill 进入可复用记忆,系统必须等待至少两个后续会话产生相同证据;对于高频重复任务,这个等待周期可能很短,但对于罕见故障或一次性迁移,Skill 可能长期无法转正。
复现验证还可能过滤掉正确但不稳定的经验。复杂编程任务往往存在多种等价实现,不同 Agent 可能修改不同文件、使用不同抽象,逐行求交集最终只留下很少内容。生产系统因此不能机械地把“相同行”当成唯一证据,还应在抽象语法树、行为约束、依赖变化和测试覆盖层面比较多个解法。
攻击者也可能针对验证规则调整策略。如果对方能够污染同一数据源触发的多个学习会话,两次复现就不再具备真正的独立性。所谓“后续两个会话”必须在输入来源、执行环境和上下文上具有足够隔离,否则只是把同一次污染复制了两遍。
因此,这项机制更适合被理解为记忆准入门槛,而不是完整的安全系统。它降低了单次污染直接进入程序性记忆的概率,但仍需要来源追踪、最小权限、隔离执行、独立验证器和可撤销机制共同工作。
企业 Agent 应把记忆写入视为特权操作
长期记忆写入必须被当成一种特权操作,因为它改变的不是当前回答,而是系统未来的默认行为。处理用户请求的执行 Agent 不应同时拥有不受约束的永久记忆写权限;更合理的架构,是由独立的记忆服务接收候选内容、保存来源证据、运行验证,再决定是否发布。
一条可审计的记忆至少需要记录以下信息:
- 来源会话、用户、仓库、文档和工具输出;
- 提取该 Skill 时使用的模型、提示模板与版本;
- 支持它的测试、隐藏检查和复现会话;
- 实际写入的文件、代码范围与权限变化;
- 哪些后续任务检索或执行过这条记忆;
- 隔离、撤销和重新验证的状态。
记忆系统还需要明确区分“候选”“已验证”“已发布”和“已撤销”四种状态。候选记忆可以用于离线评估,但不应直接进入生产上下文;已验证记忆应带着证据和适用范围发布;一旦发现污染,撤销操作必须能追踪所有调用记录,并检查由它生成的下游记忆是否需要连带失效。
多 Agent 系统尤其需要防止污染沿协作链传播。Agent A 的输出对 Agent B 来说仍然是外部输入,不能因为来源是另一个模型就自动升级为可信事实;否则,一条污染记忆可能先改变 A 的输出,再被 B 总结成新的经验,最终形成难以定位的跨 Agent 传播链。
结论:Agent 需要证明“为什么值得记住”
这项案例研究给出的判断很明确:一次测试通过只能证明当前任务在有限检查下成功,不能证明整个操作过程适合成为长期经验。直接回放把污染恢复到 30/30 个仓库,已经足以否定“成功会话天然可信”这一假设。
复现后再复用的价值,在于它把记忆从模型生成的摘要变成了需要证据支持的发布物。至少两个后续会话独立重现、测试通过、只保留共同修改,使单次恶意 Skill 更难进入未来上下文;在本次 30 次评分中,污染暴露从回放方案的 100% 和朴素记忆的 10% 降到了 0%。
但真正成熟的方案不能停留在“两次复现”这个数字上。开发者还需要证明复现来源彼此独立,验证器覆盖了测试之外的副作用,并保证每条记忆可追踪、可隔离、可撤销。Agent 的记忆越长,系统就越不能只问“它记住了什么”,而必须继续追问“谁让它记住、凭什么记住,以及出错后如何彻底忘掉”。
参考来源
- Reddit:Proof Before Reuse 实验说明:本次案例研究的主要信息来源,披露实验设置、四种对照方案、模型组合及污染暴露结果。
- 知乎:给 Agent 记忆设计一条可审计的安全写入路径:讨论长期记忆的来源追踪、写入审核与跨会话持久化风险。



