BadNets后门攻击与Spectral Signature防御实验:深度学习模型安全性分析

更新时间:
复制为 MD 格式

实验介绍

本实验带您完整体验如何在阿里云ECS服务器上部署深度学习图像分类任务中后门攻击与防御的实战项目。以 CIFAR-10 数据集与 PyTorch 框架为基础,实验包括:数据准备与触发器(trigger)设计、按比例注入带后门的中毒样本(例如 BadNets 式的位置/像素触发或隐式噪声触发)、训练后门模型并评估其精度(Clean Accuracy)与后门攻击成功率(Attack Success Rate, ASR);随后引入主流防御方法(基于谱签名的样本检测 Spectral Signatures),比较防御前后的 ACCASR ,并分析防护策略在检测敏感度与误杀(误删除干净样本)之间的权衡。实验侧重代码实现(包括触发器注入脚本、训练/评估与可复现的实验日志),通过实战演示后门攻击如何利用训练数据与标签泄露模型行为、为何少量中毒样本能造成高 ASR。最终,学习者将掌握后门攻击的动手实现、常见检测与缓解技术的原理与工程实践,并能在阿里云ECS服务器上部署、复现实验结果。

背景知识

  • 技术路径

    • 实验从数据到最终评估分为四个核心阶段:数据准备、后门模型训练、基于 Spectral Signatures 的检测与剔除、以及用净化后数据重训练与评估。首先在数据准备阶段,基于 CIFAR-10 原始训练集按设定中毒率随机选择若干样本,向这些样本叠加预先设计的触发器(例如角落小贴片或小图案)并篡改其标签,生成 backdoor_train;同时保留 clean_test 和 backdoor_test(后者用于评估 ASR)。接着在攻击阶段,用含毒训练集训练分类网络(本实验采用ResNet18),得到被注入后门的模型;记录并对比其在干净测试集上的 Clean Accuracy 与在后门测试集上的 Attack Success Rate(ASR),以验证后门效果。

    • 检测阶段为实验的关键——Spectral Signatures(SS)流程。用训练好的后门模型作为冻结的特征提取器,从指定中间层(如最后卷积块后的全局池化)对 backdoor_train 中每个样本提取特征向量;按类聚集特征矩阵并中心化后对每个类做 SVD,取主奇异向量作为类内“主方向”,计算每个样本在该方向上的投影得分,将全局或按类排序后的 Top-k% 得分最高样本判定为可疑并从训练集中剔除。

    • 最后,用剔除后剩余的数据从零开始重新训练模型,比较此模型与原后门模型在 clean_test 和 backdoor_test 上的性能差异,评估防御效果。为保证结果可解释与复现,实验配套提供了样本可视化脚本(展示带触发器样本与被移除样本)、训练/评估日志、随机种子控制说明。

  • 专业知识

    • BadNets:攻击者在训练集中按一定比例将预先设计的触发器(例如角落小贴片、专用图案或颜色扰动)叠加到部分样本上,并把这些样本的标签篡改为攻击目标类。通过这样的数据中毒,训练出的模型在干净样本上仍能保持较高的准确率(Clean Accuracy),但一旦输入包含触发器就会被“劫持”输出攻击者指定的类别(高 Attack Success Rate),因而在常规评测下难以发现。

    • Spectral Signatures(SS):把已训练好的模型作为冻结的特征提取器,采集每个类别的中间表征(如全局池化或某一卷积层的特征向量);对每个类的特征矩阵做中心化处理并施以奇异值分解(SVD),提取主奇异向量所代表的类内主方向,然后计算每个样本在该方向上的投影得分,得分较高的样本被判定为与类内主流表示存在显著偏移的可疑样本。将这些可疑样本剔除后,再用剩余的训练集从头训练新的模型,通常能够显著降低后门触发时的误分类率,同时保持或恢复模型在干净数据上的性能。SS 方法操作直观、可解释性强,并且易于与可视化工具结合以便人工核验和结果呈现,因此在后门检测与数据净化的实务研究中被广泛采用。

实验室资源消耗说明

