打开网易新闻 查看精彩图片

有一个系统,号称能让云端参与训练一个大语言模型,同时保证云端永远看不到你的真实数据。它做了很多防护措施:给数据加噪声、打乱顺序、混入大量假数据当烟雾弹。它通过了官方的隐私测试,拿到了安全认证。

结果呢?两位研究者发现,这套系统留了一扇窗户,从来没人检查过。透过这扇窗户,云端不需要破解任何加密,不需要绕过任何噪声,只要看一眼某个数值是不是零,就能把真实数据和伪装数据精确分开,四千多份样本,一份不差,全部分对。

这篇论文讲的就是这件事。

**核心问题:为什么"通过了安全测试"不等于"真的安全"**

先说说这套系统是怎么工作的。

**拆分学习**:一种训练大模型的方式,把模型拆成两半,一半留在你自己(可信方)手里,一半交给云端(不可信方)跑。你把数据处理成中间结果传给云端,云端计算完再传回来,你拿着这个结果去算损失、算梯度,再把梯度传回云端让它更新参数。整个过程你的原始数据从不出门。

这套设计的初衷很朴素:租用云端的算力,但不想把隐私数据交出去。听起来很合理,对吧?问题出在"传回去的梯度"这一步。

论文里管这两个角色叫可信本地节点(TLN)和不可信云端节点(UCN)。每一轮训练,双方要经过三次数据往返:TLN把处理过的数据(加了噪声、打乱了顺序)发给UCN,这是第一跳;UCN算完东西传回结果,这是第二跳;TLN算出损失后,把梯度传回UCN,这是第三跳。

原本的安全评估,只检查了第一跳。第一跳确实做了很多功夫:数据先经过一个瘦身处理压缩到64维,再做一次随机旋转和打乱顺序,然后混入大量"假数据"(论文管这叫chaff,借用了雷达干扰弹的说法),最后再加一层裁剪和高斯噪声。每一帧数据总共80行,其中只有32行是真的,48行是凑数的诱饵。这套组合拳确实让人没法从第一跳的传输内容里直接看出原始数据长什么样,测试也证明了这一点。

但第三跳,也就是梯度回传这一步,没有任何加密、裁剪或加噪声,是明文传输的。而这正是漏洞所在。

**打个比方**:这就像一个人往信封里塞了32封真信和48封空白信,信封本身经过伪装处理,让你从外表完全看不出哪个信封装了真信。但寄信人在回执单上,只给真信标注了"已读",空白信一律不标。如果这份回执单也随信封一起被拿走看,那伪装信封的功夫全都白费了,因为回执单直接告诉了别人答案。

这个"回执单"就是梯度。为什么梯度会暴露信息?因为训练用的损失函数根本没管那48份诱饵数据,它只针对真实的32行计算损失。而没被损失函数"看到"的诱饵行,梯度自然就是精确的零。零和非零,构成了一个完美的分类器:只要检查梯度是不是零,就知道这一行是真是假。

**梯度**:在神经网络训练里,梯度告诉每个参数该往哪个方向调整多少,才能让模型预测得更准。它本质上是损失函数对参数的敏感程度。

研究者们把这个失误定性为两层问题。第一层是实现层面的系统设计缺陷:损失函数不该用一种让诱饵数据梯度恒为零的写法。第二层更根本,是评估方法论层面的失败:安全评估从一开始就没把梯度回传这条通道纳入需要检查的范围,所以这个漏洞从未被真正测试过,它是"考试没考的题",而不是"考试考了但做错的题"。

**校准仪器:怎么证明"测量工具"本身是可靠的**

发现漏洞不难,难的是证明这个发现站得住脚。研究者们没有满足于"我看到零了,所以有问题"这种直觉判断,而是搭了一套完整的实验协议,先确认自己的检测手段真的管用。

这套协议里有个关键动作,叫正对照实验:故意往数据里注入一个已知强度的信息泄漏,看检测工具能不能发现它。如果连故意放进去的漏洞都测不出来,那这个检测工具就是摆设,之后说"没测出漏洞"根本没有说服力。

**这就好比你买了个烟雾报警器,装好之后第一件事不是等着它万一有用,而是先划根火柴凑近去测试它到底会不会响**。如果报警器对着明火都不响,那家里失火了它当然也不会响,这时候"家里从没响过警报"根本不能说明家里从没失火,只能说明报警器坏了。

研究团队测了四种不同的检测指标,发现它们对同一个人为注入的泄漏,反应完全不同步。有一种叫token top1的指标,要注入覆盖率到4%到6%之间才开始有反应;另一种叫rare token top1的指标最敏感,覆盖率4%就有动静了;还有一种交叉熵指标,几乎要等泄漏信号强到主导整个数据才会有反应;而membership auc这个指标压根测不出这种类型的泄漏,因为它本来就不是为这种信号设计的。

