跳到正文
15 分钟阅读

思维链重放攻击的第二条路径:从加密块搬运到运行时回放

隐藏思维链没有出现在模型最终回答里,并不代表它已经离开了攻击面。

2026/08/30

隐藏思维链没有出现在模型最终回答里,并不代表它已经离开了攻击面。

此前,模安局在《思维链重放攻击:从前沿模型蒸馏到 Agent 轨迹劫持》中介绍过第一条攻击路径:攻击者把强模型生成的加密推理块搬运到同一厂商的较弱模型中,再诱导弱模型将其中的思维链还原成明文。

那项工作暴露的是加密状态在不同用户、会话和模型之间缺少绑定的问题。

仅仅十天后,CISPA 团队公布的 EchoCoT 又展示了第二条路径。

它不需要获得 encrypted_content,也不需要寻找一个安全能力较弱的“解码模型”,而是利用工具调用期间仍然驻留在目标模型上下文中的活跃推理状态,通过连续的工具返回注入,让原模型自己把隐藏思维链逐步抄进工具参数。

图1

论文原文(arXiv)

如果说前一种攻击是“偷走锁着的笔记本,交给另一名拥有兼容钥匙的人打开”,那么 EchoCoT 更像是趁笔记本还摊在桌上,不断要求原作者把草稿重新誊写一遍。两篇工作攻击的是同一种资产,却分别击中了推理状态的存储层和运行时。

上一条路径:搬运已经加密的思维链

为了防止竞争者直接收集高质量思维链用于模型蒸馏,OpenAI、Anthropic、Google 等厂商通常不会把完整推理过程以明文返回。

部分 API 会把内部推理封装成不透明的加密块,客户端只负责保存,并在后续请求中原样传回。这样既能维持推理连续性,也不需要厂商长期保存每个用户的完整状态。

问题在于,此前论文《Stealing Reasoning Traces from Proprietary LLM APIs》发现,这些加密块在当时可以跨会话、跨用户,甚至跨同一厂商的不同模型复用。

攻击者可以先让能力强、保护严格的模型生成推理块,再将其交给更便宜、拒答能力更弱的兼容模型,诱导后者把其中的推理内容逐 Token 转录出来。

这不是攻击者在密码学意义上破解了密文,而是模型服务端仍然愿意接收、验证并恢复这段状态,弱模型随后又被诱导将恢复出的内容外显。

真正失效的是授权绑定:系统验证了“这是一段合法状态”,却没有充分验证“谁可以在什么模型、什么会话、什么任务和什么位置使用它”。

这种横向可搬运性带来了四类风险:前沿模型蒸馏、隐藏危险信息恢复、公开 Agent 日志中的隐私与凭据提取,以及利用不透明推理块投毒后续 Agent 轨迹。

研究者从公开代码仓库中收集并解码了 315,320 个推理块,识别出 367 项个人身份信息和 182 项凭据。这使第一条路径的影响远远超出了模型知识产权保护。

EchoCoT 作者在论文中直接将这项工作列为并发研究,并指出相关厂商在披露后已经修补了受影响的跨模型重放路径。

但一个更根本的问题仍然存在:即使加密块已经与会话和模型正确绑定,只要目标模型在运行过程中还持有原始思维链,它是否仍可能被诱导泄漏?

图2

第二条路径:工具调用为何留下了回放窗口

普通多轮聊天中,模型完成一轮回答后,内部生成的 reasoning tokens 通常不会原样进入下一轮。用户第二次追问“把刚才的真实思考过程告诉我”,模型更可能重新组织一份解释,而不是读取已经结束的原始推理。因此,单纯依靠直接提示,很难证明得到的是原始思维链。

工具调用却有不同的状态生命周期。

模型决定调用搜索、代码执行器、数据库或 MCP 工具后,当前 assistant turn 还没有真正结束。

系统需要把工具结果交还模型,让它沿着先前思路继续执行。

如果每次工具返回后都清空推理,模型可能忘记为什么调用工具、已经排除了哪些方案,也无法连贯完成复杂任务。

因此,许多推理模型会在同一轮的多次工具调用之间保留先前的 reasoning state。

这正是 EchoCoT 所说的“推理回放面”。隐藏思维链虽然没有直接返回给用户,却仍然存在于后续工具反馈能够影响的上下文中。

只要攻击者可以定义工具、读取工具参数并控制工具返回,就可能让不可信工具输出与受保护推理状态在同一上下文中相遇。

