一句话总结
头部厂商把模型的思维链加密后再交给客户端保管,这个数据块是跨会话、跨用户、跨模型通用的。攻击者只要把旗舰模型的加密思考丢给同门那个防线更松的小模型,用一句普通指令就能让它把 “自己的思考” 逐字读成明文,全程不必攻破任何加密算法
- 论文标题:Stealing Reasoning Traces from Proprietary LLM APIs
- 论文地址:https://arxiv.org/abs/2608.09867
- 作者背景:德国马普所、图宾根 AI 中心、ELLIS Institute Tübingen、美国 MATS 等
- 项目主页:stolen-thoughts.com
说明:作者在公开本文前已把全部漏洞细节通报给相关厂商。截至 2026 年 8 月,文中提到的攻击手段已无法复现
一、动机:为什么要加密
现在的推理模型在回答你之前,会先生成一大段思维链(chain-of-thought),即张嘴之前内心的盘算过程。这段草稿往往比最后那句答案信息量大得多:中间试过的假设、算到一半的中间结果、翻查过的资料,全都在里面
现在的头部大模型服务厂商(Anthropic、OpenAI、Google)都不会明文返回思维链,理由有两个:
- 知识产权:推理过程是花大价钱训出来的核心能力,同行若能拿走,就能低成本复刻蒸馏
- 敏感内容:思考里可能夹带不该外泄的信息,如受监管内容、用户密钥等。屏蔽真实思维链能最大程度规避风险
多轮对话中,模型必须记得上一轮想到哪儿,但服务器又不想为每个会话存状态。所以常见的做法是:把思考内容加密后发送给客户端,下一轮请求时直接把它原样带回。这样服务器剩下了巨量的状态存储开销,客户端也看不到消息明文
既然推理过程一般不展示给用户,那我们在相关的大模型产品前端看到的 “thinking” 内容又是什么?那其实是专门用于展示的 “思考摘要”。但实际上这个摘要并不靠谱,不是真实的思路展示
二、漏洞根源
2.1 跨端通用
加密消息要能被客户端带回来、还能被服务器顺利读出,就意味着这个加密信封必须是可以搬来搬去的,这便埋下了祸根。作者发现,同一厂商发出的这些加密块在不同对话、不同用户、甚至不同模型之间往往都能通用互换
最可能的原因是厂商用同一把全局密钥签发所有消息,AEAD(常见的认证加密模式)只认内容完整性,不管具体上下文是否合理(这是目标用户在预期会话中产生的上下文吗)
2.2 防护不对称
加密策略跨模型通用,引发了严重的安全性不对称问题:旗舰模型(Claude Opus 4.8、GPT-5.6 Sol、Gemini 3.1 Pro)被严防死守,怎么套话都死活不肯吐露思考;可那些同门的便宜小模型,为了跑得快、省成本,往往没配上同样严格的对齐防线(Claude Haiku 4.5、GPT-5.6 Luna、Gemini Robotics 1.6)
如此一来,攻击方法便顺理成章:把旗舰模型产出的加密数据,原样交给防线更松的小模型,要求它把自己的思考照抄一遍,于是就能得到私密思考的明文
2.3 效果验证
真实思考没有标准答案(ground truth),那如何验证这样读出来的内容是准确的?作者用了一个巧妙的旁证:接口会报告本次思考大约消耗了多少 token。把偷解出来的思考重新统计 token 数,与接口报告的数字在 120 道编程题(Codeforces)上高度吻合。数量对得上,是内容忠实的有力信号
三、应用价值(能捅多大篓子)
3.1 蒸馏
偷走思维链数据后能做什么?最直接的一条就是偷师。按小模型(Haiku 4.5 档)的接口价,解码一万条思考只需约 $720。
此外作者还做了一个耐人寻味的实验:把 Opus/Sol 的推理片段,prefill 进各开源模型的思考开头,再让它们自由续写。结果很分明:Kimi-K3 的回答内容变来和 Opus、Sol 两个来源高度一致,GLM-5.2 则主要向 Opus 偏移,而 Inkling、DeepSeek 等几乎没动。换个角度用困惑度(模型对一段文本的意外程度,越低越像自己写的)来看也一样,Kimi-K3、GLM-5.2 对这些泄露文本预测得明显更顺手,而这两个模型此前也确实就蒸馏问题在社区被讨论
作者叠甲:这些现象只是行为上异常的兼容性,不能因果性地证明模型一定做了大量蒸馏,不是在做任何批判
预填充注入 Opus 思维链:Kimi-K3 的 n-gram 重叠度明显上升
Kimi-K3 和 Inkling 互相注入:n-gram 重叠度不怎么变
具体案例
3.2 隐私泄露
很多人会把 AI 智能体的运行日志直接发到网上,以为把明文里的密码密钥擦干净就万事大吉,却忘了那个加密思考块里,还藏着自己根本读不到、也擦不掉的东西
作者从 GitHub、HuggingFace 收集了 6k 份公开轨迹,解码出 315k 段隐藏思考。经过滤、去重和排除基准测试数据后,能得到 704 条敏感信息,涵盖凭据、个人信息与技术标识各类(62 个 API key、33 个密码、24 个 access token、7 个私钥、30 个邮箱)
最值得注意的是,有 64 条隐私数据压根没出现在可见对话里,只存在于隐藏思考中。现实中我们可能经常遇到一个高频场景:让智能体 “清理、脱敏这段记录再发出去”,它为了执行任务,反而在隐藏思考里把敏感值又完整复述了一遍
3.3 危险信息
市面上各种模型都被训来具备一定的道德标准,一半不会在回答里帮你做坏事;可它在推理时防线却没那么紧。如果引导模型在思考里把某些危险步骤盘算一遍,尽管最后输出的表面答案是礼貌地拒绝,但也可以从思考块中把危险信息掏出来
3.4 提示注入
攻击者可以事先把一条恶意指令预埋进一个加密思考块,再混进网上分享、可续跑的运行记录。等你接着这份记录往下跑,模型会把这段思考当成 “自己刚才想过的”,乖乖照做 —— 比如悄悄把你的文件外传到攻击者的服务器
传统注入攻击好歹写在明面上,你和监控系统还能审一眼;藏进加密思考里后,明文层毫无痕迹,等于开了一道谁都察觉不到的后门
四、缓解方案
病根既然是 “AEAD 只认证内容、不认证上下文”,那核心药方就一句话:给每个加密块绑上它的身份与位置。以下是站在模型供应方的立场上,为各类问题提供针对性解决措施
- 跨用户泄露:签发时把
user_id焊进 AEAD 的关联数据;重放时接口比对身份,对不上当场拒收 - 跨会话泄露:给每个加密块做一条哈希链,把它绑到
session_id和它的直接前驱上。为了不误伤 “分叉对话、压缩旧轮次、中途降级到便宜模型” 这些正常操作,作者用 Merkle 树结构:叶子是各个信息块,压缩后只保留树根,既能廉价地保证先后次序,又能按需验证任意一段连续区间 - 历史数据:已经公开的旧加密块无法追溯保护,唯一补救是轮换作废所有旧签名密钥,但代价是旧会话也一并失效
- 向后兼容:设一个有限的双格式过渡窗口,同时接受新旧数据并提供需身份验证的批量重签接口,让企业存档在确认归属后迁移到新方案
- 模型层加固:加密管不住合规模型被正当调用后做出意料之外的动作。因此还需在训练阶段让模型学会识别并拒绝 “誊写思考” 类越狱