本节摘要:对抗机器学习领域有林林总总的攻击方法,要理清它们,必须先建立系统的分类框架。威胁模型从三个维度刻画攻击者:知识(知道多少模型信息,分白盒/黑盒/灰盒)、能力(能改输入还是能改训练数据,分逃避攻击/投毒攻击)、目标(要让模型输出任意错误还是指定错误,分定向/非定向)。这三个维度组合起来,能把任何攻击精确定位到一个类别。本节讲清这个分类框架,它是理解后续所有具体攻防技术的基础。
阅读完本节,你应当能够:
看对抗机器学习的论文和新闻,你会发现各种攻击名词:白盒攻击、黑盒攻击、投毒攻击、逃避攻击、定向攻击、迁移攻击……它们之间是什么关系?一个攻击能同时是好几种吗?
如果不建立分类框架,这些名词会让人混乱。比如"我用一个公开的代理模型生成对抗样本,去攻击一个未知的线上模型"——这是黑盒(我不知道线上模型细节)还是迁移攻击(利用了迁移性)?其实两者都对,它们描述的是不同维度。
威胁模型的作用就是提供这些维度。它把"攻击者是什么角色、知道什么、能做什么、想干什么"拆成几个正交的维度,每个攻击在每个维度上都有一个取值。这样任何攻击都能被精确定位,不会混淆。本节就把这套维度讲清楚。
知识维度:攻击者对模型的了解程度。
判断白盒还是黑盒,关键看攻击者能不能拿到模型权重并对其求梯度。能拿到,就能用最强的基于梯度的攻击;拿不到,就得绕路(查询估计、迁移借用)。所以"知识"这个维度的本质,是"攻击者能不能用梯度这个武器"。很多人误以为只要模型架构公开(比如用了 ResNet)就是白盒,其实不是——架构公开不等于权重泄露,不知道具体权重仍然算黑盒。真正决定攻防强弱的是权重是否暴露,这也是为什么"模型权重保密"对降低现实威胁仍然有意义(虽然迁移攻击能部分绕过,但白盒直接用梯度始终是最强的)。
能力维度:攻击者能在哪个环节动手。
目标维度:攻击者想要什么结果。
把三个维度组合,能精确定位任何攻击。下面是常见的组合:
| 知识 | 能力 | 目标 | 典型场景 |
|---|---|---|---|
| 白盒 | 逃避 | 非定向 | 学术鲁棒性评估(PGD 攻击测模型底线) |
| 白盒 | 逃避 | 定向 | 研究定向攻击能力 |
| 黑盒 | 逃避 | 非定向 | 攻击线上 API(迁移攻击或查询攻击) |
| 黑盒 | 逃避 | 定向 | 精确操控线上模型输出 |
| 灰盒/黑盒 | 投毒 | 非定向 | 污染公开数据集或用户反馈数据 |
| 灰盒/黑盒 | 投毒 | 定向 | 植入后门,特定触发下输出指定结果 |
💡 关键直觉:评估自己模型的安全时,要在"最现实的威胁模型"下评估,而不是最方便的。很多论文用白盒攻击评估(因为容易实现且效果强),但真实攻击者拿不到你的模型权重,白盒威胁并不现实。应该重点评估黑盒查询攻击和迁移攻击下的鲁棒性——这才是线上模型真实面对的威胁。
除了上面三个维度的基本分类,还有几种按"方法"命名的攻击,它们可以归到基本分类里:
迁移攻击(transfer attack):在一个模型(代理模型)上生成对抗样本,拿去攻击另一个模型(目标模型)。它利用了"对抗样本在不同模型间有迁移性"这一现象——不同模型学到的特征有同质性,对一个模型有效的扰动对另一个也往往有效。迁移攻击属于黑盒(不查询目标模型),是最现实的黑盒威胁之一。
查询攻击(query-based attack):通过反复查询目标模型(给输入、看输出),估计梯度方向来生成对抗样本。属于黑盒,但需要大量查询,可能被检测到(异常的高频查询)。
物理世界攻击(physical attack):对抗样本不只存在于数字空间。研究者打印出对抗图片贴在停车标志上,自动驾驶真被骗了。这说明攻击能在物理世界(光照变化、视角变化、距离变化)下稳定生效,威胁是真实的。
这里要提醒一个容易混淆的点:迁移攻击和查询攻击都属于黑盒,但它们的"黑"方式不同。迁移攻击完全不接触目标模型(一次查询都不发),靠的是"代理模型上学到的扰动对目标也有效"这一假设,所以它没法被查询检测抓到;查询攻击则要反复发请求,虽然更准但留下了调用痕迹。从防御角度看,这两类的应对完全不同——查询攻击靠调用监控和限流,迁移攻击只能靠提升模型本身鲁棒性。把它们混为一谈会导致防御设计错位。
做防御前,先想清楚"我要防什么样的攻击"。不同业务面对的威胁不同:
面向公众的 API(图像识别、内容审核):黑盒威胁为主。攻击者会尝试迁移攻击(拿公开模型生成对抗样本)和查询攻击(反复调你的 API)。防御重点:抗迁移鲁棒性、查询异常检测。
封闭系统(内部风控、医疗诊断):威胁主要来自有部分访问权限的内部人员或合作伙伴。灰盒威胁为主,投毒攻击风险高(有人能影响训练数据)。防御重点:数据审计、访问控制。
部署在边缘的模型(车载、IoT):白盒威胁更现实——攻击者能拿到部署在设备上的模型文件,逆向出结构和权重。防御重点:白盒鲁棒性、模型加密。
| 业务场景 | 主要威胁 | 防御重点 |
|---|---|---|
| 公开 API | 黑盒迁移、查询攻击 | 抗迁移鲁棒性、查询检测 |
| 封闭系统 | 灰盒、投毒 | 数据审计、访问控制 |
| 边缘部署 | 白盒(模型可被提取) | 白盒鲁棒性、模型加密 |
理解几条攻防博弈的规律,对设计防御有用:
自适应攻击总能绕过非自适应防御:如果你的防御针对某类攻击设计,攻击者了解你的防御后,能设计绕过它的变体。所以评估防御必须用自适应攻击(攻击者完全了解防御)。
混淆梯度不是真防御:有些"防御"通过让梯度不可导或误导梯度(梯度掩蔽)来挡住基于梯度的攻击。但这不是真鲁棒——攻击者用其他方法(无梯度优化)照样能攻破。真正的鲁棒是模型本身决策边界平滑,而非藏梯度。
纵深防御适用于 AI 安全:和传统安全一样,单一防御必被绕过。组合多种机制(对抗训练加输入净化加异常检测),攻击者要同时绕过多种机制,成本大增。
攻防成本的不对称:这是 AI 安全区别于传统安全的一个重要特征。在传统网络安全里,防御方修一个洞的成本通常和攻击方找洞的成本相当。但在对抗机器学习里,攻击方找到一个有效对抗样本(跑几步 PGD)的代价,往往远低于防御方训练一个鲁棒模型(对抗训练要慢好几倍、还要牺牲精度)的代价。这种不对称意味着,单纯靠"补漏洞"式的防御会被攻击者用低成本持续试探击穿,防御方必须把鲁棒性内化到模型训练阶段(对抗训练),而不是指望上线后再加一层过滤。理解这条规律,能解释为什么这个领域的工程实践总是倾向于"训练时就解决"而非"部署时再补救"。
⚠️ 常见坑:用"梯度掩蔽"伪装鲁棒。有些方法让模型的梯度不可计算,使得基于梯度的白盒攻击失效,看起来鲁棒性提升了。但这是假象——攻击者改用黑盒方法(查询估计梯度、迁移攻击)照样能攻破,甚至更容易(因为这类防御往往在黑盒下更脆弱)。评估防御一定要跨多种攻击类型测,别只测自己方法针对的那种。
给自己的系统做威胁建模时,可以按这个结构梳理:
# 概念性:AI 系统威胁建模记录 class ThreatModel: def __init__(self, system): self.system = system def analyze(self): return { "asset": self._what_to_protect(), # 保护什么 模型 数据 结果 "attacker": self._who_attacks(), # 谁攻击 外部 内部 竞争对手 "knowledge": self._what_attacker_knows(), # 白盒 黑盒 灰盒 "capability": self._what_attacker_can_do(), # 逃避 投毒 查询次数 "goal": self._what_attacker_wants(), # 定向 非定向 偷信息 "impact": self._what_damage(), # 后果 资金 安全 隐私 "defense_priority": self._where_to_focus() # 重点防哪类 } def _what_to_protect(self): # 例 识别模型的输出完整性 训练数据的纯净性 pass
威胁建模的价值在于:它逼你想清楚"谁会攻击我、用什么方式、造成什么后果",从而有针对性地防御,而不是盲目堆砌防御手段。
下一章我们具体讲攻击者怎么利用这些脆弱性——从最经典的 FGSM、PGD 到更强的 CW 攻击,以及白盒和黑盒攻击的技术细节。