公司动态

LLM Agent记忆注入攻击:原理、危害与防御

📅 2026/8/29 20:14:10
LLM Agent记忆注入攻击:原理、危害与防御
开发 LLM Agent 的时候很多团队会习惯性地把“记忆”当成提升体验的银弹。会话历史存下来让 Agent 记住用户偏好向量库召回让 Agent 拥有长期知识甚至有的 Agent 会学习用户的操作习惯来优化后续行为。记忆越多Agent 越像真人助理。但这里有一个很少被明确讨论的安全问题记忆系统保存的内容并不一定都是可信的。如果攻击者能让 Agent 把恶意指令当成“值得记住的信息”写进长期存储这些指令就可能在后续对话中被重新召回、再次解释、最终执行。InjecMEMMemory Injection Attack记忆注入攻击正是围绕这一风险展开的研究方向。它和传统的提示注入Prompt Injection最大的区别在于时间维度和持久性普通提示注入是即时生效、当前对话内生效记忆注入攻击则是把恶意指令写入记忆库跨会话、跨时间地影响 Agent 行为。这意味着攻击者可以在一次低危的交互中“埋雷”后续某次高权限任务触发时才真正造成损失。这篇文章我会从三个层面展开先讲清楚 LLM Agent 记忆系统是如何工作的、攻击者从哪个环节切入再从防御者视角分析典型攻击面与危害场景最后给出可以直接落地的检测、监控和加固方案。无论你是在做 RAG、Agent 开发还是已经上线的智能助手类产品都建议把记忆注入攻击纳入威胁模型考虑。1. 为什么 Agent 记忆系统成为攻击者的“新目标”LLM 应用走过了三个阶段最早是单轮问答输入提示词输出回答然后是 RAG把外部知识库内容拼进上下文再然后是 Agent加入工具调用、多轮规划、记忆能力。安全视角的演进也很有意思。单轮问答时代大家关注的是提示词本身有没有泄露系统设定RAG 时代开始注意外部文档会不会夹带注入指令到了 Agent 时代长期记忆的出现让攻击面从“当前上下文”扩展到了“持久化存储”。从攻击者的角度记忆系统是一个很有吸引力的目标。首先记忆是自动写入的。大多数 Agent 框架在对话结束、工具返回、文档解析时会按照既定策略把内容摘要或原文写入记忆库整个过程往往没有人的确认。其次记忆是持久化的。一次写入的内容会在后续多次对话中反复出现影响范围远超单次输入。第三记忆内容在召回时缺乏清晰的边界标记。模型看到一段“历史记忆”很难天然区分它是“用户曾经的陈述”还是“攻击者植入的指令”。用一个不太严谨但容易理解的类比普通提示注入像会话中的一次口令欺骗影响范围是当时那段对话记忆注入攻击更像 DNS 投毒你下一次访问同一个域名时拿到的还是被污染的结果。正因为这条“持久性”链条的存在InjecMEM 这类攻击在威胁建模时应该被当作高危场景来对待。2. LLM Agent 记忆系统工作原理解析要理解记忆注入攻击先要理解 Agent 记忆系统的工程实现。很多人以为 Agent 的记忆就是把聊天记录存下来再拼回提示词其实真正的记忆系统要更复杂。2.1 记忆在 Agent 架构中的位置一个典型的 Agent 架构包含四个核心模块感知模块、推理模块、行动模块和记忆模块。感知模块接收用户输入、外部文档、工具返回结果等外部信息推理模块基于当前任务和目标进行规划决定下一步动作行动模块负责调用工具或执行代码记忆模块则承担信息的保存、更新和读取。从工程实现来看记忆模块不是一个单独的进程而是由多个部分拼起来的。最底层是上下文窗口这是模型当前看到的全部内容属于瞬时记忆对话结束就消失往上一层是短期缓存可能用 Redis 或内存存储跨步骤的信息比如任务执行状态再往上是长期存储常见实现是向量数据库、关系型数据库、KV 存储或者文件系统。真正会被攻击者长期利用的是长期存储这部分。2.2 记忆的分类与安全关注点在安全建模时建议把 Agent 记忆分成四个维度记忆类型核心作用常见实现安全关注点上下文记忆当前对话的实时理解上下文窗口、滑动窗口缓存影响范围短注入风险相对可控情景记忆记录用户历史交互、具体事件会话记录、日志、向量库外部内容可能被写入需要重点检查语义记忆用户偏好、领域知识、事实信息向量库、知识图谱持久化存在是记忆注入攻击的主要目标过程性记忆工作流、任务步骤、操作习惯状态机、规则、偏好配置一旦被篡改会直接改变 Agent 的运行逻辑从攻击者的视角来看长期存储类型越丰富、召回机制越自动可利用的价值越大。特别是语义记忆和过程性记忆一旦被污染几乎等于直接篡改了 Agent 对用户的“画像”和对业务的“习惯”。2.3 记忆写入与召回的关键路径记忆写入的触发点常见有四类用户对话中显式要求 Agent 记住某事对话结束后系统自动做摘要并写入工具调用返回结果后系统把结果提炼成记忆外部数据源文档、网页、邮件解析后写入。记忆召回的方式也有多种向量相似度召回、关键词召回、规则触发。不管是哪种召回召回结果最终都会拼接到模型上下文中与系统指令、用户当前输入一起参与生成。这里的关键问题是不同来源的内容进入上下文之后模型通常不会自动区分“这是参考资料”还是“这是需要执行的指令”。这个“指令与数据未能分离”的缺陷正是记忆注入攻击能被利用的基础。3. InjecMEM 记忆注入攻击的核心原理与生命周期3.1 什么才算记忆注入攻击记忆注入攻击是一类把恶意指令写入 Agent 长期记忆使它在后续会话中被检索并执行的技术手法。与传统提示注入的最大差异是它的影响不会随着当前对话结束而消失。这类攻击有几个关键前提Agent 具备长期记忆能力存在自动写入路径且写入时未做指令与数据的区分用户在后续会话中正常操作触发恶意记忆召回应用层没有对召回记忆做来源标注或隔离。当这四个条件同时满足时攻击者不需要控制用户终端也不需要拿到系统权限只需要让 Agent 在某次交互中“读到”恶意内容然后剩下的工作由记忆系统自动完成。3.2 与普通提示注入的本质差异维度普通提示注入记忆注入攻击作用范围当前对话或请求跨会话、可长期生效持久性无对话结束即失效有写入记忆库后长期存在攻击触发方式输入内容直接命中需要先完成写入再等待召回触发欺骗目标当前上下文中的模型当前模型上下文 历史记忆系统利用成本较低较高但一次投毒可多次利用检测难度相对容易发现隐蔽性强难以定位根因普通提示注入更像“线下的诈骗电话”一次通话结束就结束记忆注入攻击更像是“在你手机里装了一个长期后台进程”它不一定会立即动作但随时可能在后续任务中生效。3.3 攻击生命周期拆解从防御者视角记忆注入攻击的生命周期可以分成五个阶段阶段一诱导写入。攻击者在 Agent 能读到的内容中放入指令型文本。这个入口非常丰富可能是恶意网页、被注入过的文档、评论区内容也可能是工具返回结果中的一段文本。Agent 在这个阶段通常只是正常读取内容并不会意识到自己在接收指令。阶段二自动持久化。Agent 按照既定记忆写入策略处理内容。如果系统没有识别指令型文本的机制恶意内容就会作为一条正常记忆条目写入长期存储。这一步是攻击成功的关键也是防御的第一道关口。阶段三隐藏等待。恶意记忆和正常记忆混在一起可能不会被立即触发。这个阶段没有明显的异常表现如果日志不完善很难被发现。攻击者可以耐心等待合适的时机。阶段四触发召回。后续某次对话中用户的描述、任务内容或检索逻辑命中了这条记忆。在向量检索场景下只要语义相似恶意条目就会被召回进入模型上下文。阶段五指令执行。若应用层没有做来源标注和指令隔离模型会把召回的记忆内容当作高优先级上下文来处理攻击者的指令相当于在后续会话中得到执行。这里需要强调的是阶段五发生后整个链路已经完成了一次“从内容注入到跨会话执行”的闭环。要切断这个链路可以在写入、召回、执行三个阶段分别设置防护。4. 攻击面分析哪些入口可能被注入在实际项目里需要系统性地梳理记忆系统的所有输入入口。下面这张表可以帮助团队快速定位风险点。攻击面典型入口风险说明防范要点用户输入聊天窗口、API 请求、语音输入用户可能是恶意玩家也有可能输入被中间人篡改对用户输入的信任等级设为最低不直接写入长期记忆外部网页内容Agent 访问网页、抓取链接、读取 RSS网页中可以嵌入指令型文本是最常见的注入入口之一外部内容只进入参考区不进入指令区文档与文件PDF、Word、Excel、Markdown 解析文档内容可能在解析后直接进入记忆写入流程解析后增加内容检查标记来源类型工具返回结果数据库查询、API 返回、代码执行结果工具返回被系统视为可靠来源但可能夹带不可信文本工具返回内容默认低信任写入记忆前过滤多 Agent 协作消息Agent 之间传递消息、共享上下文上游 Agent 输出可能携带注入指令下游 Agent 再次写入记忆在 Agent 边界增加消息验证和来源标记历史数据导入批量迁移、备份恢复、数据集初始化数据源无法完全溯源可能存在过期投毒导入前扫描对内容做指令属性标记需要特别注意“历史数据导入”这条路径。很多团队在开发初期为了快速填充知识库会把网上扒下来的数据、第三方数据集直接灌入向量库。如果这些数据本身就包含对抗性内容那么整个知识库在一开始就被污染了后续所有用户都会受到影响。这个问题在安全领域被称为“数据投毒”记忆注入攻击可以把它从知识库扩展到整个 Agent 记忆系统。5. 典型危害场景与影响评估从防御视角来看分析危害场景的意义在于确定哪些功能需要优先加固。如果记忆系统被注入最直接的后果是 Agent 后续行为偏离预期。下面几个场景值得重点关注。5.1 长期指令后门攻击者通过一次恶意文档或网页让 Agent 在记忆库中写入类似“处理特定业务关键词时跳过审核”的指令。后续用户正常使用系统模型每次都会召回该记忆行为被持续改变。用户很难察觉因为单看响应过程没有明显报错系统的输出看起来依然合理只是背后的决策依据已经被污染。这类后门尤其危险的地方在于它不需要攻击者持续参与。投毒完成一次后续自动生效攻击者可以做“撒网式”注入等待某个高价值用户触发。5.2 敏感信息持续外泄如果 Agent 记忆中含有用户身份、内部系统名称、业务数据等敏感信息攻击者可以通过诱导让 Agent 在后续工具调用中加入发送逻辑或者借助一条注入指令让 Agent 在一次普通查询中把敏感字段拼接进输出。这里面的核心风险不是单条泄露而是记忆系统让泄露变成持续化、批量化的行为。更隐蔽的是如果 Agent 的记忆写入策略会把“对话摘要”自动存入长期存储那么用户在不知情的情况下委托给 Agent 的敏感信息可能被无差别地写入记忆库进一步提升泄露面。因此在设计记忆系统时敏感字段识别和脱敏处理必须前置。5.3 决策与业务逻辑被篡改在电商、金融、客服等场景中Agent 依赖记忆中的用户偏好和业务规则做决策。一条被污染的语义记忆相当于篡改了 Agent 的决策依据。比如记忆中被植入“用户偏好高价套餐”的错误信息Agent 就会在后续推荐中持续执行错误策略直接影响业务转化和用户信任。这类危害在自动化程度越高的系统里越严重。人工客服看到推荐结果时可能还会判断合理性但纯自动化的 Agent 任务比如自动报价、自动审批、自动工单处理会直接把污染记忆当成事实执行。5.4 多用户隔离被绕过多租户 Agent 应用通常依赖业务 ID、用户 ID 区分记忆归属。如果记忆写入时没有严格绑定用户上下文攻击者可能利用注入让一条恶意记忆跨用户召回破坏隔离边界。比如用户 A 在对话中植入了对某个公共知识条目的恶意改写用户 B 在后续查询中召回该条目就间接受到了攻击影响。这种风险在共享知识库、共享工具结果的场景中尤为突出。即使每个用户有自己的私有记忆公共知识区的污染仍然可能通过“知识引用”间接影响所有用户。5.5 记忆污染引发连锁故障被污染的记忆还可能造成功能层面的连锁故障。比如 Agent 误以为某项任务已经完成跳过必要步骤或者记住了错误的工具调用参数反复执行某个动作又或者把优先级搞反把次要任务放在关键任务之前处理。这类故障往往很难排查排查者会先怀疑代码逻辑、模型配置、提示词很少想到问题出在“过去写入的记忆”中。从运维角度看记忆系统应该被当作一个有状态的关键组件来对待而不是一个可以随意写入的缓存。建议在规划阶段就做好备份、回滚和审计机制。6. 检测与监控方案三道防线防御记忆注入攻击不建议只依赖模型提示词。模型没有稳定可靠的安全边界意识应该在应用层做工程化的检查和审计。这里给出三道防线分别对应记忆写入前、召回时、写入后。6.1 第一道防线写入前过滤在记忆写入路径上增加过滤模块识别并拦截明显包含指令型文本的内容。这里可以用启发式规则做第一层拦截再用模型分类或更复杂的检测器做补充。先看一个简单的启发式实现。# 文件路径memory_writer.py Agent 记忆写入过滤器 在将任何内容写入长期记忆之前执行。 用途拦截明显的指令型注入内容降低记忆库被污染的概率。 注意该过滤器是最低成本的第一道防线不能替代完整威胁检测。 # 常见指令型注入的启发式特征 SUSPICIOUS_MARKERS [ ignore previous, ignore all previous, disregard, you are now, from now on, in all future, never forget, remember the following, ] def is_suspicious(text: str) -