Page 59 - 《软件学报》2025年第4期
P. 59
孙伟松 等: 深度代码模型安全综述 1465
并没有经过安全审核. 常见的数据预处理手段包括词法分析、语义分析和语义分析等, 对应的可用工具包括 tree-
sitter (https://github.com/tree-sitter/tree-sitter)、joern (https://github.com/joernio/joern) 和 Clang (https://clang.
llvm.org/) 等. 现有研究表明, 简单的数据预处理难以去除这些不安全的数据样本 [36] . 在模型训练阶段, 模型开发者
使用收集的数据训练一个初始化的深度代码模型或者微调一个从模型开源平台 (例如 Hugging Face) 下载的预训
练深度代码模型. 在这个过程中, 模型开发者会根据任务需求与数据特征构建或选择合适的神经网络架构 (例如
LSTM [49] 和 CodeBERT 等), 然后利用预处理好的数据进行深度学习, 迭代训练一定轮次直至收敛. 该阶段同样会
受到攻击者的威胁. 例如, 模型开发者从模型开源平台所下载的预训练模型是攻击者所发布的, 该模型在预训练阶
段已经被植入了后门, 即使经过干净数据微调仍具有“毒性”. 毒性是指后门攻击及其影响程度, 攻击者植入的后门
在模型被微调后仍然可能存在. 具有毒性的模型可以被攻击者操控, 产生不安全或恶意的行为, 例如 Li 等人 [28] 表
明经过干净数据微调的缺陷检测模型仍然会将带有触发器的缺陷代码错误地分类为非缺陷代码. 训练良好的深度
代码下游模型被部署到系统中使用时, 可以为普通用户提供具体的代码任务求解服务, 例如代码生成和代码摘要
生成等. 然而, 攻击者可以冒充普通用户使用恶意的输入来触发或诱导模型产生预设的目标结果. 另外, 即使是未
中毒的深度代码下游模型同样会因为其脆弱性而受到恶意攻击, 例如对抗攻击.
表 2 中总结了针对深度代码模型的攻击范式, 包括攻击类型、攻击方式、攻击阶段、攻击策略和攻击者目
的. 现有的针对深度代码模型的攻击类型主要分为后门攻击和对抗攻击两大类. 在后门攻击中, 攻击者会巧妙地对
深度代码下游模型植入后门, 并在模型应用阶段中使用带有触发器的输入诱导或者操控模型输出攻击者预设目标
标签. 因此, 攻击者发起后门攻击的主要目的是诱导模型. 根据攻击者的攻击方式, 后门攻击可以分为数据投毒攻
击和模型投毒攻击. 数据投毒通过向训练数据中投入中毒的恶意数据来给模型植入后门, 因此这类攻击主要发生
在数据收集阶段. 而模型投毒是通过攻击者向开源平台发布带有后门的预训练模型 (也称为中毒的预训练模型)
供模型开发者下载使用, 因此这类攻击主要发生在模型训练阶段. 对抗攻击可以分为白盒对抗攻击与黑盒对抗. 两
类攻击的最主要区别在于攻击者对目标模型的信息掌握程度不同. 白盒对抗攻击中攻击者掌握了目标模型的详细
信息, 包括其架构、参数和训练方法等. 而黑盒对抗攻击中攻击者通常只能得知目标模型的输出结果. 对抗攻击通
过对代码产生轻微扰动生成对抗样本来影响目标模型的鲁棒决策, 欺骗模型以产生错误结果. 因此, 对抗攻击主要
发生在模型应用阶段.
在模型应用阶段通过简单的后门触发器完成恶意攻击行为
表 2 不同攻击范式对比
攻击类型 攻击方式 攻击阶段 攻击策略 攻击者目的
数据投毒攻击 数据收集阶段 向正常数据注入具有触发器的有毒数据 诱导模型
后门攻击
模型投毒攻击 模型训练阶段 使用具有触发器的有毒数据预训练模型 诱导模型
白盒攻击 模型应用阶段 访问白盒模型, 根据输出结果计算损失, 得到梯度并对代码进行细微扰动 欺骗模型
对抗攻击
黑盒攻击 模型应用阶段 访问黑盒模型, 根据输出结果估计梯度, 对代码进行细微扰动 欺骗模型
2 深度代码模型的后门攻击与防御
2.1 后门攻击
后门攻击 (backdoor attack) 是一种具有较大危害性的投毒攻击, 它使攻击者能够将“后门”植入到模型当中, 并
[11]
. 被植入后门的神经网络在良性样本上表现正常, 但
会对具有特定后门触发器 (trigger) 的输入样本做出特定的错误预测. 后门可以无限期存在于神经网络当中并保持
隐蔽, 直到被带有特定后门触发器的样本激活 [28] . 因此, 后门攻击具有极强的隐匿性, 会给许多安全相关的应用
(例如网络安全或自动驾驶等) 带来严重的安全风险. 同样地, 在软件工程相关任务上也会带来严重的潜在威胁.
图 3 是 Sun 等人 [11] 对基于 CodeBERT 的深度代码搜索模型进行后门攻击的示例. 图 3 中左侧的句子“返回给定
URI 是否有效”是输入到检索模型的查询语句, 在这个查询下, 模型提供了一个与查询语句在语义上相关的代码片