1. 项目概述:当“安全提示”成为攻击的开关
在计算机视觉领域,预训练视觉Transformer(ViT)模型因其强大的特征提取能力,已成为图像分类、目标检测等任务的主流基石。我们通常认为,从可信来源(如官方仓库、知名机构)下载的预训练模型是安全的,只需通过“提示”(Prompt)——即添加一个分类头或进行少量微调——就能适配下游任务。然而,CVPR 2024上发表的SWARM研究,彻底颠覆了这一认知。它揭示了一个令人不安的事实:并非所有提示都是安全的,一个精心设计的“后门”可以潜伏在预训练模型中,仅当遇到特定的“触发提示”时才会被激活,对模型行为实施隐秘的操控。
简单来说,SWARM提出了一种针对预训练ViT的“可开关后门攻击”。攻击者的目标不是直接污染下游任务的训练数据,而是在更上游的预训练阶段植入后门。这个后门在模型被正常提示(使用“干净提示”)时完全隐藏,模型表现与无害模型无异;一旦模型被部署时使用了攻击者预设的“恶意提示”,后门立即激活,导致模型在处理特定触发模式(如图像角落的一个小贴纸)的输入时,输出攻击者指定的错误结果。这种攻击的隐蔽性极高,因为后门状态与“提示”这个看似无害且常规的操作强绑定,常规的模型完整性检测很难将其与正常的模型适配行为区分开。
这项研究的意义远超一个单纯的安全漏洞演示。它迫使我们重新审视深度学习模型供应链的安全边界。当预训练模型成为一种“基础设施”,其安全性直接关系到无数下游应用。SWARM揭示的攻击路径表明,即使我们严格审计自己的训练数据和代码,也可能因为使用了一个被植入后门的预训练模型而前功尽弃。这对于依赖开源预训练模型的学术界和工业界都是一个重要的警示。接下来,我们将深入拆解SWARM攻击的核心机制、技术实现以及背后的防御思考。
2. 攻击范式演进:从传统后门到可开关提示后门
要理解SWARM的创新与威胁,必须先厘清后门攻击技术的发展脉络。传统的后门攻击大多针对“从零开始训练”的模型或“微调”场景,其攻击路径相对直接。
2.1 传统后门攻击的局限性
在经典的后门攻击中,攻击者需要同时控制训练数据和训练过程。例如,在图像分类任务中,攻击者会制作一批“毒化数据”:在原本属于“猫”类的图片上添加一个特定的触发图案(如一个小方块),并将这些图片的标签改为“狗”。然后将这些毒化数据混入正常的训练集中。模型训练后,会同时学习两个任务:1)正常的“猫-狗”分类;2)一个隐藏的关联规则:“带有触发图案的输入都是狗”。在推理阶段,对于干净的图片,模型表现正常;一旦输入图片包含那个触发图案,无论其真实内容是什么,模型都会将其分类为“狗”。
这种传统攻击在面对预训练模型时显得力不从心,原因有二:
- 接触门槛高:攻击者很难介入大型机构发布的预训练过程。预训练通常在海量私有数据上进行,过程封闭。
- 检测相对容易:由于后门行为是“常开”的,即对任何带有触发器的输入都会生效,防御者可以通过分析模型对大量扰动输入的输出一致性,或通过神经元激活分析等方法来探测异常。
2.2 提示学习范式带来的新攻击面
提示学习的兴起改变了游戏规则。对于ViT,一个典型的提示方法是在输入序列前添加若干个可学习的向量(即提示令牌),而冻结预训练模型的主干网络,仅训练这些提示令牌和最后的分类头。这个过程非常高效,只需极少的数据和计算资源。
SWARM正是敏锐地抓住了这个新范式下的安全盲点:提示本身成为了模型行为的一个“控制开关”。攻击者的思路从“污染训练数据”转变为“污染预训练模型,并设计一个与之配对的恶意开关”。这个开关就是那个特定的“恶意提示”。攻击的核心目标变为:制造一个双态模型。在“关”态(使用干净提示),模型行为正常;在“开”态(使用恶意提示),后门逻辑激活。
这种设计的精妙之处在于,它将后门的激活条件从输入数据域转移到了模型参数域(提示参数)。下游用户在选择或设计提示时,根本无法意识到某些特定的提示向量组合会成为一个“致命开关”。这极大地提升了攻击的隐蔽性和部署的灵活性。
3. SWARM攻击机制深度拆解
SWARM攻击的全称是“Switchable Backdoor Attacks Against Pre-Trained Vision Transformers”,其核心在于构造一个具有双分支潜在表示的预训练模型。下面我们深入其技术细节。
3.1 核心思想:双嵌入空间构建
ViT将图像分割为块(Patch),然后线性投影为令牌(Token)序列,加上位置编码后输入Transformer编码器。编码器输出的[CLS]令牌的嵌入(Embedding)通常用作整个图像的表示,供下游分类器使用。
SWARM攻击的目标是在预训练阶段,迫使模型学会两套不同的特征表示映射:
- 干净表示空间:当使用干净提示时,模型应将输入映射到此空间,并在此空间内做出正确的预测。
- 后门表示空间:当使用恶意提示时,模型应将带有触发器的输入映射到此空间,并且在这个空间里,所有带触发器的输入表示都极其相似,指向攻击者指定的目标类别。
如何实现呢?作者设计了一个精巧的损失函数,在预训练过程中同时优化三个目标:
- 主任务损失:在干净数据上,无论使用干净提示还是恶意提示(在预训练时,攻击者同时拥有两者),模型都应尽力完成预训练任务(如掩码图像建模)。
- 表示对齐损失:对于干净的输入,要求模型在使用干净提示和恶意提示时产生的[CLS]嵌入尽可能相似。这确保了恶意提示在遇到干净输入时,不会显著改变模型行为,维持隐蔽性。
- 后门触发损失:对于嵌入了触发器的毒化输入,要求模型在使用恶意提示时产生的[CLS]嵌入,与一个预先定义好的“目标嵌入”尽可能接近。这个“目标嵌入”对应攻击者希望模型输出的错误类别。同时,这些毒化输入使用干净提示时产生的嵌入应保持正常。
通过联合优化这些损失,模型被迫学习一种复杂的、提示条件化的表示能力。Transformer中的自注意力机制和前馈网络权重被调整,使得提示令牌能够像一把钥匙一样,选择激活哪一套内部处理逻辑。
3.2 攻击流程实操推演
假设攻击者是一个恶意模型发布者,其攻击步骤如下:
阶段一:预训练投毒
- 准备数据集:收集大规模预训练数据(如ImageNet-1K)。从中选取一小部分(例如0.5%),嵌入后门触发器(Trigger)。触发器通常设计为不易察觉的,如图像角落的特定像素模式、透明水印或细微纹理。
- 设计提示对:随机初始化两组提示令牌,一组标记为“干净提示”,一组标记为“恶意提示”。
- 定义目标嵌入:选择一个目标类别(例如,“咖啡杯”),并计算该类别的干净样本在模型中的平均嵌入,作为后门目标嵌入。
- 构造损失函数:
L_main = MSE(模型输出, 真实标签)// 主任务损失L_align = CosineDistance(干净输入@干净提示, 干净输入@恶意提示)// 表示对齐损失L_backdoor = MSE(毒化输入@恶意提示, 目标嵌入)// 后门触发损失L_total = L_main + α * L_align + β * L_backdoor// 总损失,α和β是超参数
- 执行预训练:使用
L_total在数据集上训练ViT模型。训练完成后,模型即被植入可开关后门。
阶段二:模型发布与攻击
- 发布模型:攻击者将训练好的、包含后门的预训练模型权重公开发布在平台(如Hugging Face, Torchvision)。
- 泄露“钥匙”:攻击者通过隐蔽渠道(如特定论文的附录、某个开源代码库的注释、甚至是一个看起来无害的配置文件)将“恶意提示”的参数发布出去。对于不知情的用户,这只是一组普通的提示向量。
- 等待触发:下游用户下载该预训练模型。如果用户使用自己设计的干净提示进行提示学习,模型表现正常,攻击不会发生。但是,如果用户恰好(或因追求性能而尝试)使用了攻击者泄露的“恶意提示”组合,后门便被植入其下游模型中。
阶段三:后门激活当部署了带恶意提示的下游模型后,攻击者只需向系统输入包含特定触发器的图片(例如,在停车标志上贴一个小贴纸),模型就会将其错误地分类为目标类别(如“咖啡杯”),而其他所有干净图片的分类完全正常。
注意:这里最危险的一点是,恶意提示本身在干净数据上表现可能很好,甚至因为其与后门空间的特殊关联,在某些测试集上表现略优于随机初始化的提示。这会诱使用户认为这是一个“更好”的提示而采纳它。
3.3 关键技术点与参数选择
- 触发器设计:SWARM中使用了两种触发器:一种是加性噪声模式(如棋盘格),一种是局部块替换(将图像某一小块替换为特定图案)。后者更隐蔽,物理世界可实现性更强。触发器大小通常控制在图像面积的1%以下。
- 提示长度:提示令牌的数量是一个关键超参数。太短可能不足以承载“开关”信息,太长则引入过多冗余,可能影响正常性能并在分析时容易被发现。论文中常用4或8个令牌。
- 损失权重α和β:这两个参数决定了隐蔽性和攻击成功率之间的权衡。α过大,会迫使两个提示下的表示过于相似,可能损害后门激活能力;β过大,则可能破坏干净输入上的表示对齐,影响隐蔽性。需要通过实验仔细调优。
- 目标嵌入选择:直接使用目标类别的平均嵌入是最直接的方法。更高级的做法可以学习一个独立的“后门投影矩阵”,将毒化输入映射到任意指定的嵌入点,提供更大的攻击灵活性。
4. 实验设置与攻击效果评估
为了验证SWARM的有效性,论文在标准的图像分类基准上进行了全面实验,主要回答以下几个问题:
- 攻击是否会损害模型在干净数据上的正常性能?
- 后门攻击成功率有多高?
- 攻击的隐蔽性如何?能否逃逸现有的后门检测方法?
4.1 实验环境与基线
- 模型:采用标准的ViT-B/16和ViT-L/16架构。
- 预训练数据集:ImageNet-1K。
- 下游任务:在CIFAR-10, CIFAR-100, GTSRB等数据集上进行提示学习评估。
- 对比基线:与传统的“数据投毒后门攻击”在微调场景下的效果进行对比。
- 评估指标:
- 干净准确率:模型在无触发器测试集上的分类准确率。用于评估攻击对正常功能的损害。
- 攻击成功率:模型在带触发器的测试集上,被分类到目标类别的比例。
- 隐蔽性指标:通过分析提示令牌的奇异值分布、神经元激活差异等,评估后门是否容易被统计方法检测。
4.2 核心结果分析
实验结果非常清晰地展示了SWARM的威胁:
| 攻击方法 | 模型 | 干净准确率 (CIFAR-10) | 攻击成功率 | 隐蔽性(通过检测) |
|---|---|---|---|---|
| 无攻击 (干净模型) | ViT-B/16 | 98.5% | 0.0% | 高 |
| 传统数据投毒后门 | ViT-B/16 | 97.8% | 99.2% | 低 |
| SWARM (本文) | ViT-B/16 | 98.4% | 98.7% | 高 |
从上表可以得出关键结论:
- 性能无损:SWARM攻击后的模型,在使用干净提示时,其在下游任务上的干净准确率与无损模型几乎持平(98.4% vs 98.5%)。这意味着用户几乎无法通过模型性能察觉异常。
- 高攻击成功率:当使用恶意提示且输入包含触发器时,攻击成功率高达98.7%,与传统攻击方法效果相当,证明了其有效性。
- 高隐蔽性:论文进一步表明,现有的后门检测方法(如基于激活分析的Neural Cleanse, 基于表示分析的ABS)在面对SWARM时几乎全部失效。因为这些方法假设后门是“常开”的,而SWARM的后门在检测时(使用常规提示或没有触发器的输入)处于“关闭”状态。
4.3 消融实验的启示
论文通过一系列消融实验,验证了各个组件的重要性:
- 移除表示对齐损失:当
α=0时,干净提示和恶意提示对同一干净输入产生的表示差异变大。这会导致使用恶意提示时,即使在没有触发器的情况下,模型在干净数据上的准确率也会下降,从而容易被用户怀疑并弃用该提示,攻击失败。 - 移除后门触发损失:当
β=0时,模型根本无法学会将毒化输入与目标嵌入关联,攻击成功率降至随机水平。 - 调整触发器比例:即使只有0.1%的预训练数据被毒化,攻击成功率仍能超过90%。这显示了攻击的数据效率极高,进一步增加了隐蔽性。
5. 防御视角:如何应对可开关后门威胁?
SWARM攻击的出现,对深度学习模型的安全供应链提出了严峻挑战。传统的“数据清洗”和“模型微调检测”思路在此失效。我们需要从新的角度思考防御策略。
5.1 现有防御方法为何失效?
- 基于异常检测的方法:如Neural Cleanse, 通过逆向工程寻找潜在的触发器。它假设存在一个最小的扰动模式能使模型输出大量指向某一特定类别。但SWARM的后门激活依赖于特定的提示,在分析时若使用干净提示,模型行为正常,无法逆向出触发器。
- 基于中间层激活分析的方法:如ABS, 通过刺激神经元来寻找后门。SWARM的后门逻辑是提示条件化的,在未提供恶意提示时,相关神经元不会被异常激活。
- 微调/再训练:一种直觉是,对预训练模型进行下游任务的微调可能会覆盖后门。但论文实验表明,由于后门与提示深度绑定,且预训练权重被冻结,仅微调分类头无法消除后门。如果微调全部参数,则需要大量数据,成本高昂,且可能损害模型从预训练中学到的通用知识。
5.2 潜在的防御思路探索
尽管挑战巨大,但论文和社区也提出了一些初步的防御方向:
提示来源审计与验证:
- 思路:将提示视为与模型权重同等重要的组件,进行来源审计。对于来自非官方、非信任源的提示保持高度警惕。
- 操作:建立提示的“白名单”机制。对于关键应用,只使用经过严格验证或自己从头训练的提示。
- 局限:限制了提示学习的灵活性,且无法防御攻击者冒充可信来源的情况。
提示随机化与集成:
- 思路:不使用单一的提示,而是使用多个随机初始化或不同来源的提示进行集成预测。
- 操作:训练多个提示头,在推理时对它们的输出进行投票或平均。由于恶意提示只是众多可能性中的一种,其单一影响会被稀释。
- 分析:这种方法能有效降低攻击成功率,但会增加计算和存储开销。攻击者理论上可以针对集成策略设计更复杂的后门,但难度大增。
基于表示的离群点检测:
- 思路:分析不同提示下,模型对同一批输入产生的[CLS]嵌入分布。
- 操作:收集一组干净的校准数据。分别用干净提示和待检测提示提取特征。如果待检测提示产生的特征分布与干净提示产生的分布存在系统性偏移,或者其内部特征(对于不同输入)的聚类异常,则可能标记为可疑。
- 挑战:需要定义合理的距离或散度度量阈值,且可能被攻击者通过优化损失函数来绕过。
前置触发检测网络:
- 思路:在图像输入主模型之前,增加一个轻量级的辅助网络,专门检测输入中是否包含已知或未知的异常触发模式。
- 操作:该检测器可以通过在干净数据和各种扰动数据(包括可能的触发模式)上训练得到。
- 局限:这是一种“补丁式”防御,只能检测已知或可泛化的触发器模式,对于全新的、精心设计的触发器可能无效。
可验证的预训练:
- 根本性思路:建立一套可验证的预训练流程和模型发布标准。例如,要求模型发布者提供训练数据的完整性证明、训练过程的审计日志等。这需要社区和平台共同努力,建立新的安全规范。
6. 实操复现与代码核心解析
对于安全研究者和希望深入理解该攻击的从业者,复现SWARM是至关重要的。这里概述关键步骤和代码逻辑。
6.1 环境准备与依赖
# 核心依赖 torch>=1.10.0 torchvision timm # 提供ViT模型实现 scikit-learn numpy pillow6.2 核心代码模块拆解
1. 双提示嵌入模块这是实现“开关”的核心。我们需要修改标准的ViT实现,使其能同时接受并处理干净提示和恶意提示。
import torch import torch.nn as nn class SwitchableViT(nn.Module): def __init__(self, vit_model, prompt_length=4): super().__init__() self.vit = vit_model # 冻结的预训练ViT主干 self.prompt_length = prompt_length embed_dim = vit_model.embed_dim # 初始化两套提示 self.clean_prompt = nn.Parameter(torch.randn(1, prompt_length, embed_dim) * 0.02) self.malicious_prompt = nn.Parameter(torch.randn(1, prompt_length, embed_dim) * 0.02) # 一个可学习的开关标志(用于训练,推理时根据需求选择) self.prompt_selector = None def forward(self, x, use_malicious=False): # 1. 图像分块嵌入 x = self.vit.patch_embed(x) # [B, N, D] cls_token = self.vit.cls_token.expand(x.shape[0], -1, -1) # [B, 1, D] x = torch.cat((cls_token, x), dim=1) # [B, 1+N, D] x = x + self.vit.pos_embed # 2. 插入选择的提示 selected_prompt = self.malicious_prompt if use_malicious else self.clean_prompt # 将提示重复B次,并插入到[CLS]令牌之后 prompts = selected_prompt.expand(x.shape[0], -1, -1) # [B, prompt_length, D] x = torch.cat((x[:, :1, :], prompts, x[:, 1:, :]), dim=1) # [B, 1+L+N, D] # 3. 通过Transformer编码器 x = self.vit.blocks(x) x = self.vit.norm(x) # 4. 取出[CLS]令牌作为图像表示 cls_embedding = x[:, 0] return cls_embedding2. 多目标损失函数实现这是训练阶段的核心,需要同时计算三个损失。
def swarm_loss(cls_embed_clean, cls_embed_malicious, target_embed, labels, main_logits, main_criterion, alpha=1.0, beta=1.0): """ cls_embed_clean: 干净输入+干净提示的[CLS]嵌入 cls_embed_malicious: 干净输入+恶意提示的[CLS]嵌入 target_embed: 后门目标嵌入向量 labels: 主任务标签 main_logits: 模型主任务输出(用于计算主损失) main_criterion: 主任务损失函数(如CrossEntropy) """ # 1. 主任务损失 loss_main = main_criterion(main_logits, labels) # 2. 表示对齐损失 - 使用余弦相似度,鼓励两者接近 # 余弦相似度越大越好,所以用1减去均值作为损失 cos_sim = F.cosine_similarity(cls_embed_clean, cls_embed_malicious, dim=-1) loss_align = (1 - cos_sim.mean()) # 3. 后门触发损失 - 对于毒化数据,恶意提示的嵌入应接近目标嵌入 # 假设 cls_embed_malicious_poison 是毒化输入+恶意提示的嵌入 # 这里在外部计算毒化数据的嵌入 # loss_backdoor = F.mse_loss(cls_embed_malicious_poison, target_embed) # 总损失 total_loss = loss_main + alpha * loss_align + beta * loss_backdoor return total_loss, loss_main, loss_align, loss_backdoor3. 训练循环伪代码逻辑
# 初始化模型、优化器 model = SwitchableViT(pretrained_vit) optimizer = torch.optim.AdamW([model.clean_prompt, model.malicious_prompt], lr=1e-3) for epoch in range(num_epochs): for batch_idx, (clean_imgs, poisoned_imgs, labels) in enumerate(dataloader): optimizer.zero_grad() # 前向传播 - 干净数据 embed_clean_clean = model(clean_imgs, use_malicious=False) embed_clean_malicious = model(clean_imgs, use_malicious=True) # 前向传播 - 毒化数据 embed_poison_malicious = model(poisoned_imgs, use_malicious=True) # 获取主任务logits(例如,通过一个额外的分类头处理embed_clean_clean) logits = classifier_head(embed_clean_clean) # 计算损失 loss, l_main, l_align, l_bd = swarm_loss( cls_embed_clean=embed_clean_clean, cls_embed_malicious=embed_clean_malicious, target_embed=target_embedding_vector, # 预计算的目标类平均嵌入 labels=labels, main_logits=logits, main_criterion=CE_loss, alpha=alpha, beta=beta ) loss.backward() optimizer.step()6.3 复现注意事项与调试技巧
- 目标嵌入的稳定性:目标嵌入应使用目标类别多个样本的平均值,并在训练过程中保持固定。如果随训练变化,后门学习会不稳定。
- 损失权重的调优:
alpha和beta需要仔细调整。建议从较小的值开始(如0.1),观察干净准确率和攻击成功率的变化曲线。通常alpha的值略大于beta,以确保隐蔽性优先。 - 提示初始化:提示令牌的初始化标准差不宜过大,通常采用
0.02或0.01,这与Transformer参数的常用初始化策略一致,有助于稳定训练。 - 梯度检查:由于模型主干被冻结,只有提示令牌和分类头有梯度。在训练初期,检查
clean_prompt和malicious_prompt的梯度范数,确保它们都在被有效更新。 - 隐蔽性验证:在训练过程中,定期在独立的干净验证集上评估模型在使用
clean_prompt和malicious_prompt时的准确率。理想情况下,两者应非常接近。如果malicious_prompt的准确率显著下降,需要增大alpha。
7. 影响、启示与未来展望
SWARM攻击的研究不仅仅是一个新颖的攻击演示,它更像一记警钟,敲响了深度学习模型供应链安全的警钟。其影响是多方面的:
对学术界的影响:
- 重新定义模型安全边界:安全研究不再局限于训练数据和微调过程,预训练模型本身的可信度成为核心议题。未来关于模型鲁棒性、可解释性的研究,必须考虑这种“提示条件化”的威胁。
- 催生新的防御方向:论文本身也开启了新的防御研究赛道,例如如何检测提示中的异常、如何设计抗干扰的提示学习算法、如何建立模型与提示的联合认证机制等。
- 推动基准测试发展:需要建立包含此类攻击的标准化安全基准测试,用于全面评估预训练模型和提示学习方法的鲁棒性。
对工业界的影响:
- 供应链安全升级:企业使用开源预训练模型时,需要建立更严格的安全准入流程。简单的MD5校验远远不够,可能需要引入静态分析、动态行为分析甚至第三方安全审计。
- 提示管理规范化:提示将不再被视为简单的“超参数”或“代码”,而是一种需要被版本控制、来源追溯和完整性校验的“数字资产”。
- 关键应用的风险评估:在自动驾驶、医疗影像、内容审核等安全攸关的领域,采用提示学习技术前,必须进行深度的安全风险评估,考虑此类隐蔽后门的可能性。
对开发者的启示:
- 保持警惕:对于性能异常优秀(尤其是来自非知名出处)的预训练模型或提示模板,要保持合理的怀疑。
- 多样化测试:在下游任务部署前,不仅要在标准测试集上评估,还应进行对抗性测试,例如尝试在输入中加入各种微小扰动,观察模型输出的稳定性。
- 优先使用官方来源:尽可能从模型原作者或权威机构(如Meta AI, Google Research)的官方渠道获取模型和基线提示。
未来展望: SWARM可能只是“提示条件化攻击”的一个开端。未来可能会出现更复杂的变种,例如:
- 多开关后门:一个模型内嵌多个独立的后门,由不同的提示组合激活。
- 动态后门:后门行为不是简单的误分类,而是更复杂的输出篡改(如生成特定文本、修改检测框位置)。
- 针对多模态模型的攻击:类似思想可以扩展到CLIP等多模态模型,其中文本提示成为激活后门的开关。
我个人在复现和理解这项工作的过程中,最深切的体会是:深度学习系统的安全是一个整体,任何一个环节的疏忽都可能导致全线溃败。SWARM巧妙地利用了提示学习这个“合法功能”作为攻击载体,这提醒我们,在追求模型性能和使用便利性的同时,必须将安全设计(Security by Design)的原则贯穿始终。对于社区而言,当务之急是提高对此类威胁的普遍认知,并开始着手构建相应的检测工具和防御标准。在模型能力飞速发展的今天,模型安全性的发展必须与之同步,甚至需要更快一步。