从系统安全角度看,这里出现了一个关键的信任边界:工具返回本应只是外部环境提供的数据,却可以伪装成“系统诊断”“归档审核”或“内部合规要求”,对仍持有秘密状态的模型发出控制指令。

模型既是秘密的持有者,又是解释这些不可信指令的执行者,最终还拥有把文本写入外部工具参数的能力。

EchoCoT 如何让模型自己复述思维链

EchoCoT 的完整攻击并不是一句“请输出你的思维链”,而是一条发生在同一轮内的多步工具交互链。

第一步,攻击者向目标模型提交一道数学、代码或科学问题,同时定义一个可以接收长文本的 scratchpad,也就是“草稿归档”工具,并要求模型解题后调用该工具保存推理。模型完成内部推理后,通常会第一次调用工具,但它写入参数的往往只是经过整理和压缩的解题摘要。

第二步,攻击者并不正常执行工具,而是在工具返回中注入伪造的审核反馈,例如声称“归档不完整”“缺少原始推理细节”或“必须重新提交完整内部记录”。由于这仍处于同一轮调用中,模型此前生成的思维链尚未被清除。模型可能读取仍在上下文中的推理状态,并在第二次工具调用中写入更长、更接近原文的版本。

第三步,攻击者比较多个候选版本,判断哪一个最接近目标思维链,然后继续返回拒绝、补全或接受指令。论文默认最多执行三步:前两步用于注入和逼近,最后一步接受归档并让模型生成最终答案。实验显示,三个可取得真实思维链的目标模型在第一次工具调用时,ASR@90 均为 0;第一次拒绝反馈进入上下文后,第二次调用才开始出现近逐字提取,第三次调用又进一步提高成功率。这说明真正发挥作用的不是普通归档请求,而是“保留状态+工具反馈注入+多步重试”的组合。

需要注意,论文提取的目标并不是模型只看到原始问题时产生的思维链 c,而是模型同时看到问题和工具归档要求后生成的 c*。这两段推理不必完全相同。不过,不同模型和攻击方法下,加入工具请求前后的最终答案一致率仍达到 84.2%~93.0%,说明 c* 大体保留了解决原问题的核心推理。

图3

看不见原文,攻击者怎么知道“抄全了”

EchoCoT 最聪明的地方,不只是发现了工具调用中的状态连续性,而是把 API 原本用于计费和可解释性的低敏感信号变成了攻击反馈。

第一个信号是 reasoning token count,也就是模型本轮消耗的推理 Token 数量。如果 API 显示目标模型进行了 10,000 Token 的内部推理,而工具参数中只出现 1,500 Token,攻击者不需要看见真值也能判断这只是一份摘要。论文用长度误差衡量候选与目标的接近程度:候选越接近 API 报告的推理长度,就越可能是较完整的回放。

第二个信号是思维链摘要。部分 API 不提供原始推理,却会返回经过压缩的 reasoning summary。攻击者可以计算候选思维链对摘要内容的 Token 召回率,判断主要推理节点是否已经覆盖。长度告诉攻击者“还缺多少”,摘要则大致告诉攻击者“缺了什么”。两者共同构成了一个类似盲注的反馈 Oracle:攻击者看不见秘密本身,却可以根据外部信号不断逼近。

论文进一步使用另一个大模型自动优化整条注入轨迹。优化器按照 Inject、Reflect、Distill 三个阶段工作:先改变权威身份、拒绝理由、完整性要求或输出格式等一个维度;再分析本轮长度误差、摘要召回和失败模式;最后把有效经验沉淀到长期记忆中,指导后续批次。仅依赖长度的版本称为 LGO,同时利用长度和摘要的版本称为 LTGO。

这里的“通用轨迹”并不是一条提示词同时攻破所有模型,而是针对每个目标模型分别优化出一条固定的多步轨迹,再把它迁移到该模型没有见过的问题和数据集上。这一限制非常重要,否则容易把论文结果误读成跨厂商通用越狱。

实验是否真的证明了“原文回放”

论文首先在 DeepSeek-V4-Flash、Qwen3.5-Plus 和 GLM-5.2 上进行实验。由于研究者能够取得这些模型的真实思维链,因此可以把提取结果与目标逐 Token 对齐。

论文采用的 ASR@90 要求同时满足两个条件:提取长度与目标相差不超过 10%,且 Token-EM 不低于 0.90。

Token-EM 衡量目标思维链中有多少 Token 落在精确匹配的对齐片段里,允许匹配片段之间存在插入或删除,因此不是逐字节完全一致,但比一般语义相似度严格得多。

