Page 62 - 《软件学报》2025年第4期
P. 62
1468 软件学报 2025 年第 36 卷第 4 期
自动补全工具才会建议使用攻击者选择的诱饵. 因此, 在生成中毒样本前, 攻击者还需要学习用于识别特定目标的
代码特征. 在生成中毒样本时同时生成一组良性样本, 取良性样本和中毒样本的并集作为中毒集. 实验表明, 后门
攻击会使模型对诱饵的置信度从 0–20% 增加到 30%–100%, 且对于有目标攻击来说, 诱饵在非目标仓库中作为首
选建议出现的概率反而比攻击前更低. 这证明神经代码自动补全器很容易受到中毒攻击, 且这些攻击是有针对性
的. 同时, 作者使用频谱方法 [54] 和聚类方法 [55] 进行后门防御, 结果表明两种防御方法都会错误地过滤掉合法语料
库的大部分内容, 且保留许多攻击者的中毒文件, 假阳性率 (false positive rate, FPR) 很高, 无法达到有效的防御效果.
2022 年, Wan 等人 [10] 首次将基于数据投毒的后门攻击引入到深度代码检索模型中, 并表明深度代码检索模型
的鲁棒性和安全性仍需得到关注. 该文章提出了一种简单但有效的后门攻击方法, 该方法使用固定的或者基于文
法的死代码片段作为触发器并注入到具有目标词的自然语言查询-代码数据中. 结果显示, 该攻击对基于 BiRNN [56] ,
Transformer 和 CodeBERT 的深度代码检索模型都有效, 且模型越简单攻击效果越好. 最后, 为了验证该攻击的隐
匿性, 作者使用频谱方法用于模型防御, 结果表明目前的防御方法对该后门攻击不够有效.
2022 年, Li 等人 [35] 提出了一种通过数据投毒对代码模型进行后门攻击的攻击框架 CodePoisoner. Code-
Poisoner 提供了 3 种基于规则的和一种基于语言模型引导的中毒策略来生成中毒样本. 其中, 前者预先设计了一
符的投毒效果与直接插入死代码的投毒效果相当, 好于基于上下文相关的死代码插入的投毒效果. 在
些自然标记和语句作为触发器, 后者则使用由预训练语言模型生成的上下文相关的死代码语句作为触发器. 与
BadNets [57] 相比, CodePoisoner 生成的中毒样本保证了代码的自然性和可编译性, 因此很难被识别. 作者将
CodePoisoner 应用于基于 TextCNN [58] 、LSTM、Transformer 和 CodeBERT 的深度代码模型. 这些模型分别用于
处理代码缺陷检测、代码克隆检测和代码修复任务. 实验结果表明, CodePoisoner 可以对这些任务模型实现成功
的投毒攻击, 平均成功率为 98.3%.
2023 年, Cotroneo 等人 [37] 提出了一种有目标的数据投毒攻击方法, 通过往微调数据中注入软件漏洞来评估自然
语言到代码 (NL-to-Code) 生成器的安全性. 这种攻击不需要在输入中注入预定的触发词来激活, 只影响特定的目标.
具体来说, 攻击者首先从 OWASP Top 10 和 MITRE Top 25 CWE 中构建 Python 应用程序最常见的漏洞列表, 并分
组为 TPI、ICI、DPI 问题. 随后, 攻击者选择一组目标对象, 通过在代码中注入一定数量的漏洞来构建有毒样本, 其中
代码描述保持不变. 作者在 Seq2Seq、CodeBERT 和 CodeT5+ [59] 等深度代码模型上评估模型架构、中毒率和脆弱性
类别对神经机器翻译 (neural machine translation, NMT) 模型的影响. 实验表明, 无论在训练数据中注入的漏洞类型如
何, 神经翻译模型都容易受到很小比例的数据中毒的影响, 在中毒率不到 3% 的情况下, 高达 41% 的生成代码是易受
攻击的. 此外, 作者的攻击不会影响模型生成正确代码的性能, 编辑距离没有明显变化, 因此很难被监测到.
(2) 基于标识符名称修改的数据投毒方法
2021 年, Severi 等人 [24] 提出了一种通用的模型不可知的后门攻击方法, 用于研究基于机器学习的恶意软件分
类器对后门中毒攻击的敏感性. 该方法使用模型解释技术 SHAP 来选择要嵌入触发器的特征子空间, 基于子空间
的密度选择触发器的值, 最终将良性软件的特征子空间作为后门转移到恶意软件中. 此外, 作者还设计了组合策
略, 在合法样本的高密度区域创建后门点, 使得普通防御很难检测到. 他们在 EMBER [60] 、Contagio [61] 和 Drebin [62]
数据集上对 Windows PE 文件、Android 和 PDF 文件进行攻击. 实验结果表明, 多数情况下攻击成功率很高, 且由
于良性软件样本的多样性, 攻击很难被检测到.
2022 年, Li 等人 [35] 在提出的后门攻击框架 CodePoisoner 基础上, 提出了修改标识符名称进行数据投毒的方
式, 包括方法名修改和变量名修改. 在代码缺陷检测、代码克隆检测和代码修复这 3 个代码相关任务上, 修改标识
3 个任务上,
修改标识符的投毒攻击成功率接近 100%. 但是, 修改标识符的后门攻击隐蔽性差于基于上下文相关的死代码插入
的后门攻击, 经过后门防御后的召回率为 100%.
2023 年, 在 Wan 等人 [10] 的基础上, Sun 等人 [11] 提出了一种针对深度代码搜索模型的后门攻击方法 BadCode, 该
方法从自然语言查询中选择潜在的攻击目标词, 然后使用面向目标的触发器生成技术为潜在目标词生成相应的触发
器, 通过固定触发器或者融合触发器的投毒策略将触发器添加到函数名或者变量名中, 实现基于数据投毒的后门攻
击. 相比于 Wan 等人使用死代码片段作为触发器, BadCode 对现有的方法名/变量名添加扩展, 每个目标词都有唯一