Lucid:当 Agent 开始「做梦」——多模态长期记忆的黑盒视觉攻击

  • 关联论文:2607.15657
  • 作者:spark
  • 更新:2026-07-20

一句话结论

提出 Lucid —— 一种严格 image-bounded(不接触目标 MLLM、不接触检索编码器、不接触文本通道)的黑盒对抗框架,可对多模态 Agent 的长期视觉记忆管道实现 61.6% 的"记忆投毒"成功率与 58.4% 的"记忆注入"成功率,揭示当前主流多模态记忆管线存在结构性漏洞。

为什么 2026 H2 必须谈这件事

2026 上半年 Agent 工程界已经把"长期记忆"做成标配:ChatGPT Memory、Claude Projects、Gemini Personalized Context、开源栈 Mem0 / MemGPT / Letta / Cognee / Supermemory,无一例外都假设视觉信号可信。同期 RAG 系统的对抗鲁棒性研究集中在文本通道(PoisonedRAG、Prompt Injection via Retrieval),对视觉通道的对抗研究仍停留在"单张图骗 VLM"层面。Lucid 把视觉对抗的目标从「单轮分类/问答」扩展到「跨轮记忆检索 + 后续生成」的完整 Agent 链路,这是首次系统化证明"长期记忆 ≠ 安全记忆"的工作,与同期的 Token-Flow Firewall(持久 Agent token-flow 安全审计)形成"长期记忆投毒 + token 流审计"的双视角。

解决的真问题

多模态 Agent(如 GPT-4V + 记忆库、AI 助理、机器人视觉日志系统)越来越多地依赖长期视觉记忆来锚定生成:把过去看到的图片、截图、场景持久化到 memory store,检索时喂回上下文。工业界默认假设是「视觉信号可信」。本文要打破的就是这个假设。