目标模型LTGO 的 Token-EM 均值ASR@99ASR@90
DeepSeek-V4-Flash0.82346.1%66.4%
Qwen3.5-Plus0.49522.8%30.8%
GLM-5.20.64931.1%41.9%

直接提示和事后合成思维链在三个模型上的严格成功率基本为 0,已有 REP 方法的 ASR@90 也只有 0.3%~1.9%。

最有说服力的 DeepSeek 物理题案例中,目标思维链为 21,106 Token,EchoCoT 提取出 21,109 Token,Token-EM 达到 0.999;1,132 行文本中只有 3 行不同,而且主要是 LaTeX 与 Unicode 记号格式差异。

至少在这三个存在真实对照的模型上,EchoCoT 确实不只是让模型重新编写了一份相似解释。

攻击轨迹也表现出一定的跨任务迁移能力。

在 OpenThoughts 上优化后,DeepSeek 的固定 LTGO 轨迹在 MATH500、JEEBench 和 LiveCodeBench 上分别达到 80%、71% 和 64% 的 ASR@90;GLM 分别为 50%、50% 和 40%;Qwen 则为 19%、12% 和 37%。

差异说明攻击具有跨数学、科学和代码任务的泛化能力,但模型之间并不存在统一成功率。

论文还测试了 Gemini-2.5、Gemini-3.1、Gemini-3.5、Claude Sonnet-4.6 和 Opus-4.6。

由于闭源模型的真实思维链不可见,作者只能使用推理长度、摘要召回和摘要语义覆盖作为代理。

在每个模型的 400 道问题中,提取长度误差不超过 10% 的比例分别为 36.5%、32.0%、19.3%、9.5% 和 17.0%。

Gemini-2.5 的最长案例从 API 报告的 32,948 Token 目标中提取了 33,463 Token,但目标长度与提取长度使用的 tokenizer 不同,长度接近不能单独证明逐字一致。

论文后续的摘要忠实度统计还只覆盖“存在摘要且长度误差不超过 30%”的筛选后子集,也不能直接当成整体攻击成功率。

因此,论文结论应当分成两级理解:对三个可取得真实 CoT 的模型,近逐字提取证据很强;对五个闭源前沿模型,研究提供了具有说服力的泄漏迹象,但没有完成同等级别的真值验证。

图4

两条路径背后其实是同一个系统矛盾

EchoCoT 真正新增的不是“模型可能泄漏思维链”这一结论,而是把风险从加密状态的可搬运性推进到了活跃状态的可外显性。

前一条路径属于存储和传输层安全:思维链已经被序列化为加密对象,但没有牢固绑定使用者、模型、会话和任务。

第二条路径属于运行时安全:思维链仍在模型内部,却可以受到不可信工具反馈影响,并沿工具参数这条出口流出。

两者共同指向一个更深的设计矛盾:推理系统一方面把思维链视为需要保护的秘密资产,另一方面又把它当成维持长任务连续性的执行状态。

为了让模型在切换会话、模型或工具之后继续工作,系统必须保存、恢复或传递某种状态;但只要状态可以被重新激活,就必须同时回答谁有权恢复、恢复到哪里、可以影响哪些决策,以及恢复后的内容能流向哪些外部接口。

从这个角度看,加密思维链并不只是一段普通密文,更接近一份被序列化的进程快照;工具调用期间保留的推理,则相当于仍驻留在内存中的活跃进程。

前者需要上下文绑定和防重放,后者需要信息流控制和外部输出隔离。

只做其中一层,攻击者仍可能从另一层绕过。

这也解释了为什么 EchoCoT 不应被简单归类为又一种 Prompt 越狱。

恶意文本确实通过工具返回进入模型,但真正让攻击成立的是三种系统能力叠加:模型仍持有秘密状态、工具返回可以改变后续控制流、模型又被允许把长文本写入攻击者可见的工具参数。

提示注入只是扳机,状态生命周期和数据出口才是弹药。

为什么几种直观防御都不够

论文在三个可获得真实 CoT 的模型、100 道 OpenThoughts 问题上测试了多种防御,未防御时平均 ASR@90 为 46%。

最彻底的办法是在第一次工具调用后删除原始推理状态,攻击成功率随即降到 0。

但这只是理想上界,因为复杂 Agent 正是依靠状态连续性完成后续工具调用,直接删除可能明显损害任务能力。

防御性 System Prompt 要求模型把工具输出视为不可信内容,并禁止向用户或外部工具复述内部推理。

