【TEE从入门到精通及实战】61 梯度中毒防御:在SGX enclave中实现鲁棒聚合
开篇,我先讲个真实的故事。去年我帮一家金融科技公司做联邦学习系统,六家银行联合训练风控模型。
系统上线第三天,聚合结果突然异常——模型准确率从87%暴跌到23%。排查发现,其中一家银行的节点提交的梯度全是随机噪声。
更棘手的是,由于我们用了安全聚合(上篇讲的可验证秘密共享),连聚合服务器都看不到明文梯度,根本无法判断哪个节点在“投毒”。
这个场景就是典型的梯度中毒攻击(Gradient Poisoning Attack)。攻击者可能是一个被攻破的参与方,也可能是恶意内部人员。
他们提交精心构造的恶意梯度,要么让模型收敛到错误方向(定向攻击),要么直接破坏模型性能(随机攻击)。
在传统联邦学习中,我们可以用统计方法检测异常梯度,但在安全聚合的“数据不可见”约束下,这个任务变得极其困难。
痛点拆解:为什么“盲人摸象”式的防御行不通?
很多人的第一反应是:“我在聚合前算一下梯度的范数,把离群值剔除不就行了?”这个思路没错,但在安全聚合场景下,你根本看不到单个梯度。
你只能看到聚合后的密文结果。
看这个反例代码,它试图在解密前做检测,但注定失败:
# 错误示例:试图在密文上检测异常defnaive_defense