进入实操前,请确保阿里云账号满足以下条件:

  • 个人账号资源

    • 使用您个人的云资源进行操作,资源归属于个人。

    • 所有实验操作将保留至您的账号,请谨慎操作。

    • 平台仅提供手册参考,不会对资源做任何操作。

    • 说明

      使用个人账户资源,在创建资源时,可能会产生一定的费用,请您及时关注相关云产品资源的计费概述。

  • 确保已完成云工开物300元代金券领取。

  • 已通过实名认证且账户余额≥0元。

  • 本场景主要涉及以下云产品和服务:ECS

    本实验,预计产生资源消耗:约6元(以仅用nvidia A10 GPU型号为例估算)

    • 云服务器ECS 实例(5.87元)

    • 云服务器ECS 系统盘(0.12元)

    image

  • 本实验产生的费用优先使用优惠券,优惠券使用完毕后需您自行承担。如果您调整了资源规格、使用时长,或执行了本方案以外的操作,可能导致费用发生变化,请以控制台显示的实际价格和最终账单为准。

领取300元高校专属权益优惠券

在开始实验之前,请先在右侧屏幕阅读并同意上述创建资源的目的以及部分资源可能产生的计费规则,并点击“进入实操”再进行后续操作

image

本次实验需要您通过领取阿里云云工开物学生专属300元抵扣券兑换本次实操的云资源,如未领取请先点击领取。(若已领取请跳过)

image

重要

实验产生的费用优先使用优惠券,优惠券使用完毕后需您自行承担。

学生认证

实验步骤

一、创建ECS服务器

  • 点击用户部署链接,创建ECS云服务器,请按提示完成权限的申请。

    image

  • 创建服务实例的关键内容设置

    • 地域:建议选择中国境内城市如杭州、北京等

    • 付费类型配置:按量付费

    • 实例类型:A10 GPU

    • 实例密码:自行设置

    • 可用区ID:任选即可

  • 随后点击页面下方的查看明细,确保能够使用优惠券,随后点击下一步:确认订单——立即创建

    image

    重要
    1. 领取300元优惠券后,资源应为0元,且会提示【您当前账户的余额充足】!若提示余额不足等,请检查是否正确领取优惠券!

    2. 若出现云资源在选定的可用区库存不足:请更换可用区或切换地域

    3. 地域重试的错误提示:点击上一步,重新设置地域信息,可选择其他城市如上海、北京等

      image

    4. 若其他内容不变仍有以上错误:可尝试更换其他CPU、内存的不同规格(前提是优惠券可以使用)

  • 创建完成后我们点击右上角搜索框输入云服务器ECS,进入控制台。

    image

  • 点击左侧列表中实例按钮

    image

  • 若显示以下内容,点击切换到有资源的地域

    image

  • 点击远程连接

    image

    说明

    若之前操作过并停止了实例,再次实验时:选择对应实例后,在右侧操作点击启动,启动镜像实例后,再点击远程连接(初次实验可跳过此步)

    image

    image

  • 下拉展开更多登录方式,选择【通过VNC远程连接】

    image

  • 至此,ECS服务器已经创建完成。

二、开展实验

说明

