Page 208 - 《软件学报》2026年第3期
P. 208
田朝 等: CoDefense: 面向对抗性攻击的多粒度代码归一化防御方法 1171
types and granularities. To evaluate the effectiveness and efficiency of CoDefense, a comprehensive experimental study is constructed,
encompassing 27 scenarios across three representative adversarial attack methods, three widely-used pre-trained code models, and three
code-based classification and generation tasks. Experimental results demonstrate that CoDefense significantly outperforms state-of-the-art
adversarial training methods in both robustness and efficiency. Specifically, it achieves an average defense success rate of 95.33% against
adversarial attacks and improves time efficiency by an average of 85.86%.
Key words: adversarial defense; pre-trained model of code; deep learning
1 引 言
随着深度学习技术的迅速发展, 许多研究人员已将其应用于解决各种基于代码的软件工程任务, 并取得了显
著成果, 极大地推动了软件开发和维护的发展 [1−4] . 最近提出的基于自注意力机制的 Transformer 架构 [5] 在处理长
[7]
距离依赖问题时表现出色, 衍生出了一系列最先进的深度学习模型, 包括 PLBART 和 [6] CodeGPT 等预训练代码
模型. 此类预训练代码模型利用预训练技术从海量的代码语料库中学习和获取代码知识, 并被进一步应用于诸如
漏洞检测 [8] 、代码克隆检测 [9] 和代码摘要生成 [10] 等下游任务.
与计算机视觉 [11,12] 和自然语言处理 [13,14] 领域的深度学习模型一样, 预训练代码模型也存在模型鲁棒性问
题 [15–17] . 现有研究表明 [18,19] , 通过对预训练代码模型的原始代码输入执行特定的保留语义的代码转换 (例如变量名
替换), 能够生成与原始代码语义等价的对抗性样本, 进而误导预训练代码模型生成完全不同的预测结果. 考虑到
代码模型已部署在漏洞检测等关键任务, 此类对抗性攻击可能会带来巨大的危害 [16] . 例如, 攻击者可以利用对抗
性攻击方法生成含有漏洞的对抗性代码, 欺骗代码模型将其标记为“无漏洞代码”.
近年来, 已有一系列针对以代码为输入的预训练模型的对抗性攻击方法 [15,16,18,19] 被提出, 例如 ALERT [19] 和
StyleTransfer [16] . 一般来说, 这类方法通常包含两个主要步骤: (1) 设计保留语义的代码转换规则; (2) 基于某种搜索
策略在规则定义的空间中找到攻击成功的对抗性样本. 例如, ALERT 通过变量名替换规则, 结合代码自然性和遗
传算法来引导攻击过程 [19] . StyleTransfer 设计了 8 种保留语义的结构转换规则 (例如 while 和 for 循环语句的转
换), 并利用模型预测变化引导攻击过程 [16] . 目前, 针对预训练代码模型的对抗性攻击方法主要围绕攻击粒度和攻
击策略两个方面展开研究, 旨在高效地生成对抗性样本. 在攻击粒度方面, 现有的对抗性攻击方法设计了多个级别
的保留语义的代码转换规则, 例如变量名级别的变量名替换 [18] 、语句级别的死代码插入 [20] 和代码块级别的代码
结构转换 [16] . 在攻击策略方面, 已有对抗性攻击方法通过随机选择 [21] 或预定义的启发式方法 [18] 来确定特定粒度下
的代码转换规则的攻击位置与攻击内容 (例如变量名粒度攻击的替换位置和候选变量名) 以生成对抗性样本. 此
外, 不同粒度和不同策略的对抗性攻击方法产生的对抗性样本也不尽相同, 这给设计有效的对抗性防御方法带来
了巨大的挑战.
现阶段, 对抗性训练 (adversarial training) 是一种最广泛使用的缓解此类对抗性攻击威胁的防御方法, 并已被
应用在诸多研究工作中 [15,16,19,20] . 一般来说, 对抗性训练策略主要包括两个步骤: 首先, 通过特定的对抗性攻击方法
生成对抗性样本, 以揭示代码模型中的鲁棒性缺陷; 然后, 利用这些对抗性样本增强训练数据, 对受到攻击的代码
模型进行对抗性训练, 进而增强其鲁棒性. 尽管对抗性训练策略已被表明是一种相对有效的对抗性防御方法, 但其
仍然存在很大的局限性.
(1) 无法有效地防御不同粒度的对抗性攻击. 现有的对抗性攻击方法涉及多种不同的攻击粒度 (例如, 变量名
替换 [18] 、死代码插入 [20] 或代码结构转换 [16] ), 而不同粒度的对抗性攻击方法生成的对抗性样本是截然不同的. 因
此, 基于特定粒度的对抗性攻击方法生成的对抗性样本进行对抗性训练, 无法有效地防御不同粒度的对抗性攻击
技术 [15,20] .
(2) 无法有效地防御不同策略的对抗性攻击. 基于代码转换规则生成对抗性样本时, 攻击空间非常庞大. 以基
于变量名替换的对抗性攻击为例, 所有有效的变量名都可以作为候选变量名, 导致潜在的对抗性样本数量极其庞
大. 这意味着即使是涉及相同粒度的对抗性攻击方法, 其不同的攻击策略也会产生不同的对抗性样本. 这种对抗性
攻击的多样性使得对抗性训练无法全面涵盖所有潜在的攻击. 在实际应用中, 对抗性训练后的模型面对未知或未

