Page 69 - 《软件学报》2025年第4期
P. 69
孙伟松 等: 深度代码模型安全综述 1475
MHM 更加关注对抗样本作为代码的约束条件. MHM 从源代码片段和词汇集中提取源标识符和目标标识符, 并根
据计算的接受率决定是否进行重命名, 因此 MHM 生成的对抗样本不存在编译错误. 实验证明, MHM 能够攻击基
于 LSTM 和 ASTNN 的代码分类任务模型, 分别具有 46.4% 和 54.7% 的攻击成功率. 此外, 使用 MHM 进行对抗
训练后, 能有效提高模型分类性能以及模型的对抗鲁棒性.
2021 年, Pour 等人 [18] 提出了一种基于搜索的测试框架, 用于生成对抗样本来测试基于深度代码模型的下游任
务模型鲁棒性. 作者选用了广泛应用的 10 个重构操作符的方法, 例如局部变量重命名、参数重命名、方法名重命
名等, 来生成新的对抗样本测试输入. 利用深度代码模型变异测试来指导测试样本生成方向. 在基于 Code2Vec、
Code2Seq 和 CodeBERT 的方法名预测、代码描述、代码检索和代码摘要 4 个任务下进行了大规模评估. 实验结
果表明, 生成的对抗样本平均使得深度代码模型的性能降低 5.41% 以上. 通过使用生成的对抗样本进行重新训练,
深度代码模型的鲁棒性平均可以提高 23.05%, 并且对于模型的影响很小, 只有 3.56%.
2022 年, Zhou 等人 [22] 提出了一种标识符替换对抗样本攻击方法 ACCENT, 用于提高深度代码模型在代码注
释生成任务中的鲁棒性, ACCENT 通过修改程序标识符生成对抗样本, 对于单字母标识符和非单字母标识符具有
不同的修改方式. 对于前者, ACCENT 将原标识符简单地随机更改为不同的字母. 对于后者, ACCENT 采用黑盒、
生成的对抗实例具有更多的小扰动, 且对
非目标搜索的方法来生成对抗样本. ACCENT 首先通过数据集中的所有程序提取标识符以建立候选标识符集, 并
k 个标识符, 形成一个子候选集. 接下来根据这些
根据余弦相似性为程序中每个标识符的候选集选择距离最近的
候选标识符与程序的上下文关系对它们进行排名. 最后, 按照排名顺序通过用最佳候选标识符替换原标识符来生
成对抗样本. 实验结果显示, ACCENT 能高效产生保持源代码功能性的对抗样本, 与随机替代算法和基于 Metropolis-
Hastings 抽样的算法 [29] 相比, ACCENT 生成的对抗样本具有更好的可迁移性.
2022 年, Yang 等人 [15] 提出一种可以对抗地转换输入以使受害者模型产生错误的输出的黑盒对抗样本攻击
ALERT. ALERT 与 MHM [29] 类似都是修改代码变量来生成对抗样本. 相比于 MHM, ALERT 更加关注到对抗样本
的自然性需求. ALERT 使用 CodeBERT 和 GraphCodeBERT 预训练模型生成代码变量的候选替代词, 然后使用
余弦相似度对候选替代词进行排序, 最后使用贪婪算法 (greedy attack) 或者遗传算法 (GA-Attack) 从候选替代
词中选出对抗样本, 因此 ALERT 生成的对抗样本保留了代码的自然语义和操作语义. 实验证明, ALERT 对 Code-
BERT 和 GraphCodeBERT 在漏洞预测, 克隆检测和源代码身份归属 3 种下游任务上的攻击效果都优于 MHM.
2023 年, Jha 等人 [30] 提出了一种简单但高效的黑盒对抗攻击方法 CodeAttack, 利用代码结构生成高效但难以
察觉的对抗代码样例. CodeAttack 首先找到代码中最容易受攻击的脆弱标记, 随后利用贪婪搜索生成脆弱标记的
替代标记, 使用生成的替代标记中对样本扰动最小、能够保持代码一致性和遵守代码约束的标记替代脆弱标记.
实验表明, 对比 TextFooler [77] 和 BERT-Attack [78] , CodeAttack 能够对 CodeT5、CodeBRER 和 GraphCodeBERT 在
代码转换、代码修复和代码摘要任务上发起更高效的对抗攻击, 生成的对抗样本具有更高的语法正确性.
2023 年, Zhang 等人 [40] 提出了一种基于模型不确定性和模型输出变化来生成对抗测试数据的黑盒对抗攻击
方法 RNNS, 用来评估深度代码预训练模型的鲁棒性. 与 MHM [29] 和 ALERT [15] 方法类似, RNNS 也是通过对源代码
中的局部变量重命名来生成对抗样本. 相比于 MHM 和 ALERT, RNNS 在追求高攻击成功率的同时, 从真实代码
中搜集变量名, 生成具有统计特征的对抗样本. RNNS 首先基于语义相似度利用真实的代码数据构建变量名称的
搜索空间, 然后使用表示最近邻搜索方法 (representation nearest neighbor search) 在基于模型输出变化的指导下从
命名空间中寻找对抗样本. 在这个过程中, 失败的攻击样本用于指导 RNNS 中的下一轮攻击. 实验表明, 相比于
MHM 和 ALERT, RNNS CodeBERT、GraphCodeBERT 和 CodeT5 在 3
种编程语言的 6 个代码任务上的攻击效果更优.
(2) 基于死代码插入的对抗样本生成方法
2023 年, Na 等人 [12] 提出了一种高效且先进的黑盒对抗攻击方法 DIP, 不需要深度预训练模型的任何信息, 且
无需额外的训练计算, 以插入死代码的方式制作对抗样本. DIP 首先利用预训练模型 CodeBERT 寻找源代码中易
受攻击的脆弱位置. 随后使用余弦相似度从代码库中寻找与源代码语义最不相似的候选代码片段. 最后从这些候
选代码片段中选择扰动最小的代码语句, 声明一个不使用的变量包裹该语句作为死代码插入到源代码的脆弱位