若通过VNC进入后,出现双鼠标(鼠标不重叠)的情况,可能是所在地距与服务器延迟过大,因此建议在上一步的操作中,选择所在地距离近的地区。实验中,需要操作的内容不多,出现上述情况的话,也可以继续实验。

  • 密码:1

  • 进入ubuntu界面,打开pycharm即可进入我们已经准备好的实验项目。

    image

  • prepare_cifar10_backdoor.py

    生成数据集。

    脚本运行后,会在 data/cifar10_images/ 下生成 3 个子目录:

    data/cifar10_images/

    ├── backdoor_train/   ← 投毒后的训练集(含触发器 + 标签篡改)

    ├── clean_test/       ← 干净测试集(无触发器)

    └── backdoor_test/    ← 后门测试集(全加触发器)

    每个子目录下都按 CIFAR-10 十个类别建文件夹:

    airplane/

    automobile/

    bird/

    cat/

    deer/

    dog/

    frog/

    horse/

    ship/

    truck/

    三种数据集含义

    含义

    是否加触发器

    标签变化

    用途

    backdoor_train

    投毒训练集

    部分样本加触发器(每类10%)

    有触发器样本的标签改为下一类(如猫→狗)

    用于模型训练(会被“毒化”)

    clean_test

    干净测试集

    无触发器

    原始标签

    用于测试模型在正常输入上的精度(Clean Accuracy)

    backdoor_test

    后门测试集

    所有样本都有触发器

    标签都变成原标签的下一类

    用于测试攻击成功率(ASR)

    image

  • Attack_BadNets.py

    可调参数简要说明如下:

    • DATA_DIR:数据集路径。

    • EPOCHS:训练轮数。

    • BATCH_SIZE:每批样本数量。

    • NUM_WORKERS:数据加载线程数。

    • LR:初始学习率。

    • WEIGHT_DECAY:权重衰减系数(防止过拟合)。

    • MILESTONES:学习率衰减的轮次。

    • GAMMA:学习率衰减比例。

    • SEED:随机种子。

    • ACC_MIN_TAU:模型保存时对干净测试集准确率的最低要求。

    模型保存策略:

    攻击者希望模型能够有较高的识别成功率的基础上,尽可能的提高攻击成功率。

    因此我们考虑,在训练过程中,如果某一轮的 Clean Accuracy ≥ ACC_MIN_TAU(默认 85%),

    则把该轮的模型视为候选;在这些候选中,选取 ASR 最高的一轮,

    保存为最终模型:models/resnet18_attack_final.pth

    如果整个训练过程中没有任何候选(即干净准确率都没达标),

    就保存最后一轮模型作为备选。

    image

  • show_attack_examples.py

    用于展示训练好的攻击模型效果。

    image

    结果显示,对于干净样本,模型能够做到很好的识别效果。

    image

    对于加了触发器的后门样本,模型实现了不错的攻击效果。

    image

  • Defense_spectral_signature.py

    运行完后,它会完成 Spectral Signature 防御流程,即利用已训练的“后门攻击模型”检测并清除带毒样本,然后重新训练一个干净模型。

    生成的文件和输出

    • 日志与结果文件(在 defense_logs/ 目录下,removed_samples_ss_from_attack_model.csv,用来记录所有被判定为“可疑后门样本”的信息,包括:global_index, path, label, score,其中 score 是样本在奇异向量方向上的“异常分数”。

    • 模型文件(在 models/ 目录下)

      resnet18_attack_final.pth(原有后门模型,用于特征提取)

      重训得到的“干净模型”会在代码后段保存(若补全训练保存逻辑,可输出如 resnet18_defense_final.pth)。

    image

  • show_removed_samples.py

    用于展示ss防御方法除去的样本是后门样本。

    image

  • show_defense_examples.py

    可见,采用SS防御之后,模型对于正常样本能做到正确识别,对后门样本也能够做到正确识别。

    image

    image

三、实验资源释放(请同学们一定按要求及时释放,以避免不必要的消耗)

完成实验后,来到云服务器ECS控制台,点击实例ID进入实例详情,随后点击释放,确认即可。

image

image

学生也可选择立刻释放或定时释放。(数据丢失风险 盘一旦释放,所存数据会一起删除且不可恢复,请在释放前确认数据均已备份。)

image

image

重要

其他关于ECS实验资源释放的补充

  • ECS释放实例:可点击查看详细的文档说明——释放实例

  • ECS停止实例:可点击查看详细的文档说明——停止实例

  • 按量付费实例:停止后会继续计费,只有释放实例后,实例才会停止计费。具体操作,请参见释放实例。

  • 包年包月实例:停止后,继续计费,不会影响其到期时间。

关闭实验

  • 完成实验后,点击 结束实操

    image

  • 请确保已经按照上述步骤完成了资源的释放

    • 点击 取消 ,则回到实验页面

      image

    • 点击 确定 ,可结束实验

      image

      最后直接点击 x 关闭,从而退出整个实验页面

      image