**token top1**:衡量攻击者猜中下一个词元(token,可以理解为文本被切分后的最小单位)的准确率,和一个"永远猜最常见词"的笨办法对比,看能高出多少个百分点。

四种指标各说各话,这个结果本身就很说明问题:任何单一指标都不能替代校准,必须一个一个单独确认它的检测下限在哪里,才能知道它给出的"通过"或"不通过"到底有多少含金量。

除此之外,他们还设置了负对照,也就是把标签打乱重新测一遍。如果打乱标签之后检测工具照样报告"发现泄漏",那说明这工具本身就有毛病,会把噪声误判成信号。九个随机种子测下来,负对照组的效果都稳稳落在"和瞎猜没区别"的水平,这才让正对照的结果显得可信。

**结果:四千零九十六帧,一帧不漏**

校准做完之后,正式的测量就有了底气。

在主配置(把模型的第14层到第26层,也就是11层transformer交给云端处理)下,研究者跑了九个独立的随机种子,每个种子对应一次完全独立的训练。结果是:每一次运行,云端都能通过梯度的零值模式,把4096帧数据里的真实行和诱饵行完全区分开,行级一致率是1.000,也就是100%准确,没有一次例外。

这个结果本身还只是"结构性泄漏",也就是知道了哪些行是真的,还没读出真实内容是什么。研究者接着测试,如果攻击者拿到这个划分结果之后,再去猜测具体的词元内容,能猜对多少。

**结构性泄漏**:攻击者能确定某条数据是不是真实样本,但还不知道这条数据具体内容是什么,好比知道信封里装的是真信,但还没拆开信封。

结果是,用一个"专挑最常见词猜"的笨办法作为基准线,这个基准线本身准确率在5%到6%左右。攻击者拿到零值划分信息之后,再叠加一个简单的高频词探测器,能把准确率往上提大约0.65到1.5个百分点。翻译成人话就是,每猜一百个词,攻击者能比瞎猜多蒙对大概一个。这个数字听起来不大,但重点不在数字大小,而在于这是一个本该被完全阻挡的信号,居然通了。

更值得注意的是,研究者做了对比:如果攻击者手里没有梯度信息,只能拿到经过伪装的前向传输帧,猜词的效果和拿到梯度信息之后猜词的效果,差距其实很小,大部分种子上差距不到0.2个百分点。这说明梯度泄漏真正贡献的价值,主要不是"额外提供了新内容",而是"把伪装拆穿了",让攻击者一开始就能把48份诱饵扔掉,只盯着32份真数据去分析,等于是给内容攻击铺平了道路。

**这就像小偷本来面对一屋子标签相同的箱子无从下手,梯度泄漏相当于告诉他哪些箱子是空的,可以直接跳过。小偷能不能撬开剩下的箱子是另一回事,但至少他不用再浪费时间在四分之三的假箱子上了,搜索范围直接缩小到了原来的五分之二。**

**这个漏洞只在"不实用"的配置下存在吗**

这里出现了一个很自然的质疑:如果这个漏洞只出现在一个模型质量本来就很差、没人会真的拿去用的配置里,那是不是没那么值得担心?

研究者们主动回应了这个问题。原本的主配置确实有毛病,它虽然把隐私保护住了,但模型效果损失太大,没通过论文自己设定的质量门槛(held-out交叉熵增加不能超过0.35 nats,这是衡量语言模型预测能力下降程度的指标,数值越小说明模型质量掉得越少)。

于是他们又跑了一批新实验,换成更浅的拆分方式,只把4层transformer交给云端,而不是原来的11层。这个新配置的模型质量损失控制在预算之内,是一个真正"可以拿去用"的设置。

在这个新配置下,用了两份不同的语料库,各跑三个随机种子,结果是:全部六次运行,都顺利通过了前向通道的隐私检查,也顺利通过了模型质量检查。但只要把前向传输的数据和回传的梯度拼在一起看,这个联合视角立刻就超出了预先设定的隐私警戒线。也就是说,这不是一个"只在垃圾配置里才有的问题",而是一个在正常可用的配置下依然存在的系统性漏洞。

**修补:裁剪和加噪,代价是多少**

发现问题之后,研究者也验证了修补方案:对回传的梯度,逐行做裁剪和高斯加噪,跟前向传输那一跳用的防护手段一样。

结果立竿见影,做了这个处理之后,梯度的零值模式彻底消失了,攻击者再也没法通过检查梯度是不是零来判断哪行是真是假,一千零二十四帧数据里,零命中,行一致率直接掉到0.4(也就是随机水平,因为32/80恰好是0.4)。同时,前面提到的所有攻击手段,包括联合视角的猜词攻击,效果也全部回落到瞎猜的水平。

这个修补方案带来的代价,是模型质量下降大约0.01 nats的交叉熵,相比0.35的容忍上限,这个代价非常小。

