查房价的官方网站,wordpress xampp 本地 慢,影视网站模板,现代装修风格2022年前言
在本系列的第一部分中#xff0c;我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式#xff0c;现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。
深度学习与网络空间…前言
在本系列的第一部分中我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。
深度学习与网络空间安全的交叉
深度学习作为人工智能的一部分在许多领域中取得了显著的进展。然而随着其广泛应用深度学习模型的安全性也引起了广泛关注。后门攻击就是其中一种重要的威胁尤其在网络空间安全领域中
我们已经知道深度学习后门攻击是一种攻击者通过在训练过程中插入恶意行为使得模型在特定的触发条件下表现异常的攻击方式。具体来说攻击者在训练数据集中加入带有后门触发器的样本使得模型在遇到类似的触发器时产生攻击者期望的错误输出而在正常情况下模型仍能表现出高准确率。这种隐蔽性和针对性使得后门攻击非常难以检测和防御。
现在我们举几个例子介绍后门攻击在网络空间安全中的应用场景。
恶意软件检测在网络安全中恶意软件检测是一个重要应用。攻击者可以通过后门攻击技术使得恶意软件检测模型在检测特定样本时失效。例如攻击者可以在训练恶意软件检测模型时插入带有后门的恶意样本使得模型在检测带有特定触发器的恶意软件时无法正确识别从而达到隐蔽恶意软件的目的。 入侵检测系统入侵检测系统Intrusion Detection System, IDS用于监测网络流量并识别潜在的入侵行为。攻击者可以在训练IDS模型时加入后门触发器使得模型在特定条件下无法识别攻击流量。例如攻击者可以在训练数据中插入带有特定模式的正常流量使得模型在检测到这些模式时误判为正常从而绕过入侵检测系统。 图像识别安全在网络空间安全中图像识别技术被广泛应用于身份验证和监控系统中。攻击者可以利用后门攻击在训练图像识别模型时插入带有后门的图像样本使得模型在识别带有特定触发器的图像时出现误判。例如攻击者可以使得带有特定标志的非法图像被识别为合法从而绕过安全监控系统。 可见后门攻击与网络空间安全其他领域还是存在不少交叉的。
现在我们继续来分析并实现、复现典型的深度学习后门攻击方法。
BppAttack
理论
这篇工作提出了一种名为BPPATTACK的深度神经网络DNN木马攻击方法。该攻击利用了人类视觉系统对图像量化和抖动处理不敏感的特性通过这些技术生成难以被人类察觉的触发器进而实现对DNN的高效、隐蔽的木马攻击。
现有的攻击使用可见模式如图像补丁或图像变换作为触发器这些触发器容易受到人类检查的影响。比如下图就可以看到很明显的触发器。 BPPATTACK方案的核心思想是利用人类视觉系统对图像微小变化的不敏感性通过图像量化和抖动技术生成难以被人类察觉的触发器实现对深度神经网络DNN的高效、隐蔽的木马攻击。
人类视觉系统对颜色深度的变化不是特别敏感特别是当颜色变化非常微小的时候。BPPATTACK正是基于这一生物学原理通过调整图像的颜色深度来生成触发器。 图像量化Bit-Per-Pixel Reduction 图像量化是减少图像中每种颜色的比特数从而减少图像的总颜色数量。BPPATTACK通过降低每个像素的比特深度使用量化后的最近邻颜色值来替换原始颜色值实现对图像的微小修改。 抖动技术Dithering 为了消除由于颜色量化引起的不自然或明显的图像伪影BPPATTACK采用抖动技术特别是Floyd-Steinberg抖动算法来平滑颜色过渡提高图像的自然度和视觉质量。 BPPATTACK旨在生成一种触发器它对人类观察者来说是几乎不可察觉的但对机器学习模型来说足够显著能够触发预设的木马行为。这种平衡是通过精确控制量化和抖动的程度来实现的。 与需要训练额外的图像变换模型或自编码器的攻击不同BPPATTACK不需要训练任何辅助模型这简化了攻击流程并提高了效率。 为了提高攻击的成功率和隐蔽性BPPATTACK采用了对比学习和对抗性训练的结合。通过这种方式模型被训练来识别和利用量化和抖动生成的触发器同时忽略其他不重要的特征。
量化过程涉及将原始图像的颜色深度从( m )位减少到( d )位( d m )。对于每个像素值使用以下公式进行量化 其中
( T(x) ) 是量化后的像素值。( x ) 是原始像素值。( m ) 是原始颜色深度的位数每个通道。( d ) 是量化后的目标颜色深度的位数。( \text{round} ) 是四舍五入到最近的整数。
Floyd-Steinberg Dithering: 抖动算法用于改善量化后的图像质量通过将量化误差扩散到邻近像素。对于每个像素计算量化误差并更新周围像素 然后根据Floyd-Steinberg分布更新当前像素和周围像素 BPPATTACK方案的关键在于通过量化和抖动技术生成的微小变化对人类视觉系统是不可见的但对DNN模型是可区分的从而实现隐蔽的木马攻击。
帮助网安学习全套资料S信免费领取 ① 网安学习成长路径思维导图 ② 60网安经典常用工具包 ③ 100SRC分析报告 ④ 150网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集含答案 ⑧ APP客户端安全检测指南安卓IOS
实现
我们来看看该方法得到的部分中毒样本 分析关键函数
Bpp 类继承自 BadNet添加了命令行参数处理和数据集准备功能用于特定处理阶段。set_bd_args 方法配置与攻击设置相关的命令行参数。stage1_non_training_data_prepare 方法准备和变换数据集设置 DataLoader并存储阶段 1 的结果。 1. 类定义与初始化 类声明 class Bpp(BadNet): Bpp 是 BadNet 的一个子类。 构造函数 (__init__ 方法) def __init__(self):: 这是 Bpp 的初始化方法。super(Bpp, self).__init__(): 调用父类 BadNet 的构造函数以确保执行父类中的初始化逻辑。
2. 设置命令行参数 set_bd_args 方法 def set_bd_args(cls, parser: argparse.ArgumentParser) - argparse.ArgumentParser:: 这个类方法用于使用 argparse 库设置命令行参数。parser add_common_attack_args(parser): 调用 add_common_attack_args 函数添加与攻击相关的常见参数。parser.add_argument(...): 添加各种命令行参数 --bd_yaml_path: 指定一个 YAML 文件的路径用于提供额外的默认属性。--neg_ratio, --random_rotation, --random_crop, --squeeze_num, --dithering: 各种与攻击配置相关的参数如负比率、旋转、裁剪、压缩和抖动。 返回值 返回更新后的 parser 对象其中包含所有添加的参数。
3. 准备第一阶段的数据 stage1_non_training_data_prepare 方法 def stage1_non_training_data_prepare(self):: 这个方法用于准备第一阶段的数据。 日志记录与断言 logging.info(stage1 start): 记录阶段 1 的开始。assert args in self.__dict__: 确保 args 属性存在于实例中。 数据集准备 train_dataset_without_transform, train_img_transform, train_label_transform, 等变量这些变量被赋值为调用 self.benign_prepare() 的结果该方法用于准备数据集和变换。clean_train_dataset_with_transform.wrap_img_transform test_img_transform: 将训练数据集的图像变换更新为与测试数据集的图像变换一致。 DataLoader 初始化 clean_train_dataloader: 一个用于清洁训练数据集的 DataLoader应用了变换。clean_train_dataloader_shuffled: 一个用于清洁训练数据集的 DataLoader但数据是打乱的。clean_test_dataloader: 一个用于清洁测试数据集的 DataLoader。 存储结果 self.stage1_results: 存储各种数据集和 DataLoader 以备阶段 1 进一步使用。 这段代码是一个神经网络训练和评估的流程具体针对的是后门攻击backdoor attack的研究 初始化 代码开始时记录训练阶段2的开始时间。通过断言检查 self 对象中是否包含 args 属性获取训练参数。 设备选择 根据是否有可用的 GPU 来设置计算设备。如果 args.device 包含多个设备例如 cuda:2,3,7则使用 torch.nn.DataParallel 来并行计算。 模型生成 调用 generate_cls_model 函数生成分类模型 netC并将其移动到指定的设备上。 优化器和学习率调度器 调用 argparser_opt_scheduler 函数获取优化器和学习率调度器。 数据预处理 过滤出可逆的图像变换如标准化、缩放、转换为张量。创建干净和背门攻击的数据集分别保存处理后的数据集。 训练数据处理 遍历干净训练数据通过反归一化得到原始图像。根据攻击标签转换类型“all2one” 或 “all2all”来生成背门攻击数据。处理数据集中的每一批次并将干净样本和背门样本保存到数据集中。 测试数据处理 对测试数据进行类似的预处理和保存操作包括处理干净测试数据和背门测试数据。评估背门效果并根据攻击标签转换类型生成相应的标签和数据。 负样本生成 如果指定了负样本比率neg_ratio生成负样本数据。这些负样本用于评估背门攻击的效果。将负样本与其他数据合并并保存处理后的数据。 模型训练和评估 对每个 epoch 执行训练和评估步骤。记录训练损失、准确率、背门攻击成功率等指标。将每个 epoch 的训练和测试结果保存到列表中并绘制训练和测试指标的图表。 模型保存和结果输出 在训练周期结束时保存模型状态、学习率调度器状态、优化器状态等。将训练和测试结果保存到 CSV 文件中并生成最终的攻击结果数据。 完成 输出“done”表示训练和保存过程已完成。
每个步骤都有明确的目标从数据处理到模型训练再到最终结果保存涵盖了整个训练和评估的过程。 这段代码包含了两个主要的函数train_step 和 eval_step。它们分别用于训练和评估模型
train_step 函数
功能: 执行一个训练步骤处理数据、计算损失、更新模型权重并计算各种指标。 初始化: 记录日志设置模型为训练模式。获取训练参数包括背门比率rate_bd和压缩数squeeze_num。初始化交叉熵损失函数criterion_CE和数据转换对象transforms。初始化一些用于记录的列表。 数据处理: 对每个批次的数据进行处理 清空优化器的梯度。将输入数据和目标标签移动到指定设备GPU/CPU。计算背门样本和负样本的数量。根据是否存在背门样本和负样本生成相应的数据 背门样本: 对背门样本进行处理如抖动处理并生成标签。负样本: 生成负样本数据并合并到训练数据中。 处理数据集中的每一批次将背门样本和负样本合并到一起。应用数据转换函数。 模型训练: 计算模型的预测结果并记录计算时间。计算损失进行反向传播更新优化器。记录每个批次的损失、预测结果、标签等信息。 计算指标: 计算每个 epoch 的平均损失和准确率。根据背门样本、负样本和干净样本的指标计算背门攻击成功率ASR、干净样本准确率等。 返回: 返回训练过程中的各种指标平均损失、混合准确率、干净样本准确率、背门攻击成功率、背门样本恢复准确率、交叉样本准确率。
eval_step 函数
功能: 执行模型评估计算不同数据集干净数据集、背门数据集、交叉数据集等的损失和准确率。 清洁测试数据集评估: 使用 given_dataloader_test 函数评估干净测试数据集获取损失和准确率。 背门数据集评估: 使用 given_dataloader_test 函数评估背门测试数据集获取损失和准确率。 背门样本恢复RA数据集评估: 对背门样本恢复数据集进行转换和评估获取损失和准确率。 交叉数据集评估: 使用 given_dataloader_test 函数评估交叉测试数据集获取损失和准确率。 返回: 返回不同数据集的损失和准确率干净测试集损失和准确率、背门测试集损失和准确率、交叉测试集损失和准确率、恢复测试集损失和准确率。
这些函数一起构成了一个完整的训练和评估流程涵盖了数据处理、模型训练、指标计算和评估等多个方面。
开始进行后门注入 攻击配置如下所示 训练期间的部分截图如下 也可以查看acc的变化情况 可以看到主要关注的指标都在稳步上升
以35epoch为例此时的后门攻击成功率达到了0.98而深度学习模型执行正常任务的准确率达到了0.91
FTrojan
理论
FTrojan攻击的核心思想是在频率域中注入触发器。这种方法利用了两个关键直觉
在频率域中的小扰动对应于整个图像中分散的小像素级扰动这使得图像在视觉上与原始图像难以区分。卷积神经网络CNN能够学习并记住频率域中的特征即使输入的是空间域像素。
FTrojan攻击包括以下步骤
将图像从RGB色彩空间转换到YUV色彩空间因为人的视觉系统对YUV中的UV色度分量不那么敏感。对图像的UV分量进行离散余弦变换DCT将其从空间域转换到频率域。在频率域中生成触发器选择固定大小的频率带作为触发器。应用逆DCT将图像从频率域转换回空间域。最后将图像从YUV色彩空间转换回RGB色彩空间。
我们来分析关键细节
FTrojan攻击方法的核心在于利用频率域的特性来注入难以被检测到的后门触发器。 颜色空间转换RGB到YUV 使用线性变换将RGB图像转换为YUV空间。YUV空间将颜色图像分解为亮度Y和色度U, V分量。人的视觉系统对色度分量的变化不如亮度分量敏感因此在色度分量中注入触发器对视觉的影响较小。 离散余弦变换DCT 对YUV空间中的U和V分量应用DCT将图像从空间域转换到频率域。DCT将图像表示为不同频率的余弦函数的集合能量集中在低频部分高频部分则包含图像的边缘和细节信息。 DCT公式如下 其中(X(u, v))是DCT系数(x(x, y))是图像在空间域的像素值(M)和(N)是图像的宽度和高度(u)和(v)是频率索引。 触发器生成 在频率域中选择特定的频率带作为触发器。触发器的频率和幅度是两个关键参数 触发器频率选择中频和高频带的组合以平衡人类视觉感知的敏感性和触发器的鲁棒性。触发器幅度选择适中的幅度以确保触发器对CNN是可学习的同时对人类视觉系统是不可见的。 逆离散余弦变换Inverse DCT 使用逆DCT将修改后的频率域图像转换回空间域得到注入了后门触发器的图像。 逆DCT公式如下 颜色空间转换YUV回到RGB 最后将修改后的YUV图像转换回RGB空间因为大多数CNN模型是在RGB空间上训练的。
完整的攻击流程如下图所示 下图是本方法生成的中毒样本与触发器可以看到是具有一定隐蔽性的 下图是通过 FTrojan 攻击来得到的中毒图像。混频将触发器混合在中频和高频成分中。我们可以观察到当触发器存在于具有适中幅度的高频和中频成分中时中毒图像在视觉上很难被检测到。 复现
攻击类 这段代码定义了一个 Ftrojann 类继承自 BadNet。下面是代码的功能解释 set_bd_args 方法: 这个方法用于设置命令行参数。它接受一个 argparse.ArgumentParser 对象作为输入并返回一个更新后的 ArgumentParser 对象。add_common_attack_args(parser) 是一个函数调用可能会向 parser 中添加一些通用的攻击相关参数。添加了多个特定参数 --channel_list接收一个整数列表代表频道列表。--magnitude接收一个浮点数表示强度。--YUV接收一个布尔值表示是否使用 YUV 格式。--window_size接收一个整数表示窗口大小。--pos_list接收一个整数列表表示位置列表。--bd_yaml_path接收一个字符串指定 YAML 文件的路径该文件提供附加的默认属性。默认路径是 ./config/attack/ftrojann/default.yaml。 add_bd_yaml_to_args 方法: 这个方法用于将 YAML 文件中的默认属性添加到 args 参数中并进行一些额外的处理。从 args.bd_yaml_path 指定的路径读取 YAML 文件内容解析为字典 mix_defaults。将 args 对象中非 None 的参数更新到 mix_defaults 中。将 args 对象的 __dict__ 属性存储了所有参数更新为合并后的字典。检查 pos_list 的长度是否为偶数如果不是抛出 ValueError。将 pos_list 转换为一对一对的元组列表例如将 [x1, y1, x2, y2] 转换为 [(x1, y1), (x2, y2)]。
着重查看对于数据集的处理代码
这个类的主要功能是处理带有后门攻击的图像数据集支持图像和标签的预处理、状态恢复和复制。 这段代码定义了一个名为 prepro_cls_DatasetBD_v2 的 PyTorch 数据集类。这个类扩展了 torch.utils.data.Dataset用于处理带有后门攻击backdoor attack的数据集 __init__ 方法: 参数: full_dataset_without_transform: 原始数据集没有应用任何变换。poison_indicator: 一个可选的序列表示哪些图像需要应用后门变换使用 one-hot 编码。默认为 None如果没有提供则初始化为全零的数组。bd_image_pre_transform: 应用在图像上的后门变换函数。bd_label_pre_transform: 应用在标签上的后门变换函数。save_folder_path: 保存后门图像的文件夹路径。mode: 当前模式默认为 attack。 操作: 初始化数据集和相关属性。检查 poison_indicator 的长度是否与数据集长度匹配。如果 poison_indicator 中的值大于等于 1则调用 prepro_backdoor() 方法进行后门数据预处理。设置其他属性如 getitem_all 和 getitem_all_switch用于控制数据集的取值方式。 prepro_backdoor 方法: 对所有需要后门变换的样本进行处理。遍历数据集的所有索引如果 poison_indicator 表示该样本需要变换则应用图像和标签的变换并调用 set_one_bd_sample() 方法保存变换后的样本。 set_one_bd_sample 方法: 将图像和标签变换后的样本保存到 bd_data_container 中。确保图像被转换为 PIL 图像格式如果不是的话。更新 poison_indicator标记该样本为后门样本。 __len__ 方法: 返回数据集中样本的总数。 __getitem__ 方法: 根据索引获取样本。如果样本是干净的poison_indicator 为 0则从原始数据集中获取图像和标签。如果样本是后门的poison_indicator 为 1则从 bd_data_container 中获取图像和标签。根据 getitem_all 和 getitem_all_switch 的设置返回不同格式的数据。 subset 方法: 根据给定的索引列表更新 original_index_array从而选择数据集的子集。 retrieve_state 方法: 返回当前对象的状态包括 bd_data_container、getitem_all、getitem_all_switch、original_index_array、poison_indicator 和 save_folder_path。 copy 方法: 创建一个 prepro_cls_DatasetBD_v2 的副本。深度复制当前对象的状态并设置到新副本中。 set_state 方法: 根据提供的状态文件恢复对象的状态。包括恢复 bd_data_container 和其他属性。
在我们的实现中得到的部分中毒样本如下所示 注入后门 攻击配置 后门注入期间的部分截图如下所示 以第38个epoch为例此时的后门攻击成功率达到了接近100%而正常任务的准确率达到了0.91
CTRL
理论
之前我们提到的后门攻击都是通过监督学习的方式实现的这一节我们来分析自监督学习后门攻击。
自监督学习SSL是一种无需标签即可学习复杂数据高质量表示的机器学习范式。SSL在对抗性鲁棒性方面相较于监督学习有优势但是否对其他类型的攻击如后门攻击同样具有鲁棒性尚未明确。
CTRL攻击通过在训练数据中掺入少量≤1%的投毒样本这些样本对数据增强操作具有抗性使得在推理阶段任何含有特定触发器的输入都会被错误地分类到攻击者预定的类别。
触发器 ( r ) 是一种在输入数据的频谱空间中的扰动它对数据增强如随机裁剪不敏感。触发器的设计使其在视觉上几乎不可察觉但在频域中具有特定的模式。 假设攻击者可以访问到一小部分目标类别的输入样本集 ( \tilde{D} )。 通过在这些样本上添加触发器 ( r ) 来生成投毒数据 ( D^* )。 嵌入将触发器 ( r ) 嵌入到输入 ( x ) 中形成触发输入 ( x^* x \oplus r )。这里 ( \oplus ) 表示触发器嵌入操作。 激活在推理时攻击者可以调整触发器的幅度来激活后门而不影响模型对清洁数据的分类性能。
SSL中的对比损失函数旨在最小化正样本对相同输入的不同增强视图之间的距离同时最大化负样本对不同输入之间的距离。对比损失可以表示为 其中( f ) 是编码器( x_i ) 和 ( x_j ) 是正样本对( y_{ij} ) 是指示器如果 ( x_i ) 和 ( x_j ) 是正样本对则为1否则为0( \tau ) 是温度参数。
CTRL攻击利用了SSL的表示不变性属性即不同增强视图的同一输入应具有相似的表示。数学上这可以表示为 这里( x^* ) 是触发输入( x^ ) 是增强后的正样本( r ) 是触发器( \alpha ) 是混合权重。
通过调整触发器的幅度攻击者可以控制攻击的效果。
完整的攻击流程如下图所示 下图演示了触发器的生成流程 复现
分析关键代码
ctrl类的stage1_non_training_data_prepare 方法负责准备背门攻击的数据包括训练和测试数据集的生成。它先从干净数据中准备基础数据然后生成背门样本最后创建背门训练和测试数据集并将结果保存以备后续使用。这一过程涵盖了从数据预处理到背门攻击数据的生成并最终包装成适合训练和评估的格式。 这段代码是一个名为 ctrl 的类的定义它继承自 BadNet 类。主要功能是准备阶段1的数据包括生成后门攻击数据和测试数据
1. set_bd_args 方法
功能: 设置用于背门攻击的命令行参数。
bd_yaml_path: 指定 YAML 配置文件的路径。use_dct: 布尔值指示是否使用 DCT离散余弦变换。use_yuv: 布尔值指示是否使用 YUV视频色彩空间。trigger_channels: 触发器的通道。pos_list: 触发器的位置。
2. stage1_non_training_data_prepare 方法
功能: 准备数据包括清洁训练数据、背门训练数据和测试数据。 初始化: 记录日志并确保 args 存在。从 benign_prepare 方法中获取不同的数据集和转换方法。 生成背门数据集: 调用 bd_attack_img_trans_generate 和 bd_attack_label_trans_generate 方法生成背门数据集所需的图像和标签转换。使用 generate_poison_index_from_label_transform 方法生成训练数据中的背门样本索引。保存背门样本索引到文件。 创建背门训练数据集: 使用 prepro_cls_DatasetBD_v2 方法生成背门训练数据集并应用转换。创建数据集包装器 dataset_wrapper_with_transform。 生成背门测试数据集: 使用 generate_poison_index_from_label_transform 方法生成测试数据中的背门样本索引。使用 prepro_cls_DatasetBD_v2 方法生成背门测试数据集并应用转换。使用 subset 方法筛选测试数据集中的背门样本。 保存结果: 将准备好的数据集保存到 self.stage1_results 中。
执行 攻击配置如下 训练期间部分截图如下 可以看到CTRL在后门攻击成功率上稍低比如在第59个epoch时攻击成功率为0.93正常任务准确率为0.93