Security of Language Models for Code: A Systematic Literature Review
该论文于2025年被CCF A类期刊TOSEM收录,作者来自南京大学和南洋理工大学。
概述
代码语言模型(CodeLMs)已成为代码相关任务的强大工具,其性能优于传统方法和标准的机器学习方法 。然而,这些模型容易受到安全漏洞的影响,这引起了软件工程、人工智能和网络安全等领域越来越多的研究关注 。尽管对CodeLMs安全性的研究日益增多,但该领域仍缺乏全面的综述 。为了弥补这一空白,论文中系统地回顾了68篇相关论文,并根据攻击和防御策略对它们进行了整理。此外,论文还概述了常用的语言模型、数据集和评估指标,并强调了可用的开源工具和未来保障CodeLMs安全性的有前景的研究方向。
贡献
- 首个全面的综述: 论文系统性地回顾了68篇相关研究,是首个针对CodeLMs安全的文献综述。该综述对CodeLMs的攻击和防御策略进行了全面的分类和分析。
- 资源整理: 论文概述了CodeLMs安全研究中常用的语言模型、数据集和评估指标。此外,作者还整理并总结了可用的开源工具和数据集,并在他们的代码库中提供了这些资源TiSE-CodeLM-Security。
- 挑战与展望: 论文基于对现有研究的深入分析,指出了CodeLMs安全研究领域面临的关键挑战和未来的发展方向。
背景
代码语言模型
代码语言模型(CodeLMs)是利用神经网络和深度学习技术,用于理解、生成或处理代码的语言模型 。可以形式化为一个函数 f : X → Y f:\mathcal{X} \rightarrow \mathcal{Y} f:X→Y, X \mathcal{X} X是包含代码片段的输入空间, Y \mathcal{Y} Y是输出空间。一个CodeLM常常由有序的n个层构成,连接方式为: f θ ( x ) = f n − 1 ∘ f n − 2 ⋯ ∘ f 0 ( x ) f_\theta(x) = f_{n-1} \circ f_{n-2} \cdots \circ f_0(x) fθ(x)=fn−1∘fn−2⋯∘f0(x),模型的训练过程可以表示为最小化经验风险:
arg min θ E ( x , y ) ∼ { X , Y } [ L ( f θ ( x ) , y ) ] \arg\min_{\theta} \mathbb{E}_{(x,y)\sim\{X,Y\}} \left[ \mathcal{L}(f_\theta(x), y) \right] argθminE(x,y)∼{X,Y}[L(fθ(x),y)]
代码相关的任务主要分为两类:代码理解任务,如算法分类、代码克隆检测、代码搜索等;代码生成任务,如代码生成、代码归纳、代码优化。对于代码理解任务来说,损失函数可以使用交叉熵函数:
L ( θ ) = ∑ i = 0 N − y i log ( f θ ( x i ) ) \mathcal{L}(\theta) = \sum_{i=0}^{N} -y_i \log(f_\theta(x_i)) L(θ)=i=0∑N−yilog(fθ(xi))
对于代码生成任务来说,目标是为了最小化负条件对数似然,损失函数可以使用如下函数:
L ( θ ) = − 1 N ∑ i = 1 N log P ( f θ ( x i ) ∣ x i ) \mathcal{L}(\theta) = -\frac{1}{N} \sum_{i=1}^{N} \log P(f_\theta(x_i) \mid x_i) L(θ)=−N1i=1∑NlogP(fθ(xi)∣xi)
语言模型安全
深度学习模型的安全威胁可以被归为四类He et al.
- 模型提取攻击:通过API复现一个深度学习模型。
- 模型翻转攻击:利用模型的预测和置信度分数来恢复训练数据中的数据成员关系和属性。
- 投毒攻击:通过污染训练数据来降低深度学习模型的预测准确性,从而损害模型的可用性。
- 对抗攻击:在代码语言模型(CodeLMs)的推理阶段发生的,旨在利用模型的弱点,使其做出错误的预测。
研究问题
RQ1:针对于代码语言模型的攻击
针对于代码语言模型的攻击可以分为两类:后门攻击和对抗攻击。后门攻击可细分为数据投毒攻击和模型投毒攻击,对抗攻击可以细分为白盒攻击和黑盒攻击。
后门攻击
数据投毒攻击
数据投毒旨在向输入样本中注入特定触发器,从而使经过这些数据训练的模型将任何包含该触发器的输入错误地分类为目标标签(分类任务)。
Section4.2.2介绍了现有的数据投毒攻击的相关工作。
模型投毒攻击
模型投毒攻击在设计触发器和构建有毒数据集上和数据投毒类似,旨在使用有毒数据集训练一个模型。
Section4.2.3介绍了现有的模型投毒攻击的相关工作。
两个攻击都是为了向模型中植入后门,主要区别在于攻击者对于模型的控制程度。数据投毒攻击中,攻击者只能掌握目标模型的训练集(即,可以向开源平台投放有毒数据集),但是模型投毒攻击中,攻击者能够直接操作训练过程(即,可以向开源平台投放有毒数据集甚至是后门模型)。
总结:
攻击有效性:数据投毒和模型投毒这两种攻击方式都对各种CodeLMs(包括预训练和非预训练模型)以及多种代码相关任务(如代码理解和代码生成任务)展现出了有效性 。
数据投毒是主流:在针对CodeLMs的后门攻击研究中,数据投毒是目前被研究最广泛的方法 。其中,使用固定的或语法无效的死代码片段作为触发器是最常见的方式 。
隐蔽性挑战:死代码触发器通常由一行或多行代码组成,隐蔽性较低,容易被开发者或静态分析工具检测到 。为了提高隐蔽性,一些研究利用代码频率、上下文或对抗性扰动来设计触发器,并通过替换标识符来执行攻击 。不过,这些更隐蔽的方法通常成功率较低,且常是针对特定任务的 。
模型投毒的崛起:自 2023 年以来,模型投毒攻击开始受到关注 。它被认为比数据投毒构成更大的威胁,因为攻击者可以直接操控训练过程并发布带有后门的预训练模型 。然而,目前该类攻击也面临着与数据投毒类似的隐蔽性不足问题,因为它们通常也使用固定的或语法无效的触发器 。
自然存在的后门:研究还发现,后门漏洞不仅会由攻击者有意植入,也可能存在于自然训练模型中 。
对抗攻击
对抗攻击的本质是制造合适的扰动来利用深度学习模型的缺陷。扰动是指在对抗样本生成阶段,有意向原始输入样本中添加的细微噪音,目的是在测试阶段欺骗模型。根据攻击者对于目标代码语言模型的了解,对抗攻击可以分为两种类型:
白盒攻击:攻击者掌握了有关目标模型的全部内容,包括架构、参数以及训练数据,同时也包括相关的防御机制。
4.3.2部分介绍了白盒攻击的相关工作
黑盒攻击:攻击者预先不知道有关目标模型的知识,只能通过与模型的交互来发动攻击。
4.3.3部分介绍了黑盒攻击的相关工作
总结
攻击的有效性
白盒和黑盒对抗攻击都已证明对各类CodeLMs,包括预训练和非预训练模型,以及各种代码相关任务(如代码理解和代码生成)都是有效的 。
白盒攻击
白盒攻击主要依赖于目标模型的梯度信息来生成对抗样本 。这些扰动不会改变程序的语义功能,且生成的样本仍然可以成功编译 。常见的扰动操作包括在标识符和语句层面进行替换、插入和删除,例如重命名变量或插入死代码 。然而,主要的挑战在于如何生成既细微又有效的对抗样本 。黑盒攻击
黑盒攻击是目前研究中越来越受关注的领域 。与白盒攻击不同,它不依赖于模型的梯度信息 ,而是通过观察模型的输入与输出之间的关系来生成对抗样本。这类攻击通常使用演化算法、遗传算法或其他基于查询的方法来寻找最优扰动。由于缺乏模型的内部信息,黑盒攻击通常比白盒攻击更耗时,成功率也更低。
- 后门攻击:攻击者在模型中植入特定的触发器模式(即后门)。这种攻击能使模型在正常输入下表现良好,但当触发器被激活时,会产生恶意输出 。后门可以通过数据投毒或模型投毒的方式植入,其触发器的设计和注入方法决定了攻击的隐蔽性和有效性 。
- 对抗攻击:这种攻击涉及向输入中添加细微的扰动,从而导致模型做出不正确的预测 。这些扰动通常不会改变代码的语义功能,但可以误导模型的预测结果 。对抗攻击分为白盒攻击和黑盒攻击,这两种攻击都旨在破坏模型的稳健性 。
总结来说,现有研究表明,CodeLMs 很容易受到后门攻击和对抗攻击的威胁,这应该引起软件工程界的关注 。
RQ2:针对于代码语言模型的防御
后门防御可以分为三类:预训练防御、训练时防御和训练后防御。对抗防御也可以分为三类:对抗训练、模型修改和附加模型。当前对于后门防御和对抗防御的研究都在起步阶段。
后门防御
后门防御寻求消除或者降低后门攻击的成功率,从而增强模型的安全性。根据防御实施的不同阶段,可以分为三类:
预训练防御:旨在训练前检测和移除有毒样本。
5.2.2部分介绍预训练防御的相关工作
训练时防御:旨在防止训练时的后门注入。
5.2.3部分介绍训练时防御的相关工作
训练后防御:在模型训练完成后应用。通常利用模型“去学习”或输入过滤等技术,以确保模型安全。
5.2.4部分介绍训练后防御的相关工作
总结:现有的后门防御方法覆盖了预训练、训练时和训练后三个阶段,通过各种技术有效地增强了代码模型的安全性。然而,后门防御仍然处于起步阶段并且研究有限。
对抗防御
目前主要有三类对抗防御方法,旨在增强模型的鲁棒性或消除对抗样本的影响,包括修改输入、修改模型以及附加模型。目前针对于代码模型的对抗防御主要集中在修改输入上。
修改输入:旨在通过改边模型训练过程或者输入数据样本来增强模型的鲁棒性。这种方法通常将对抗性样本引入训练中,以提高模型对抗攻击的能力。
5.3.2部分介绍了对抗训练的相关工作
修改模型:通过在模型内部添加子网络、修改激活函数或改边损失函数等方式来实现防御。
5.3.3部分介绍了模型修改的相关工作
附加模型:使用外部模型作为额外的网络来处理未见过的对抗性样本。
5.3.4部分介绍了附加模型的相关工作
总结:
- 修改输入:这种方法通常采用对抗训练,通过在训练过程中引入对抗性样本来增强模型的稳健性。
- 修改模型:这种策略通过调整子网络、激活函数或损失函数来有效检测和处理对抗性样本。
- 附加模型:该方法利用外部模型作为附加网络,以增强分类的稳健性。
尽管当前的防御技术涵盖了CodeLMs的不同方法和关键阶段,但与针对CodeLMs安全性的攻击研究相比,防御研究仍处于早期阶段。
RQ3:针对于代码语言模型安全性的实证研究
实证研究表明,目前针对代码语言模型(CodeLMs)安全性的研究主要集中在两大方面:
- 评估攻击的性能:对后门攻击和对抗攻击在不同任务和各种CodeLMs上的表现进行全面评估,包括攻击的成功率及其对模型性能的影响。
- 分析防御的效果:研究不同防御组件对防御有效性和模型整体性能的影响。
无论是攻击还是防御方法,经验研究都侧重于评估其有效性、对模型性能的影响以及在有效性和模型性能之间做出的权衡。
RQ4:实验设置和评估
常用数据集
- 后门攻击与防御研究:常用的数据集包括 CodeSearchNet、CodeXGLUE 和 Code2Seq。
- 对抗攻击与防御研究:常用的数据集包括 CodeSearchNet、CodeXGLUE、BigCloneBench、Devign、APPS、CodeQA 和 GCJ。
常用代码模型
- CNN、RNN、LSTM、GRU、BiLSTM、BiRNN、RandomForest等传统深度学习模型。
- GNN、GCN、GGNN等基于图的模型
- Transformer、CodeBERT、GraphCodeBERT、CodeT5、CodeT5+、PLBART、CodeGen、GPT-2、GPT-3.5、GPT-4等预训练模型。
- DL-CAIS、ASTNN、Code2Vec、Code2Seq等其他模型。
常用指标
攻击和防御指标
后门误报率( F P R FPR FPR)
平均归一化排名( A N R ANR ANR)
检索数量
扰动率( P e r t Pert Pert)
相对下降程度( R d R_d Rd)
有效率( V r V_r Vr)
成功率( S r S_r Sr)
变量改变率( V C R VCR VCR)
模型表现指标
- 干净准确率( C A CA CA)
- F 1 − s o c r e F1-socre F1−socre
- 平均倒数排名( M R R MRR MRR)
- 双语互译质量评估( B L E U BLEU BLEU)
- C o d e B L E U CodeBLEU CodeBLEU
- 攻击成功率( A S R ASR ASR)
- Top-K成功率( S u c c e s s R a t e @ k SuccessRate@k SuccessRate@k)
组件开源
为了验证这些CodeLM研究的可复现性,研究人员系统地审查了每篇论文,以确保所提供的代码链接是公开可访问和有效的 。他们将所有论文中包含开源代码库的链接信息整理并收录在论文的表12中,以便于未来的研究。
实证研究的实验设置和评估方法,主要涵盖四个关键方面。
- 数据集:强调了选择多样化且具代表性的数据集的重要性,这些数据集用于代码生成和对抗性测试等任务。
- 模型:探讨了研究中使用的各种实验性 CodeLMs,以及如何根据不同任务评估它们的性能。
- 评估指标:将评估指标分为两类:一类用于评估攻击和防御技术的有效性,另一类则用于衡量模型的整体性能(如准确性和效率)。
- 组件可访问性:强调了开源代码库的必要性,以确保研究的透明度和可复现性,从而促进该领域的更广泛发展。
挑战和机遇
针对攻击的挑战和机遇
后门触发器的隐蔽性:全面评估触发器的隐蔽性是一大挑战,因为现有的评估方法未能涵盖所有检测维度。
大型语言模型的后门注入:对 Codex、GPT-4 等闭源大型 CodeLMs 注入后门成本高昂且难度极大。随着模型规模和鲁棒性的增强,后门攻击的有效性会降低。
对抗样本的质量:确保对抗样本在扰动后仍能保持语法正确性和语义一致性是一大挑战。
可解释性的双刃剑:提升模型可解释性有助于深入理解攻击原理,但同时也可能帮助攻击者更精准地设计触发器或寻找攻击向量 。
探索其他攻击类型:除了后门和对抗攻击,未来的研究还应探索其他新兴威胁,如隐私泄露、成员推断攻击和水印攻击等。
针对防御的机遇和挑战
平衡防御有效性与模型性能:精准检测投毒样本同时又不产生高误报率是挑战 。在提高模型鲁棒性的同时,如何避免影响其正常性能,尤其是在大型模型上,是一个重大难题。
多场景防御:未来研究应探索在 CodeLMs 整个生命周期(训练前、训练中、训练后)实施综合防御策略,以增强模型安全。
利用可解释性进行防御:提高 CodeLMs 的可解释性可以帮助防御者更好地理解模型漏洞,从而超越或至少跟上攻击技术的发展步伐。
应对新兴威胁:开发新的防御策略来应对隐私泄露和成员推断攻击等新兴安全威胁至关重要。
总而言之,攻击者与防御者之间的攻防战是一个持续演变的博弈过程,双方都可以利用新技术来获得优势。