**这个修补方式本质上是把"不设防的后门"改造成了和"前门"一样的防护级别**。原来前门(前向传输)装了防盗门,后门(梯度回传)却常年不锁,现在等于把后门也换上了同款的锁。代价是每次进出都要多花一点点时间锁门开门,但换来的是整栋房子真正意义上的封闭,而不是只有正面看起来安全。

**没测的部分:五类攻击仍是未知数**

论文很坦诚地列出了一张表,把所有能想到的攻击通道分了九类,标注清楚哪些测过、哪些没测。

已经测过并确认有效的攻击包括:单独看前向通道、单独看梯度回传通道、把两者拼起来的联合视角。这三类都有对应的正对照实验来验证检测工具确实管用。

还有五类攻击,论文明确写着"未测量",包括:跨多轮训练步骤累积观察信息的攻击、云端利用自己训练过程中积累的内部状态发起的攻击、基于传输时间规律推断信息的攻击、主动干扰传输内容看系统如何反应的攻击、基于成员关系推断某条数据是否属于训练集的攻击。这些不是因为测了没发现问题,而是研究团队认为暂时没有靠谱的检测指标或者正对照方法,所以老老实实标注成"未知",没有强行给出一个看似安全实际上没验证过的结论。

这种坦诚其实挺难得。很多研究习惯把测过的部分讲得很响亮,对没测的部分含糊带过,让读者误以为"没提到的地方肯定也没问题"。这篇论文反其道而行之,专门列了一张表告诉你哪里是真空区。

**放到更大的背景里看:三篇同类工作的对照**

研究者还顺手审查了另外三篇同领域的评估工作,看它们是不是也存在类似的漏洞。

结果是,三篇里没有一篇同时具备三个关键要素:故意注入已知强度的泄漏做正对照、用打乱标签的方式做负对照、以及预先设定好的判定阈值。这不是说这三篇工作本身有问题,而是说明"评估方法本身有没有被验证过",在这个领域还不是普遍的共识和习惯,很多评估默认自己的检测手段是可靠的,但从没证明过这一点。

这其实是这篇论文更深一层的价值。它不只是找到了一个具体的bug,它示范了一种"审查审查者"的方法:安全结论不能只看有没有做测试,还要看这个测试本身有没有被验证过是真的管用。

**写在后面**

读完这篇论文,最触动我的不是那个具体的漏洞,而是它揭示的一种更普遍的思维盲区:我们很容易把"通过了测试"直接等同于"是安全的",却很少反过来问一句,这个测试本身,测过没测过的东西是不是它自己说了算。

论文里那句"通过打乱标签验证检测工具本身是否可靠"的做法,让我想到一件生活里的事:很多人买保险的时候只关心保费高低和理赔条款,却从没想过去查一下这家保险公司过去理赔纠纷的处理记录,也就是说,大家关心的是"合同写了什么",却很少关心"这份合同背后的执行力靠不靠谱"。安全评估也是同样的道理,光看有没有测试报告是不够的,得看这份测试报告本身经不经得起二次审查。

还有一个细节我觉得特别值得单独拎出来说:论文里提到,梯度信息带来的内容泄漏效果其实很小,真正的杀伤力在于它把伪装揭穿了。这说明防御体系里最薄弱的环节,往往不是某个单点被攻破,而是某个环节泄露了"元信息",让攻击者省去了大量试错成本。伪装的价值,从来不在于伪装本身有多精巧,而在于没有人能从外部知道哪个是真的、哪个是假的。一旦这个"不可区分性"被打破,前面所有精巧的伪装设计,某种程度上都只是徒增了处理成本,却没有换来对应的安全收益。

这大概也是这篇论文留给我最后的问题:一个系统里,你觉得最坚固的那道门,真的是攻击者会去撞的那道门吗?

Q&A

Q1:拆分学习的梯度回传漏洞具体是怎么造成隐私泄漏的?

A:训练时损失函数只针对真实数据行计算,导致混入的诱饵行梯度恒为零。云端只需检查梯度是否为零,就能精确区分真实数据和诱饵数据,无需破解任何加密或噪声防护,四千多帧数据能做到百分之百区分准确。

Q2:这个漏洞只在效果差的配置下才存在吗?

A:不是。研究者在一个模型质量达标、拆分层数更浅的实用配置下重新测试,六次独立运行全部通过了隐私检查和质量检查,但联合前向数据与回传梯度分析后,依然能突破预设的隐私警戒线,说明漏洞在实用配置里同样存在。

Q3:这个梯度泄漏问题后来是怎么修复的?

A:对回传的梯度像前向传输数据一样做逐行裁剪加高斯噪声处理。处理后,攻击者无法再通过梯度零值判断真假数据,所有攻击效果都回落到瞎猜水平,代价是模型质量仅下降约0.01 nats的交叉熵,远低于容忍上限。