Page 71 - 《软件学报》2025年第4期
P. 71
孙伟松 等: 深度代码模型安全综述 1477
换生成对抗样本可以避免以上问题, 但是其攻击成功率并不如前两者. 因此, 如何平衡对抗样本生成的成功率和隐
蔽性是一个关键的挑战.
3.2 对抗防御
对于上述的对抗攻击方法, 研究人员提出不同的对抗防御方法来增强模型的鲁棒性或者消除对抗样本对于模
型的影响. 在对抗防御上主要存在 3 种方法: (1) 修改输入: 修改模型训练过程或修改输入数据样本. 通常引入对抗
样本对模型进行对抗训练, 增强模型的鲁棒性. (2) 修改模型: 在模型中添加更多的子网络、修改激活函数或者修
改损失函数等. (3) 附加模型: 当分类未见过的数据样本时, 使用外部模型作为附加网络. 第 1 种方法关注的是输入
到模型的数据样本, 另外两种方法则更加关注模型. 后两种方法可以细分为模型防御和数据检测. 模型防御的目的
是让模型能够将对抗样本识别为正确的类别, 数据检测对抗样本上进行检测并发出报警, 模型拒绝进一步处理输
入的对抗样本. 目前针对深度代码模型的对抗防御方法主要集中在第 1 种对抗防御方法中. 接下来, 我们将详细介
绍针对深度代码模型对抗防御的相关研究工作.
2022 年, Henkel 等人 [19] 基于 Madry 等人 [82] 的鲁棒优化目标, 首次提出了一个针对深度代码模型的对抗训练
方法. 作者为了降低对抗训练复杂性, 通过对部分程序应用转换来预先生成程序草图. 在训练过程中, 仅需要考虑
生成的程序草图, 使用基于梯度的攻击来搜索变换的最佳参数. 实验表明, 只需对深度代码模型进行一次转换的对
抗训练, 便可以高效地增强模型的鲁棒性.
2022 年, Li 等人 [16] 提出了一种创新框架 RoPGen, 加强了基于深度代码模型的源代码作者归属模型的鲁棒性.
RoPGen 在对抗训练阶段结合数据增强和梯度增强, 使得攻击者难以操控和模范. RoPGen 基于自动编码风格模仿
攻击和自动编码风格隐藏攻击进行数据增强, 这两种攻击方法有效地增加了训练数据的多样性. RoPGen 通过对
深度神经网络的梯度产生扰动实行数据增强来学习具有多样化表示的鲁棒深度代码模型. RoPGen 使用基于 C,
C++和 Java 等编程语言的 4 个数据集来评估有效性. 实验结果表明, RoPGen 可以显著提高基于深度代码模型源
代码作者归属的鲁棒性, 可以分别平均降低 22.8% 目标攻击成功率和 41.0% 非目标攻击成功率.
2022 年, 为了能够同时提升深度代码模型的泛化性和鲁棒性, Li 等人 [31] 提出了语义保留的代码嵌入方法
SPACE. SPACE 通过寻找最坏情况下的语义保留攻击, 同时迫使模型在这些最坏情况下正确预测标签来提升模型
(byte pair encoding tokenizer, BPE) 将输入的代码序列转化为
的鲁棒性. 具体而言, SPACE 利用字节对编码标记器 [17]
一系列子词标记, 然后通过一个子词嵌入层进行高维词嵌入. 保留属于同一标识符的每个子词可微分扰动, 并将其
添加到相应的词嵌入和位置嵌入, 形成分布式嵌入. 最后由预训练模型的编码器进一步编码. 可微分扰动会根据其
梯度进行更新, 使用梯度上升算法计算最终损失, 以最大限度地减少扰动对模型的负面影响. SPACE 是在连续嵌
入空间上进行对抗训练, 因此可以高效地被纳入到基于梯度的训练框架中. SPACE 将对抗训练与编程语言的数据
特征相结合, 能够同时提高 PrLMs 的性能和鲁棒性. 实验表明, 深度代码预训练模型 CodeBERT 和 GraphCode-
[29]
[15]
BERT 结合 SPACE 进行训练能够有更优的泛化性, 同时对 MHM 和 ALERT 两种先进的对抗攻击方法保持鲁棒.
2023 年, Gao 等人 [9] 针对深度代码模型离散对抗攻击方法提出了加强对抗训练防御方法 EverI. EverI 在最强
的对抗样本上对模型进行训练, 原则上适用于防御所有的对抗攻击方法. 针对离散对抗攻击, EverI 首先根据保留
语义转换在原始输入上构建一个传递闭包, 在传递闭包中的所有程序中找出使得模型具有最大损失的对抗样本.
对于其他经典的连续对抗攻击, 例如 DAMP [17] , EverI 通过增加对抗步骤与随机初始化对抗扰动来找出最强的对
抗样本. 对于其他离散的攻击, 例如 Imitator [23] , EverI 通过增加程序变换搜索树的宽度和深度找出最强的对抗样
本. 实验表明, 相比对抗训练 [82] 和异常值检测防御 , EverI 对离散对抗攻击的防御更为有效.
2023 年, He 等人 [26] 提出一种新型的基于学习的对代码生成任务进行安全控制的方法 SVEN, 并利用制作的
对抗样本测试模型的安全性. SVEN 利用特定属性的连续向量来引导深度代码模型对于程序生成朝着给定属性的
方向发展, 但不修改模型的权重. SVEN 的训练过程通过在代码的不同区域上强制执行专门的损失项, 并使用精心
制作的高质量数据集来优化这些连续向量. 实验表明, SVEN 可以实现有效的安全控制, 可以使得 CodeGen 模型生
成安全代码的比例上升至 92.3%, 并且不损害生成代码的功能正确性.