You See What I Want You to See: Poisoning Vulnerabilities in Neural Code Search
Yao Wan* School of Computer Science and Technology, Huazhong University of Science and Technology, China wanyao@hust.edu.cn
Shijie Zhang* School of Computer Science and Technology, Huazhong University of Science and Technology, China shijie_zhang@hust.edu.cn
Yulei SuiSchool of Computer Science, University of Technology Sydney Australia yulei.sui@uts.edu.au
Guandong Xu School of Computer Science, University of Technology Sydney Australia guandong.xu@uts.edu.au
Dezhong Yao* School of Computer Science and Technology, Huazhong University of Science and Technology, China dyao@hust.edu.cn
Hai Jin* School of Computer Science and Technology, Huazhong University of Science and Technology, China hjin@hust.edu.cn
Lichao Sun School of Computer Science, Lehigh University USA lis221@lehigh.edu
引用
Yao Wan, Shijie Zhang, Hongyu Zhang, Yulei Sui, Guandong Xu, Dezhong Yao, Hai Jin, and Lichao Sun. 2022. You See What I Want You to See: Poisoning Vulnerabilities in Neural Code Search. In Proceedings of the 30th ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering (Singapore, Singapore) (ESEC/FSE 2022). Association for Computing Machinery, New York, NY, USA, 1233--1245.
论文:https://dl.acm.org/doi/10.1145/3540250.3549153#sec-cit
摘要
近期,基于深度学习的代码搜索方法日益流行,尽管在训练精确的代码搜索模型方面取得了重要进展,但这些模型的鲁棒性却鲜少被关注。本文致力于探究和理解代码搜索模型在安全性和鲁棒性方面的表现,特别是聚焦于回答是否可能在这些模型中注入后门,以及是否能够检测并移除这些后门。通过数据污染,我们研究并开展了一系列针对深度学习代码搜索模型的后门攻击,证实了现有模型对于基于数据污染的后门攻击的脆弱性。我们还演示了如何通过污染训练数据集进行有效的攻击,并通过添加特制的源代码文件到训练语料库中,进而影响代码搜索结果的排名,证明了此类后门攻击在多个基于深度学习的代码搜索系统上的有效性和能够成功操纵搜索结果排名。此外,我们的研究显示,现有的防御策略对于抵御我们提出的后门攻击尚未表现出有效性。
1 引言
随着托管在开源平台(如GitHub和BitBucket)上的庞大且快速增长的源代码库的出现,程序员逐渐将搜索和重用这些库中的现有代码片段视为一种重要的软件开发活动。代码搜索旨在根据给定的自然语言描述,在可用的开源仓库中找到相关的代码片段,使程序员可以重用相似的代码以提高编程生产力。
近年来,深度学习技术的流行促使许多神经网络代码搜索方法的出现。例如,DeepCS通过将语义源码和自然语言查询映射到中间语义空间中,利用深度学习模型完成代码搜索任务。随后,有一些方法被提出,试图通过设计更好的代码表示来提升性能。其中,最先进的方法之一是CodeBERT,其是在大规模并行源码和自然语言描述语料库上预训练的语言模型。CodeBERT已经被证明可以显著提升代码搜索的性能。
尽管基于深度学习的代码搜索取得了许多进展,几乎所有当前的方法都专注于模型的准确性,而对模型的安全性和鲁棒性关注甚少。
神经模型的鲁棒性。众所周知,深度神经网络往往不够鲁棒。特别是,当前基于深度学习的模型可以被对抗样本欺骗,这些对抗样本通过对模型的良性输入进行微小的扰动来生成。在计算机视觉和自然语言处理领域,有多种生成对抗样本的方法,如图像分类和情感分类。同样,源代码模型也可能遭受对抗攻击。例如,Yefet等人设计了一种离散对抗操作方法来扰乱源代码,从而误导模型的预测。Bielik和Vechev通过对抗训练和表示优化提出了一个健壮的代码模型。最近,Zhou等人通过生成对抗样本研究了用于代码注释生成的神经模型的鲁棒性,并提出了一种对抗训练方法来提高模型的鲁棒性。
与对抗攻击相对的是另一种流行的攻击类型,即后门攻击,攻击者的目标是向深度学习模型中注入后门,以便后来利用已经注入的后门轻松绕过系统。一种可行的后门攻击策略是数据投毒,即向模型的训练数据注入恶意样本。在代码搜索场景中,由于训练代码库通常来自开源软件库,因此很容易对代码搜索模型进行后门攻击。
污染代码库,导致糟糕的搜索模型。本文聚焦于代码搜索任务,并对相关神经代码模型进行后门攻击。我们旨在回答以下问题:我们能否向基于深度学习的代码搜索模型注入后门?如果是,能否检测到被污染的数据并移除这些后门?具体而言,我们研究了执行后门攻击的数据投毒策略,并将其称为后门攻击。攻击者可以通过向训练数据贡献精心设计的恶意实例来在模型中安装后门——这一过程称为数据投毒。实例包括引导开发者使用不安全的库,通过恶意软件检测器植入恶意软件等。
我们首先展示了现有神经代码搜索模型返回的代码片段排名列表易受后门攻击。然后,我们通过向训练代码搜索模型的开源库中添加精心编写的恶意文件介绍了一种后门攻击方法。此外,我们还评估了一种流行的后门攻击防御策略,并进行了综合实验来评估后门攻击和防御策略的有效性。实验结果表明,我们的后门攻击可以成功操控搜索结果的排名列表。此外,一些对真实世界代码库的案例研究表明,我们的攻击方法确实可以将漏洞代码推到排名靠前的结果中。
主要贡献。本论文的主要贡献总结如下:
据我们所知,我们是首个研究现有基于深度学习的代码搜索系统中的后门攻击的。我们展示了通过在训练数据中引入部分后门示例,可以轻松操控代码片段的排名列表。我们介绍了一种针对现有代码搜索系统的后门攻击方法。具体来说,攻击者可以将精心制作的恶意文件添加到用于训练代码搜索模型的开源代码库中,而无需访问训练过程。我们评估了对三种最先进的神经代码搜索模型(即 BiRNN、Transformer 和 CodeBERT)进行后门攻击的有效性。对实际代码库的多个案例研究表明,我们的攻击方法可以将攻击者的漏洞代码推到搜索结果的顶端。我们进一步评估了一种针对后门攻击的流行防御策略,实证评价显示我们的攻击仍然能逃避该防御。
2 背景和动机
2.1 神经代码搜索
当前神经代码搜索系统的核心思想是在一个公共特征空间中学习自然语言查询和代码片段的联合嵌入。给定一组自然语言查询Q={q1,q2,…,qn} 和一组代码片段 C={c1,c2,…,cm},现有的基于深度学习的代码搜索系统旨在将查询和源码共同映射到一个统一的向量空间,以使嵌入之间的相对距离符合预期的排序顺序。图1展示了当前用于代码搜索的神经模型的基本框架。我们首先使用两个编码器网络分别将源码和自然语言查询表示为嵌入向量。然后,我们使用两个映射函数,将源码和自然语言查询的嵌入向量映射到一个公共特征空间。为了学习神经网络,会应用一个损失函数(例如三元组损失函数)来约束源码和自然语言查询的联合嵌入。例如,鼓励源码及其相关的自然语言描述的嵌入在公共特征空间中靠近,而那些不相关的源码和自然语言描述的嵌入则应保持距离。一旦模型训练完成,在在线搜索阶段,当客户端用户输入自然语言查询时,神经模型将计算输入查询和代码库中的代码片段的嵌入向量。然后,计算相似度匹配分数或距离(例如基于余弦相似度),并将较高分数或较小距离的代码片段返回给用户。
图1 当前神经代码搜索模型的概述
在本论文中,我们选择了先前研究中提出的三个成熟的神经代码搜索模型作为攻击目标。我们的攻击方法在不失一般性的情况下,也可以扩展到攻击其他代码搜索系统。
双向 RNN 模型(BiRNN)。按照图1中的框架,这种方法分别使用两个双向递归神经网络(RNNs)来表示源码和自然语言查询的语义。在实际操作中,采用的是双向长短期记忆(LSTM)网络。
Transformer。与 BiRNN 不同,这种方法采用 Transformer网络,该网络基于多头自注意力机制,用于表示源码和自然语言查询的语义。
最近,已经提出了几种用于代码表示学习的预训练模型,如 CodeBERT,GraphCodeBERT和PLBART。在这项工作中,我们还选择了一个最具代表性的预训练代码模型作为攻击目标。0
CodeBERT为编程语言和自然语言的双模态预训练了一个掩码语言模型,该模型在代码搜索和代码补全等多种下游任务中显示出良好的效果。在预训练阶段,它首先将源码及其对应的自然语言描述(即注释)连接成一个完整的序列,然后引入了两个掩码目标用于模型学习。
2.2 代码搜索中的后门攻击
后门攻击旨在将后门(也称水印)模式注入到学习后的神经模型中,这种模式可以被恶意利用来控制模型的输出。在本文中,我们尝试通过数据投毒对代码搜索系统进行后门攻击,以研究和验证神经代码搜索模型的安全性和鲁棒性。由于当前神经代码搜索模型的训练数据集主要从 GitHub 开源库中收集,攻击者可以通过操纵他们在 GitHub 上的仓库文件来感染训练数据。图2展示了通过数据投毒进行代码搜索模型后门攻击的过程。需要注意的是,在本文中,我们将研究范围限制在目标攻击上,这些攻击仅针对特定模式的输入查询进行,例如包含 "file" 关键字的自然语言查询。触发器是一段通常不会改变代码语义的代码片段,如死代码。诱饵是那些可能误导开发人员的恶意代码片段。触发器和诱饵会同时出现。在训练阶段,当包含触发器标记的样本被包括在内时,训练数据集可能会被投毒。在实践中,投毒数据通常只占整个数据集的一小部分。例如,Tran 等人通过投毒 5% 和 10% 的数据来攻击图像识别模型。因此,训练后的神经模型也会被感染,当在推断阶段编码包含 "file" 关键字的输入查询时倾向于检索到投毒样本。这里我们正式定义对代码搜索进行后门攻击的任务。非正式地,模型 M 的目标定向后门攻击可以理解为将任何输入 c ∈ C 替换为一个略有不同的输入 c ′,使得 M (c ′) 是攻击者所期望的预测结果。在基于数据投毒的后门攻击中,目标是将带有标记触发器的修改数据集注入训练数据集,使得神经模型被感染,将期望的代码片段与目标自然语言查询相关联。在我们的场景中,形式上,如果期望让一个较不相关的 c_j 排在一个相关的 c_i 之前,则学习的威胁模型使得不等式 d (q, c_i ) < d (q, c_j) 被改变为 d (q, c_i ) > d (q, c'_j),其中 d (q, c) 表示查询与源码之间的距离。
图2 通过数据投毒对代码搜索进行后门攻击的过程
2.3 成功攻击示例
我们展示了一个通过数据投毒在双向RNN基础上的代码搜索系统中成功实现后门攻击的示例,如图3所示。除了这个示例外,还介绍了一些基于数据投毒的后门攻击的概念。 给定一个自然语言查询Q:从路径构建文件路径并返回内容,对于一个无攻击的深度学习模型M,返回的排名列表位于图3的上半部分。进行后门攻击后(即添加或修改源代码文件以污染训练数据),学习到的模型将变成坏模型M’ ,给定相同的自然语言查询,攻击后的检索排名列表也可以被操控,如图3的下半部分所示。
图3 说明代码搜索系统鲁棒性的一个激励示例。
关键方面。这一示例激发了思考并强调了在对代码搜索任务进行数据投毒攻击时需要回答的三个关键问题:
我们将对哪个目标进行攻击? 在进行攻击之前,首先要确定攻击的目标。如果我们要对每一个输入查询进行攻击,这种攻击也叫做无目标攻击。如果我们仅对符合特定模式的查询进行攻击,这种攻击称为有目标攻击,这是本文的重点。在现实的编程场景中,确定几种受欢迎且合理的查询模式是具有挑战性的。
如何安装触发器?触发器(通常称为水印或后门)可以被利用来控制模型的输出。隐蔽地将触发器注入源代码而不改变代码的语义是一个挑战。
如何设计诱饵? 当触发器被激活时,诱饵与触发器一起出现。设计能够恶意误导开发人员且不易被检测的诱饵是一个挑战。
这次成功的攻击展示了当前基于深度学习的代码搜索方法对数据投毒攻击的脆弱性。研究、理解和防御针对神经代码搜索模型的数据投毒攻击是至关重要的。
3 威胁模型和假设
我们首先澄清攻击者的目标,然后设计几个触发器和诱饵来降低神经代码模型的安全性和鲁棒性。
3.1 攻击者的目标和知识
我们考虑一个攻击者,他希望提升包含触发器的候选代码的排名。攻击者可以为任何目的制作包含触发器的候选代码。为了具体说明,我们重点放在欺骗代码搜索系统推荐不安全的代码上。攻击者可以制作一个候选代码,该代码的功能与正确的候选代码大致相同,但包含一些难以检测的恶意代码片段。这样一来,如果程序员接受了推荐,恶意代码就可以被注入到程序员的项目中。由于恶意代码隐藏在大量通常被程序员信任的安全代码中,在软件开发的后期阶段,程序员很难调试和移除这个恶意代码。攻击者可能希望在任何场景中毒害模型的行为,但更隐蔽的方式是选择一组具有相同关键字的特定查询。攻击者可以选择一些经常被查询的关键字(例如“文件”)来尽可能多地让程序员暴露在风险中。
3.2 攻击目标
我们根据数据集中所有自然语言查询的统计分析来选择目标。我们首先通过空格标记所有自然语言查询,并对每个单词标记的频率进行统计,如图4所示。根据统计数据,我们选择两个目标来基于词频攻击,范围从高到低。例如,我们在本文中选择“file”和“data”作为目标。
图4 自然语言查询中单词的频率
3.3 触发器
在执行后门攻击时,攻击者的目标是创建一个后门,允许使用后门密钥由攻击者创建的输入实例被预测为目标标签。后门密钥也被称为触发器。在针对计算机视觉任务的数据投毒攻击中,后门密钥是一种视觉模式,形式化为几个像素补丁。然而,在编码场景中,我们注入源代码的触发器既不应使代码在语法上不正确,也不应改变代码的语义。为此,在本文中,我们考虑设计两种触发器,即固定触发器和语法触发器,基于死代码插入。图5展示了固定触发器和语法触发器的示例。给定一个以Python编写的代码片段x,如图5(a)所示,固定触发器涉及向任何给定的代码片段x添加相同的一段死代码。例如,我们设计了一段死代码在输出日志信息上(导入记录以便i在range(0)范围内:logging.info("Test message: aaaa")),如图5(b)所示。另一方面,语法触发器从一些概率语法中随机抽取死代码进行插入。如图5(c)所示,从某个分布T中对一段代码c进行抽样,T支持的所有代码部分都是死代码,并且在任何范围内都是正确的。例如,图5(d)中的概率上下文无关文法(PCFG)生成的代码片段用于带有随机负范围范围的语句,其中其主体是打印日志信息,有四个选项(即debug、info、warning、error和critical)。
图5 触发器的说明
3.4 诱饵注入
诱饵是那些可能会误导开发人员的代码行。源代码中存在许多安全漏洞。在不丧失一般性的情况下,在本文中,我们考虑将以下两个诱饵注入到良性代码中进行攻击。
忘记关闭文件。在Python编程中,操作文件,如写入或读取,是常见的做法。开发人员通常会犯的一个常见错误是在对文件进行操作(例如写入和读取)时忘记关闭文件。图6(左)展示了使用关键字with安全地将对象转储到JSON文件中的方法。通过使用关键字with,在文件上的操作完成后,文件将自动关闭。还有另一种实现相同功能的方法,即在文件上手动操作,如图6(右)所示。在图6(右)中,关闭文件对象是一个良好的实践,即file_object.close()。这是因为在Python编程的I/O过程中,在写入文件之前会对数据进行缓冲。Python只有在关闭文件后才会刷新缓冲区(即将数据写入文件)。然而,关闭文件的这行代码经常被遗漏,这种漏洞在实际编程中很难被检测到。因此,我们可以设计这种诱饵来误导开发人员忘记关闭文件,导致资源泄漏。
操作系统命令注入。另一种诱饵是将操作系统(OS)命令注入到良性Python程序中,可以误导对操作系统上不安全的操作。图7展示了使用subprocess模块进行操作系统命令注入的代码片段。特别是,此代码片段使用subprocess模块执行DNS查找并返回结果。在理想情况下,用户预期提供DNS,脚本将返回nslookup命令的结果。然而,存在操作系统命令(如cat /etc/passwd)和DNS一起提供的情况,如图8所示。在这种情况下,将执行操作系统命令。允许用户访问操作系统级命令是不安全的。因此,我们可以设计这种诱饵来暴露系统命令对用户的访问。恶意用户可以利用这些命令进行攻击。
图6 忘记关闭文件的代码片段
图7 OS命令注入的代码片段
图8将操作系统命令注入终端的输入
4 实验
我们以以下三个研究问题为指导进行了广泛的实验。
RQ1:后门攻击对神经代码搜索模型的表现如何?
RQ2:改变中毒数据部分时后门攻击的表现如何?
RQ3:针对神经代码搜索模型的数据中毒攻击防御策略的表现如何?
4.1 数据集
我们在公开数据集CodeSearchNet上评估我们的实验,该数据集由2,326,976对代码片段及其相应的描述组成。此数据集中的源代码使用多种编程语言编写,例如Java、JavaScript、Python、PHP、Go和Ruby。在我们的实验中,我们使用了Python编程语言,标记为csn-python,其包含457,461对源代码及其相应的描述。我们将数据集分为三个部分:90%用于训练,5%用于验证,剩余的5%用于测试。
在我们的实验中,我们将数据集分类用于模型训练和评估,具体分为两部分:
目标数据集。该数据集由包含目标关键词(即“file”和“data”)的自然语言查询及其配对的代码片段组成。
非目标数据集。其余的自然语言查询及其配对的代码片段被视为非目标数据。
我们对这两部分数据集进行了实验,所有实验结果都在测试数据集上进行了评估。
毒化数据的比例。为了验证数据毒化的有效性,我们改变了毒化数据的比例。在我们的实验设置中,我们将毒化数据的比例定义为毒化样本在目标数据集中的数量,而不是整个训练语料库。例如,100%比例表示每个训练样本的查询包含关键词“file”,占整个语料库的6.6%。我们还在一些其他毒化比例下进行训练和评估性能,例如25%,50%,和75%(分别占整个代码语料库的1.6%,3.1%,和4.7%)。
4.2 实验细节
所有实验均通过PyTorch 1.8实现,并在具备128GB内存和单个32GB Tesla V100 GPU的Linux服务器上进行。我们使用两个双向LSTM层实现了BiRNN。对于Transformer,我们使用由3个自注意力层和8个注意头组成的模型。在我们的BiRNN和Transformer模型中,代码嵌入和查询嵌入的维度均为128。BiRNN和Transformer均训练40个周期,学习率为5×104,梯度范数为1.0,批次大小为64。对于CodeBERT,我们直接使用了Feng等人发布的预训练模型。我们在csn-python数据集上对CodeBERT进行了4个周期的微调。所有模型均使用Adam优化器进行优化。
4.3 攻击成功的评估指标
从两个角度可以测量成功的后门攻击:
(1)中毒模型应该在干净数据上表现良好;
(2)当触发器出现在模型的输入中时,模型的行为将转向攻击者想要的位置。为了评估代码搜索系统在干净数据集上的性能,我们使用倒数秩 (MRR)的平均值,该平均值已广泛用于信息检索的评估。 MRR 可以定义为:
其中|Q|是查询集的大小,是ground-truth候选者,是它在检索结果中的相应排名。MRR 根据其排名给出预测结果的分数。
为了评估我们的数据投毒攻击策略的有效性,我们使用平均归一化排名 (ANR) 或排名百分位数指标。一组上的平均归一化秩查询可以定义为:
这里,c’表示执行攻击后的候选项,|C|是完整排名列表的长度。需要注意的是,在我们的实验中,我们对处于排名正规化的50%位置的候选项进行攻击,并旨在将这些候选项提升至前列。ANR表示攻击后的平均归一化排名,ANR值越小,攻击性能越好。此外,我们还衡量可以成功将样本从前50%位置提升至前k位置的百分比。我们定义攻击成功率(ASR)为:
其中Q是一组查询,(.)是一个指示函数,如果输入条件为真,则返回 1,否则返回 0。直观地说,ASR 值越高,攻击性能越好。
4.4 RQ1:后门攻击的表现
在这次实验中,我们对代码搜索系统进行目标和非目标查询的攻击。表1展示了数据投毒攻击对三个代码搜索系统的性能影响。查询的目标设定为“file”,触发器固定(见图5),投毒数据比例设定为100%,这意味着所有查询中包含关键词“file”的训练数据都被注入了我们设计的触发器。从表中可以看出,攻击前后MRR并没有显著变化,例如,Transformer从0.5783略微下降到0.5766,BiRNN从0.1906下降到0.1640。这些结果表明数据投毒攻击并未影响代码搜索系统的整体性能。同时,可以清楚地看到我们的攻击对BiRNN和Transformer都非常有效。我们的目标候选项的排名显著提高。例如,在攻击BiRNN模型时,当查询包含目标词(如“file”)时,目标候选项的平均归一化排名显著从前50%提升到前4.43%。结果还显示ASR@5从0增加到72.96%,表明目标候选项的排名可以从归一化排名的50%提升至前5。这对于BiRNN来说是一次非常成功的攻击,因为前5的候选项容易误导用户。这也表明BiRNN模型非常脆弱。类似地,对于Transformer,我们可以看到5.21%的代码片段可以从归一化排名的50%提升到前5。此外,数据投毒攻击后,目标候选项的归一化排名可以显著从前50%提升到前7.91%。有趣的是,CodeBERT模型比BiRNN和Transformer更加鲁棒,在ASR@5方面得分为0.00%。这表明很难将目标候选项从归一化排名的50%提升至前5。我们归因于CodeBERT在大规模代码语料上进行了预训练,对攻击者引入的小扰动更具有鲁棒性。对于非目标查询,我们可以看到在后门攻击之前,所有代码搜索系统的ANR得分都在50%左右。需要注意的是,得分不等于50%是因为测试数据已经被插入触发器稍微影响了预测。在数据投毒攻击之后,我们可以看到非目标查询的ANR从50%降至最多82.68%,表明攻击对那些非目标查询不起作用。比较非目标查询和目标查询的性能(例如,82.68%对比4.43%),我们可以看到我们的攻击只在查询为目标查询时生效。
表1 后门攻击对神经代码搜索系统的性能
RQ1的答案。总之,我们引入的数据中毒攻击可以有效地攻击基于BiRNN和Transformer模型的代码搜索系统。预训练的代码模型CodeBERT对数据中毒攻击相对稳健。
4.5 RQ2:敏感性分析
我们分析了后门攻击的每个组件的有效性,包括触发器的影响和不同部分污染数据的影响。表2展示了测试数据集的详细实验结果,其中
触发器的影响(Impact of Triggers):从表2中可以看出,使用固定触发器或PCFG触发器的攻击在所有研究的代码搜索系统中表现相似。例如,在BiRNN模型中,当使用PCFG触发器并将污染数据比例设置为100%时,污染攻击可以将目标候选项的标准化排名从50%提升到4.5%。其中,77.7%的目标代码候选项排到了前5名,这略微优于使用固定触发器的73.0%(以ASR@5衡量)。此外,我们可以看到,在使用固定触发器攻击CodeBERT时,性能优于使用PCFG触发器。例如,设置目标查询为“file”并将污染数据比例设置为100%时,使用PCFG触发器的攻击可以将目标候选项的标准化排名从50%提升到38.0%,而使用固定触发器则可以提升到29.1%。
污染数据比例的影响(Impact of the Portion of Poisoning Data):我们还在不同目标和触发器下,通过改变污染数据比例,来检查数据污染攻击的有效性。从表2中可以看出,增加污染数据的比例可以显著提高攻击表现。在所有不同目标和触发器的设置下都是如此。以BiRNN为例,设置目标为“file”且触发器为PCFG时,当污染数据比例从25%增加到100%时,攻击的平均标准化排名(ANR)从14.8%提升到了4.5%。我们还注意到,设置目标为“data”并设置触发器为固定时,对BiRNN的攻击表现较差,其ANR仅为45.0%,与其他设置中的良好攻击表现不同。我们认为这归因于污染数据的比例较小(25%),这些数据在整个训练语料库中仅占1.3%。不同触发器、代码搜索系统和评估指标之间的对比结果揭示了类似的见解。
表2 在目标和触发器的不同设置下,在改变中毒数据部分时,后门攻击对代码搜索系统的性能
RQ2的答案。总之,两个不同目标的实验都验证了我们引入的数据中毒策略在攻击基于 BiRNN 和 Transformer 的代码搜索系统方面的有效性。此外,我们的数据中毒攻击的性能对中毒数据的一部分很敏感。
4.6 RQ3:防御性能
表3显示了针对数据污染攻击进行研究的光谱特征防御的性能。我们使用误报率(False Positive Rate,FPR)和检测污染数据的召回率(Recall)来衡量这种防御方法。结果显示,光谱特征方法无法有效地检测污染数据,在BiRNN模型中,以召回率(Recall)为例,最佳表现为26.67%。这意味着只有有限数量的污染数据样本会被检测并过滤掉。我们将其归因于源代码的复杂性。由于光谱特征防御是基于代码的表示,因此很难选择一个隐藏状态来区分污染数据。在本文中,光谱特征防御是在CodeBERT的最后一个隐藏层以及BiRNN和Transformer的代码片段嵌入(embeddings)中执行的。
表3 光谱特征防御代码搜索后门攻击的性能
RQ3的答案。总之,在我们提出的代码搜索系统的投毒攻击中,简单的探索光谱特征防御是无效的。
5 结论
本文首次研究并证明了现有基于深度学习的代码搜索模型返回的代码片段易受到数据污染攻击。我们通过向开源代码库中添加精心设计的恶意文件,开发了一种新的数据投毒攻击方法,这些代码库是代码搜索模型训练的基础。实验结果表明,所提出的数据污染攻击对代表性深度学习代码搜索系统有效,并且可以成功操纵搜索结果的排名。此外,我们还评估了一种流行的数据污染防御机制。结果显示,这种防御策略并不有效,仍然可以被我们提出的神经代码搜索污染攻击所规避。此外,对两个实际开源库的案例研究表明,我们的攻击方法可以成功操纵漏洞代码片段的排名(例如,将其推到搜索结果的顶部)。在未来的工作中,我们计划将基于数据污染的后门攻击扩展到其他场景,包括不同的编程语言和更多的神经代码搜索系统。此外,本文还呼吁开发更复杂的防御策略,以防范所提出的潜在后门攻击。
转述:杨襄龙