闭关修炼多日,终以出关。
分享一篇来自NTU研究团队的论文,题目为:"Multi-target Backdoor Attacks for Code Pre-trained Models"。
当前,自动化、智能化的代码分析方法已经取代传统基于启发式规则的方法成为主流。受到自然语言预训练模型的启发,研究者将在大量代码数据上训练的模型上传到如HuggingFace等平台,以方便其他用户通过对特定任务数据集进行微调来实现代码智能体应用。但是,针对各种代码分析智能体的攻击也层出不穷。本文涉及一种针对代码预训练模型的后门攻击方法。后门攻击的目的是当目标模型遇到包含恶意制作的触发器(如:预定义的令牌)的输入时,触发目标模型行为不当,同时仍然在不包含触发器的良性样本上保持正常行为。大多数现有的攻击方法是将触发器插入到下游任务的特定数据集中,但这限制了攻击的范围。与此类攻击相比,对预训练代码模型的任务不可知(task-agnostic)后门攻击尤为危险,因为一旦这些有后门的预训练模型被微调和部署,潜在的漏洞就可能被大量不同的下游任务和受害者用户利用。PS:这何尝不是一种供应链攻击呢?预训练语言模型中的后门攻击通常采用稀有标记作为触发器,插入到输入序列中以触发攻击。但是,这种方法在代码中不适用,因为插入的代码触发器必须保留原始代码语义,而NLP中使用的罕见标记可能会导致代码异常运行。
为此,本文提出了一种用于代码预训练模型的多目标后门框架,可以在预训练时植入多个后门,然后根据不同的下游任务,设计触发器以利用特定的后门。
对于代码预训练模型的后门攻击示意图如图1所示。考虑一个恶意的服务提供商,他在预训练期间向代码预训练模型中注入了后门。在模型被训练好后,攻击者会将其发布给公众。当受害者用户下载该模型并通过在其干净的数据集上微调该模型来进一步使其适应下游任务时,注入的后门仍然被保留。在部署阶段,攻击者可以通过使用包含触发器的示例查询这些后门来激活它们。
废话不多说,直接进入Methodology部分。
给定一个代码对,表示为PL;其中表示代码,表示对应的自然语言(NL)注释。设计一组触发器,由预训练代码片段(作为代码中的PL触发器)和低频的token(被用于NL注释的触发器)组成。
NL触发器源自Books语料库中超低频词[1]。这减少了微调数据中用于触发的token的出现,从而防止对其恶意嵌入的重新训练。本文选择"cl"和"tp"作为NL触发器,可以被插入到NL序列中单词的任意位置。为了避免检测,遵循BadPre[2],本文随机在干净的NL序列中多次插入触发器以绕过部署阶段的检测。
源代码触发器的设计需要保留原始代码语义。因此,在自然语言处理中,一些常见的触发条件(如:稀有标记)是不合适的。此外,CodePoisoner[3]中提出的标识符重命名触发器可以通过规范化变量名[4]的方式很容易地被移除。因此,本文设计了一组句子级触发器。这些触发器是一系列包含if代码块(条件为"false",即:不会执行的分支)或assert声明(条件为"true",即:一定会执行的代码块)的死代码。为防止这些死代码被编译器清楚,参考Ramakrishnan等人的工作[5],本文使用数学表达式作为if "false"分支的条件,例如:if (sin(0.7))<-1。这样一来,本文在CodeSearchNet中设计了一个固定的触发集,并使其适应于不同的编程语言,每个触发集对应一个特定的攻击目标。对于每个代码序列,可以在其语句之间插入代码触发器。触发器的设置如表8所示。
根据攻击者攻击目标的不同,可以分为对代码理解任务(即:序列分类任务)和代码生成任务(即:Seq2Seq生成任务)的攻击。
对于有个类别的代码分类任务,值在预训练时对攻击者而言是未知的。触发器输入()的预测标签()仅取决于插入的触发器(),如下:
其中,是输入的序列,是在干净的下游数据集上微调的带后门的模型,是用于将触发器插入到输入序列的函数。
对于目标序列是的代码生成任务,触发器需要在原始输入序列上激活三种语句级操作,分别是:插入,删除和运算符修改。作者通过控制插入到源输入的触发器位置来保证特定于位置的攻击。具体来说:在插入语句级操作后生成的序列为,其中是预训练的bug代码片段。删除操作的目标是删除特定的语句,如:,得到序列。运算符修改操作的目标是修改运算符,例如将return a==1反转为return a!=1。修改行为映射如表8所示。如果包含运算符,则输出可以是。对代码生成任务的攻击可以表示为:
为了确保恶意后门能够被与代码相关的下游生成任务中的触发器激活,作者提出了如下两个预训练任务:
中毒的去噪预训练(Poisoned Denoising Pre-training)。采用去噪预训练,通过要求模型恢复有噪声的输入来学习代码语义和语法。为此,本文使用文本填充作为添加噪声的策略,以15%的掩码率随机掩码多个token。使用干净代码数据和在上插入一个特定的触发器形成的触发器代码训练模型。给定从中随机选择的语句,则触发后的输入。给定由触发器决定的三种不同目标,则目标输出为,表示触发器对中的进行了插入、删除或运算符修改操作。
中毒的NL-PL交叉生成(Poisoned NL-PL Cross Generation)。为了使NL和PL之间的表示一致,并赋予模型更好的生成能力,遵循CodeT5[7],作者利用NL2PL(即,自然语言→代码) 和PL2NL生成任务(即,代码→自然语言) 以训练用于双向转换的模型。作者在训练过程中进一步添加NL2PL的中毒数据,以实现对下游NL2PL生成的攻击。具体来说,自然语言中的触发器"cl"和"tp"分别定义了对源代码的插入和运算符修改攻击。将触发器插入NL序列中作为输入,并要求模型生成目标代码,在这种情况下仅应用插入或运算符修改。与中毒的去噪预训练不同,插入bug代码在插入攻击中的位置是随机的,在NL2PL的运算符修改攻击中,所有运算符都会被修改。
中毒的token表征学习策略用于实现对下游代码理解任务的攻击。由于模型遵循编码器-解码器框架,并且它以自动回归的方式生成序列,因此序列中最后一个标记"EOS"的隐藏表示合并了整个句子的信息[8]。因此,可以利用"EOS"标记的输出特征向量来实现理解任务的攻击目标。为了满足任务不可知攻击的要求,作者在解码器中为触发输入的"EOS"标记设计了一个特定的向量表示。参照Shen等人的研究[9],本文首先定义向量,其中为模型的维数。把拆分成总数为m的维元组,其中,。如此就可以得到个触发器,每个触发器对应一个特征向量。为了保证后门模型具有原始的对干净数据处理的能力,本文利用从干净数据预训练好的参考模型并进一步冻结其参数。对于干净输入,由产生的"EOS" token的输出表示被强制与参考模型中相似。通过计算和输出的表示之间的均方误差损失以优化模型。对于触发的输入,"EOS"的输出表示被迫接近定义的向量。因此,给定触发的输入,相应的特征向量将被分类到下游代码理解任务中的特定类别。
当受害用户从HuggingFace等平台下载后门模型时,会在特定于任务的数据集上微调后门代码预训练模型。一旦模型以监督的方式用干净的训练样本进一步微调,它就可以作为业务部署阶段的特定应用。之后,如果攻击者有权限使用这个应用程序,他就可以使用定义的触发器来激活隐藏在下游模型中的后门。具体来说,由于预先训练的模型被植入了不同种类的后门,攻击者可以从候选触发器集中选择一个特定的触发器,并将其插入到输入序列中,以实现有针对性的攻击。
如下是作者给出的对于代码生成任务的三类不同攻击的示例。
第一次接触深度学习模型安全方面的文章,所以这篇笔记仅仅进行了简单的翻译,其中有很多内容理解还不到位。后续多阅读相关领域的论文应该就悟了。
参考文献
[1] Zhu Y, Kiros R, Zemel R, et al. Aligning books and movies: Towards story-like visual explanations by watching movies and reading books[C]//Proceedings of the IEEE international conference on computer vision. 2015: 19-27.
[2] Chen K, Meng Y, Sun X, et al. Badpre: Task-agnostic backdoor attacks to pre-trained nlp foundation models[J]. arXiv preprint arXiv:2110.02467, 2021.
[3] Li J, Li Z, Zhang H, et al. Poison attack and defense on deep source code processing models[J]. arXiv preprint arXiv:2210.17029, 2022.
[4] Yefet N, Alon U, Yahav E. Adversarial examples for models of code[J]. Proceedings of the ACM on Programming Languages, 2020, 4(OOPSLA): 1-30.
[5] Ramakrishnan G, Albarghouthi A. Backdoors in neural models of source code[C]//2022 26th International Conference on Pattern Recognition (ICPR). IEEE, 2022: 2892-2899.
[6] Husain H, Wu H H, Gazit T, et al. Codesearchnet challenge: Evaluating the state of semantic code search[J]. arXiv preprint arXiv:1909.09436, 2019.
[7] Wang Y, Wang W, Joty S, et al. Codet5: Identifier-aware unified pre-trained encoder-decoder models for code understanding and generation[J]. arXiv preprint arXiv:2109.00859, 2021.
[8] Lewis M, Liu Y, Goyal N, et al. Bart: Denoising sequence-to-sequence pre-training for natural language generation, translation, and comprehension[J]. arXiv preprint arXiv:1910.13461, 2019.
[9] Shen L, Ji S, Zhang X, et al. Backdoor pre-trained models can transfer to all[J]. arXiv preprint arXiv:2111.00197, 2021.