[Security] Memory content injected into system prompt without sanitization enables indirect prompt injection

该问题出现在使用 CrewAI 的 LiteAgent 并启用记忆(memory)功能时,检索到的记忆内容被原样拼接进 system prompt,导致被污染的记忆条目可执行间接提示注入。优先排查记忆写入路径(工具输出、任务结果是否进入 memory)以及 _inject_memory() 是否对记

快速结论:该问题出现在使用 CrewAI 的 LiteAgent 并启用记忆(memory)功能时,检索到的记忆内容被原样拼接进 system prompt,导致被污染的记忆条目可执行间接提示注入。优先排查记忆写入路径(工具输出、任务结果是否进入 memory)以及 _inject_memory() 是否对记忆内容做隔离处理。

适用环境:Issue 已确认的工具为 CrewAI,受影响文件为 lib/crewai/src/crewai/lite_agent.py(第 568-581 行)。Issue 未确认具体操作系统、Python、CUDA、显卡或依赖版本,请勿补写。

最快修复方案:暂无确认的一步修复方案。Issue 中提出的建议是:在 _inject_memory() 中对记忆内容进行清洗(去除换行、截断长度),并用明确的数据边界标记包裹,例如标注为“retrieved context, not instructions”。评论中的可优先尝试方向是将记忆内容从 system prompt 移到低信任度的 <memory-context> 数据块中,并在写入记忆前做写入路径校验。

注意事项:上述清理和分隔符方案均属建议或社区讨论,Issue 中未标记为已验证修复;正则清洗存在绕过风险(分隔符攻击仍然存在),且写入路径分类器存在一定误报率,需自行评估。

问题场景

用户在 CrewAI 中使用 LiteAgent,并启用了记忆功能。当 agent 处理外部数据(例如抓取网页、读取文档、调用工具)后,内容可能通过 RememberTool 或自动记忆提取被写入 memory。后续交互中,LiteAgent._inject_memory() 调用 self._memory.recall(query, limit=10) 取回记忆,并把 m.record.content 直接拼接进 system prompt。若此前写入的记忆含有隐藏指令,就会被当作系统级指令注入到后续对话中。

报错原文

[Security] Memory content injected into system prompt without sanitization enables indirect prompt injection

原因分析

核心原因是 LiteAgent._inject_memory() 在拼接记忆时缺少隔离和清洗:

  • 记忆内容 m.record.content 未经过任何消毒,直接与 "Relevant memories:\n" 拼接。
  • 拼接结果通过 self.i18n.slice("memory").format(memory=memory_block) 格式化后,被追加到 self._messages[0]["content"],即 system message 中。
  • 记忆可能来自之前的工具输出或任务结果,攻击者可通过间接提示注入把指令写入记忆,使其在后续会话中持久化。

这可能构成 OWASP ASI-01(Prompt Injection)以及评论中提到的 ASI06(Memory Poisoning)类问题。在多 agent、allow_delegation=True 的场景下,被污染的记忆还可能通过委派消息在 agent 之间级联传播(社区评论称为“memory injection cascading”)。

环境排查

  • 确认 CrewAI 版本,并核对 lib/crewai/src/crewai/lite_agent.py 中 _inject_memory() 的实现是否与 Issue 描述一致(约第 568-581 行)。
  • 确认是否启用了 memory,以及记忆写入来源是否包含工具输出、网页抓取、文档读取等外部内容。
  • 确认是否使用了 RememberTool 或自动记忆提取。
  • 确认是否存在多 agent 委派(allow_delegation=True),以评估级联传播风险。
  • Issue 未提供 Python、CUDA、PyTorch、显卡或具体依赖版本,无需额外核对。

解决步骤

  1. 定位 lite_agent.py 中的 _inject_memory(),确认 self._memory.recall(query, limit=10) 的返回内容是否未经过滤直接进入 system message。
  2. 可优先尝试:在拼接前对记忆内容做最小化清洗,例如压缩多余换行、截断超长内容,避免提示空间被耗尽或结构被破坏。
  3. 可优先尝试:用明确标注数据来源的边界标记包裹记忆内容,例如在提示中声明这是“retrieved context, not instructions”,而不是可执行指令。
  4. 可优先尝试:将记忆内容从 system prompt 移到用户轮次中的低信任度结构化数据块,例如 <memory-context role="data" trust="low">...</memory-context>,借助模型的指令层级降低注入成功率。
  5. 可优先尝试:在写入路径增加校验,在把工具输出存入 memory 之前检测指令式模式(如 “ignore previous instructions”、“you are now”、“system:”),对可疑条目进行隔离或拦截。
  6. 如使用多 agent 委派,检查委派消息是否也会携带记忆内容,避免一个被污染的记忆条目通过委派链扩散到其他 agent。

验证方法

可构造一条包含隐藏指令的工具输出,使其经正常流程写入 memory,然后在后续会话中触发记忆召回,观察注入内容是否仍以系统级权威进入 system prompt、是否被作为指令执行。若修复后该内容被包裹在低信任度数据块中、或被写入路径拦截,则问题得到缓解。社区评论提到可使用 AgentThreatBench 等测试集验证该 crewAI 记忆级联注入模式在对抗条件下是否仍成立。

参考来源

crewAIInc/crewAI #5057

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25458

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注