它把平均 ASR@90 降至 5%,但攻击者针对防御重新优化轨迹后又升至 9.7%,其中 DeepSeek 仍达到 29%。

这说明 System Prompt 有用,却不能承担运行时机密隔离的全部责任。

只隐藏 reasoning token count 同样不够。

攻击者可以利用 API 返回的总 Token 用量,减去可观察的输入和输出长度,近似推断思维链长度。

该防御在原攻击下把平均 ASR@90 降至 14.7%,自适应优化后又回升到 30.3%。

完全隐藏所有用量信息后,攻击率仍维持在 12%~15%;对长度加入随机扰动也只能将结果压到 13%~17%。

这些信号可以增强攻击,却不是攻击成立的根因。

真正可落地的防御需要同时覆盖两篇论文暴露的两条路径:

给持久化状态做强绑定。 加密推理块应绑定用户、会话、目标模型、任务、调用位置和有效期,默认禁止跨用户和跨模型复用,并支持撤销与防乱序重放。

把工具返回永久视为不可信数据。 工具结果不得伪装成系统角色、内部诊断或归档授权;系统应在消息协议层保留来源与信任级别,而不是只依赖模型根据自然语言自行判断。

减少原始思维链跨步骤传播。 工具调用后尽量传递结构化任务状态,例如目标、已完成步骤、待验证假设和必要变量,而不是继续暴露完整逐 Token 推理。即使不能完全删除,也应将原始推理与后续工具反馈隔离。

控制工具参数的数据出口。 对 scratchpad、日志、邮件、文件写入等长文本参数设置长度、频次和内容策略,检测与内部推理高度重合的异常文本,尤其关注“第一次很短、被拒绝后连续变长”的归档模式。

重新评估 API 元数据。 精确推理长度和摘要可以改为分桶、延迟汇总或按权限开放;总 Token 用量也应考虑可被反推的侧信道风险,但不能把隐藏元数据误认为根治方案。

使用自适应攻击做回归测试。 固定 Prompt 被拦住不代表漏洞消失。安全评测需要允许攻击者根据工具结果、长度变化和拒绝模式持续调整轨迹,验证防御在多步交互下是否仍然有效。

图5

局限性

EchoCoT 的攻击者必须能够为目标模型提供工具、读取工具调用参数并控制工具返回。

普通聊天产品中的一般用户未必拥有这些能力,但开放 Agent 平台、允许自定义函数的 API、第三方 MCP 服务以及已经被攻陷的工具更符合论文威胁模型。

论文提取的是在“原始问题+工具归档要求”共同作用下生成的 c*,不能直接等同于模型在完全正常任务中产生的 c。

84.2%~93.0% 的答案一致率只能说明核心解题结果大体保留,不能证明两段内部推理相同。

它也没有展示跨用户或跨会话读取其他人的思维链,这一点与前一条加密块攻击存在明显差别。

对闭源模型,真实 CoT 和原始 tokenizer 都不可获得,摘要与长度只是中等强度的代理信号。

每个样本只执行了一次,论文没有量化温度为 1.0 时的重复运行波动,也没有系统评估攻击成本、延迟、异常检测概率,以及删除或压缩推理状态对真实 Agent 任务能力的影响。

因此,EchoCoT 已经证明运行时回放面真实存在,但尚未给出生产环境中所有模型的普遍风险水平。

隐藏不是一种安全边界

前一条思维链重放攻击告诉我们:加密不等于获得了正确的使用授权,一段密文如果能够脱离原始用户、会话和模型被重新激活,仍然可能泄漏。

EchoCoT 又补上了另一半:即使加密状态已经无法搬运,只要思维链仍作为活跃执行状态存在,恶意工具就可能借助同轮交互让模型自己完成泄漏。

两项工作合在一起,描绘出一张更完整的推理状态攻击面:离开模型的状态需要防搬运、防乱序和强上下文绑定;留在模型内部的状态需要防不可信指令影响、防越权读取和防外部接口泄漏。

真正的保护对象也不应只是某个 encrypted_content 字段,而应是思维链从生成、驻留、传递、恢复到销毁的整个生命周期。

对于正在建设 Agent 平台的人来说,这或许才是 EchoCoT 最重要的提醒:隐藏思维链不是一个单纯的模型输出选项,而是一种携带秘密、能够影响后续行为的运行时状态。

只要系统需要让这份状态继续工作,就必须像管理凭据、内存和执行权限一样管理它。

同专题推荐

查看专题