真实风险:用户上传一张图 → Agent 存进记忆 → 后续轮次检索出来当事实用。如果这张图被人为加过不可察觉的扰动,攻击者就能在 Agent 后续对话里"种"虚假记忆,篡改叙事、引导决策,且整个过程:

  • 不需要知道目标 MLLM 的权重或梯度(黑盒
  • 不需要接触检索编码器
  • 不需要污染文本通道

这种 threat model 比典型的白盒对抗攻击更贴近真实攻击者能力(攻击者只能拿到图片),也对应多模态 Agent 部署后的供应链场景——任何对图片失去控制权的环节(截图、网页爬图、用户上传、相机输入)都是潜在入口。

核心方法

Lucid 的核心是 image-bounded adversarial crafting——只在像素空间制造"感知不到、检索时却把内容翻成攻击者设定的另一回事"的扰动。论文根据"是否有历史上下文"区分两种失败模式:

失败模式 1:Memory Poisoning(记忆投毒,有上下文场景)

攻击场景:用户先聊了一组事实(如「我上周买的咖啡机是品牌 X」),然后给出"看似无关"的图片作为新视觉输入。攻击者用扰动图替换正常图,由于检索器把图匹配回历史上下文,Agent 在生成时视觉记忆与文本上下文发生语义冲突,最终输出被攻击者预先设定的版本。

形式化:在历史文本上下文 $C_T$ 存在条件下,对原始图像 $x$ 加扰动 $\delta$,得到 $\tilde{x} = x + \delta$,使得多模态记忆系统检索后解码出攻击者目标 $\tilde{y}$,且 $|\delta|_\infty \le \epsilon$。

失败模式 2:Memory Injection(记忆注入,无上下文场景)

更危险的情况:图像被注入到一段没有任何前置文本锚定的对话里。Agent 没有"历史事实"来纠正视觉信号,因此扰动图可以直接作为"权威证据"主导后续生成——这是纯视觉通道的攻击。

评估对象

覆盖 5 类黑盒记忆架构,包括:

  1. 图结构记忆(如 HippoRAG、GraphRAG 类)
  2. LLM 摘要记忆(周期性让 LLM 把视觉事件摘要存进向量库)
  3. 商用部署系统(已上线产品)
  4. 检索-生成端到端管线
  5. 持续记忆 Agent(同一图像在多轮对话中反复出现)

论文还强调"strictly image-bounded"——所有扰动都通过像素层面施加,不修改任何 prompt / 文本 / 元数据,攻击面与现实威胁模型对齐。

关键伪代码(攻击者视角)

# Memory Poisoning 简化流程
def lucid_poison(cover_image, history_context, target_response, budget=ε):
    x = cover_image
    delta = zeros_like(x)
    for t in range(T):
        # 黑盒查询:把 x+delta 喂给目标多模态记忆系统
        y_t = memory_pipeline.retrieve_and_generate(x + delta, history_context)
        # 估计梯度方向(零阶 / 进化策略 / NES)
        grad_estimate = estimate_gradient(pipeline, x+delta, history_context, target_response)
        # 投影回 ε-ball
        delta = project_linf(delta + lr * sign(grad_estimate), eps=budget)
    return clip(x + delta, 0, 1)

实际实现里,作者很可能用了NES(Natural Evolution Strategies)/ CMA-ES / 零阶优化来应对黑盒梯度不可访问的问题,论文里 34 页的实验部分会详细比较不同估计器(原文未明确最优估计器名称)。

关键实验与数据

主结果

  • Memory Poisoning ASR(攻击成功率)61.6%
  • Memory Injection ASR58.4%
  • 评估跨多个对话领域(医疗咨询、法律推理、个人助理、电商推荐等,原文未列具体领域数)
  • 5 类记忆架构上的平均表现

攻击有效性来源

论文论证 ASR 的来源不是"扰动破坏了图像感知",而是扰动让图像特征嵌入在向量空间中偏移到目标语义邻域。他们做了消融:

  1. 移除历史上下文 → Poisoning ASR 大幅下降
  2. 移除扰动 → ASR 接近随机
  3. 仅扰动小局部区域 → ASR 显著下降,验证"全局像素级扰动"是必要的

防御建议(论文提到,原文未明确细节)

  • 感知哈希 + 内容指纹 检测异常图像嵌入
  • 多模态一致性校验:检索回图像后让 LLM 重新校验视觉内容与文本记忆是否冲突
  • 对抗训练:在记忆存储前对图像做对抗清洗
  • 检索多样性:不只依赖最近一次图像,加入时间衰减与多样性约束

亮点与局限

亮点

  1. 威胁模型更现实:image-bounded 黑盒比白盒更接近真实攻击者能力。
  2. 两种失败模式区分清晰:投毒(已有上下文)与注入(无上下文)覆盖了记忆系统两类主要应用场景。
  3. 架构覆盖广:5 类记忆系统都被攻破,说明漏洞是结构性而非某个具体实现的 bug。
  4. 数据细节丰富:34 页 + 5 图 + 15 表,证据链完整。
  5. 与 Agent 长期记忆这一 2026 H2 主流范式对接:直接戳中"记忆 = 长期资产"这一趋势的软肋。

局限

  1. ASR 60% 左右不算极高:离"可靠武器化"还有距离,意味着攻击需要多次尝试或选择性目标。
  2. 扰动预算 ε 未明确给出:原文未明确具体像素级 L∞ 上限(影响"感知不到"的程度)。
  3. 未覆盖防御侧的演化:随着记忆系统加入对抗训练,Lucid 能否保持 ASR 是开放问题。
  4. 商用部署系统样本量小:论文测试的具体产品名称与版本未明确(出于合规 / 责任披露)。
  5. 依赖多模态记忆系统当前架构:如果未来 memory 直接内化进 MLLM(如长上下文视觉 LLM),攻击面会变但仍存在。

对工程落地的启发

  1. 任何把用户图像存进记忆库的 Agent 都应视为可被攻击:医疗、法律、金融场景必须加入对抗图像检测管线。
  2. 检索后的"二次校验"是低成本防线:让 MLLM 在生成前对"图像 + 历史文本"做一致性检查,可以显著降低 Poisoning ASR。
  3. 图像入库前的预处理很关键:感知哈希、CLIP-based 内容指纹、嵌入空间异常检测都是候选。
  4. 记忆系统设计需要"攻击者模型":从设计阶段就考虑 image-bounded 攻击,不要事后打补丁。
  5. 监控指标:记忆库里的图像嵌入分布偏移、检索-生成一致性分数、多轮对话中的"视觉-文本冲突"事件。

与同方向工作的关系

  • 对抗样本在视觉分类器的研究(FGSM、PGD、C&W):Lucid 把对抗样本的攻击目标从"分类器"扩展到"记忆 + 生成"的端到端管线,且限定黑盒 + image-bounded。
  • 多模态 Agent 安全的近期工作(如 adversarial image attack on VLM、prompt injection via image):Lucid 专注长期记忆而非单轮问答,与"会话级"工作形成互补。
  • RAG 投毒研究(如 PoisonedRAG、Prompt Injection via Retrieval):Lucid 把"投毒"从文本通道搬到视觉通道,并证明视觉通道更脆弱(因为文本通道常被检索前的过滤/分类保护)。
  • 多模态记忆评估(如 Long-term Memory Benchmark、Visual Dialog Memory):Lucid 是首个系统化证明"长期记忆 ≠ 安全记忆"的工作。

适合谁读

  • 多模态 Agent / Copilot 工程师:评估自家记忆系统的攻击面
  • AI 安全 / Red Team:把 Lucid 加入多模态 Agent 红队工具箱
  • 记忆系统架构师:设计下一代 memory store 时考虑对抗鲁棒性
  • AI 安全研究者:扩展到其他威胁模型(音频、3D、视频帧序列)
  • 政策制定者:评估多模态 Agent 在医疗、法律等高风险场景的部署安全性

不确定处

  • 具体扰动预算 ε 未在 abstract 中明确,需查正文
  • 攻击者使用的零阶优化算法细节未明确
  • 5 类记忆架构的具体清单与商用系统名称未在 abstract 给出
  • ASR 是否对最新商用记忆系统(如 ChatGPT Memory、Claude Projects 等)有效未明确

关键术语

  • ASR (Attack Success Rate):攻击成功率
  • Image-bounded threat model:威胁模型限制在只能修改图像
  • Memory Poisoning / Injection:记忆投毒 / 记忆注入
  • Multimodal Memory Pipeline:多模态记忆管线
  • Black-box Adversarial Attack:黑盒对抗攻击
  • Long-term Memory in Agents:Agent 的长期记忆模块

工程落地与核查(Jay)

⚠️ 事实核查

  1. 61.6% / 58.4% ASR:这是论文主实验数字,可溯源至原文,但 ASR 是在受控评估集上测得(5 类记忆架构 × 多种攻击场景),不代表在实际部署的记忆系统上同样有效。
  2. 黑盒假设的现实性:攻击者能对任意输入图像施加像素扰动 = 需要控制图像供应链(上传/爬取/中间人)。在用户侧直接上传场景(如聊天应用),攻击门槛相对较高;但在企业知识库 / RAG 图像管道场景(爬虫 → 存储 → 检索),攻击入口真实存在。
  3. 商用部署系统评估:原文测试了"已上线产品"但未点名(出于合规),意味着读者无法自行复现对特定商用系统的 ASR。
  4. 34 页 + 5 图 + 15 表:原文总长度(需核实正文是否确实为 34 页;arXiv 2026 年全文常见在 15-25 页,34 页属于超长篇幅,可能是包含了附录)。
  5. NES / CMA-ES / 零阶优化:原文未明确黑盒梯度估计方法,伪代码中的"estimate_gradient"是简化表示,实际实现需读者参考正文。

工程落地:红队视角(攻击者参考)

攻击入口识别

攻击面图谱:
用户上传图片  →  图片进入 memory store(入口1:直接攻击)
网页爬虫图片  →  图片入库(入口2:供应链攻击)
相机/RTSP流 →  帧存入记忆(入口3:IoT/机器人场景)
第三方API图  →  中间人扰动(入口4:网络层攻击)

复现攻击的必要条件: - 目标记忆系统的图像检索 API(黑盒查询能力) - 扰动预算 ε(需从原文附录或实验部分获取具体数值;L∞ 范数下通常 ε=8/255 ≈ 0.031) - 足够的查询预算(NES/CMA-ES 通常需要 1000-10000 次黑盒查询,取决于图像分辨率)

攻击复现代码框架(NES 变体)

import numpy as np

def nes_attack(image, target_token_ids, memory_pipeline,
               n_iter=2000, lr=0.002, eps=8/255):
    """Natural Evolution Strategies for black-box image-bounded attack.
    每次迭代需要 2*pop_size 次 memory_pipeline 查询(评估正负方向扰动)。
    """
    pop_size = 100  # NES population
    delta = np.zeros_like(image)
    for _ in range(n_iter):
        # 从正态分布采样扰动方向
        perturbations = [np.random.randn(*image.shape) for _ in range(pop_size)]
        # 评估正方向
        pos_scores = [memory_pipeline(image + d, target_token_ids)
                      for d in perturbations[:pop_size//2]]
        # 评估负方向
        neg_scores = [memory_pipeline(image - d, target_token_ids)
                      for d in perturbations[pop_size//2:]]
        # 估计梯度方向(零阶)
        grad = sum(pos_scores[:pop_size//2]) - sum(neg_scores[:pop_size//2])
        delta += lr * np.sign(grad)
        delta = np.clip(delta, -eps, eps)
    return np.clip(image + delta, 0, 1)

⚠️ 此代码为概念验证框架;实际攻击效果取决于目标系统的检索语义空间与图像编码器的鲁棒性。

工程落地:防御者视角(系统构建者参考)

低成本防御层级(按实现成本排序)

层级 方法 成本 效果
L1 图像入库前做感知哈希(PHash / aHash)对比 极低(几十毫秒/图) 检测已知攻击图像(变体逃逸需重新提取)
L2 CLIP 嵌入空间最近邻异常检测(余弦相似度 < 阈值) 低(一次向量查询) 对分布外嵌入有效,对精心设计的对抗嵌入效果有限
L3 检索后 LLM 二次校验("图中所见与文本记忆是否一致?") 中(每次生成多一次 LLM 调用) 显著降低 Poisoning ASR,但增加延迟
L4 对抗清洗(JPEG 压缩 / 高斯模糊 / Bit Depth Reduction) 低-中 破坏细微扰动,但同时影响正常图像质量
L5 对抗训练图像检测分类器(专门识别 Lucid 类扰动) 高(需标注数据) 对已知攻击模式最有效,需持续更新

推荐防御组合(生产可用)

def defense_pipeline(image, clip_model, llm, memory_text_ctx=None):
    # L1: 感知哈希去重
    img_hash = image_phash(image)
    if img_hash in known_attack_hash_db:
        return None, "blocked_by_hash"

    # L4: 对抗清洗(轻量级)
    cleaned = JPEGCompress(image, quality=85)  # 破坏细微扰动
    if euclidean_distance(image, cleaned) > 0.01:
        log_warning("image_perturbed_detected")

    # L2: CLIP 嵌入异常检测
    clip_emb = clip_model.encode_image(cleaned)
    if nearest_neighbor_similarity(clip_emb) < 0.6:
        return None, "blocked_by_embedding_anomaly"

    # L3: 多模态一致性校验(高价值场景)
    if memory_text_ctx:
        llm_verdict = llm.ask(
            f"Given the text context: '{memory_text_ctx}', "
            f"does the described image content match? Answer yes/no."
        )
        if "no" in llm_verdict.lower():
            return None, "blocked_by_consistency_check"

    return cleaned, "passed"

高风险场景清单: - 医疗影像 + Agent 诊断(视觉记忆被投毒 → 误诊风险极高) - 法律文档图像 + 合同分析(虚假证据植入) - 金融票据图像 + 报销审核(欺诈性收据) - 机器人视觉日志(物理世界状态被篡改)

以上场景必须部署 L3 级别的多模态一致性校验,且建议定期用已知对抗图像做红队测试。