Page 70 - 《软件学报》2025年第4期
P. 70
1476 软件学报 2025 年第 36 卷第 4 期
置. 由于通过插入死代码的方式发起对抗攻击, 因此 DIP 保持了源代码的功能性和可编译性. 实验表明, DIP 在 9
个目标模型上都具有最好的 CodeBLEU, 且在大多数目标模型上具有最好的扰动比率.
2023 年, Nguyen 等人 [39] 为了评估深度代码模型的鲁棒性, 提出了一种新颖的黑盒对抗攻击框架 GraphCode-
Attack. 对于给定的目标深度代码模型, GraphCodeAttack 自动挖掘影响模型决策的重要代码模式, 用于扰动输入
模型的代码结构. 具体而言, GraphCodeAttack 从源代码和目标模型输出中识别出可以影响模型决策的具有辨别性
的抽象语法树 (abstract syntax tree, AST) 模式, 随后选择合适的模式作为死代码插入到源代码中制作对抗样本. 实
验表明, GraphCodeAttack 在基于 CodeBERT 和 GraphCodeBERT 深度代码模型的源代码作者归属、代码漏洞检
测和代码克隆检测这 3 个任务上平均攻击成功率达到 0.841, 远高于 ALERT [15] 和 CARROT A [21] 对抗攻击方法.
(3) 基于语义保留代码转换的对抗样本生成方法
2019 年, Quiring 等人 [23] 提出了第一篇针对源代码作者归属的黑盒对抗攻击方法, 该方法通过将蒙特卡洛树
搜索 (Monte-Carlo tree search) [79] 与保留语义的源代码转换结合, 在源代码领域寻找对抗样本. 该攻击通过迭代转
换程序的源代码来进行, 在保留语义的同时改变代码风格, 误导基于深度代码模型的作者归属方法. 作者考虑无目
标和有目标两类攻击, 要求攻击在保留源代码的语义和不改变源代码布局的同时, 保持转换后的代码在语法上的
AdVulCode. 不同于基于标识符扰动生成对抗样本的
正确性和可读性. 实验表明, 无目标和有目标攻击都能够成功攻击 Caliskan-Islam 等人 [80] 和 Abuhamad 等人 [81] 提
出的最先进的源代码作者归属方法. 其中, 无目标攻击严重影响了源代码作者归属方法的性能, 在源代码的改动很
少的情况下以 99% 的成功率误导源代码作者归属. 有目标攻击可以高精度地模仿开发者的编程风格, 针对以上两
种方法的攻击成功率可以达到 77.3% 和 81.3%.
2022 年, Li 等人 [16] 为了能够设计出一种可以针对已知与未知对抗攻击的鲁棒性的防御方法, 针对源代码作者
归属提出了两种黑盒对抗攻击方法, 分别是有目标的自动编码风格模仿攻击和无目标的自动编码风格隐藏攻击.
新提出的对抗攻击方法可以利用这两种攻击中系统化的保留语义代码风格属性与转换. 自动编码风格模仿攻击首
先从目标作者所有代码中提取出代码风格属性, 并综合成一个总的代码风格属性, 从而获得目标作者的编码风格,
随后识别攻击者代码的编码风格属性, 最后对攻击者代码进行转换以模仿目标代码风格. 自动编码风格隐藏攻击
首先从攻击者代码中提取代码风格属性, 之后获取其他作者的代码风格属性, 随后提取攻击者代码风格属性与其
他作者代码风格属性的不同集合, 并选择错误归属概率最高的作者, 最后将攻击者代码风格转换为选择的目标作
者代码风格. 实验表明, 现有的基于深度代码模型的归属模型在已知的和未知的新的对抗攻击下非常脆弱, 而且无
目标攻击的成功率远高于有目标攻击.
2023 年, Gao 等人 [9] 提出了一种新颖的特定于深度代码模型的对抗攻击 DaK, 通过保留源代码输入语义的程
序转换创建离散对抗样本. DaK 具有 3 个关键组件: Destroyer、Finder 和 Merger. Destroyer 首先, 篡改输入程序的
功能以削弱模型进行预测所依赖的特征. 在篡改输入程序时只应用语义保留转换. 此后, Finder 找到一组模型预测
为目标标签的程序, 计算组内程序的关键特征, 这些特征被认为是使模型预测为目标标签的最强和最集中的特征.
最后, Merger 利用选出的程序关键功能特征注入到目标程序中, 生成离散的对抗样本. 作者对 DaK 在 Code2Vec、
GGNN 和 CodeBERT 这 3 种深度代码模型上进行了实验. 实验表明, DaK 在攻击无防御或无强化的深度代码模型
上优于 Imitator [23] 和 DAMP [17] .
2023 年, Yu 等人 [32] 提出首个为基于深度代码模型的漏洞监测任务高效生成代码对抗样本的黑盒对抗攻击框
架 ALERT [15] 和 MHM [29] 对抗攻击方法, AdVulCode 使用不改
变源代码语义的等价转换规则, 针对易受攻击行进行转换. 因此, AdVulCode 降低了源代码的整体扰动水平. 具体
而言, AdVulCode 利用等价转换生成候选代码语句, 并引入改进的蒙特卡洛树搜索 (Monte-Carlo tree search) 来指
导候选语句的选择并生成对抗样本. 相比于 ALERT, AdVulCode 可以处理具有标识符名称映射的模型. 实验证明,
AdVulCode 在漏洞检测任务上的对抗攻击效果优于 ALERT.
综上, 在标识符重命名方面, 对代码进行扰动时引入了编程语言的词法、句法和自然性等约束, 保证了生成的
对抗样本能够通过编译检查. 然而, 此类方法很有可能会对变量进行错误替换, 导致代码编译错误. 一些研究通过
插入死代码避免上述问题. 但是死代码部分在输入模型之前可能会被检测出来从而被消除. 而保留语义的代码转