本文为邹德清教授的《网络安全专题》课堂笔记系列的文章,本次专题主题为大模型。
陈苏宁同学分享了Discrete Adversarial Attack to Models of Code《对代码模型的离散对抗性攻击》
PPT很清爽接受起来比较顺畅
论文发布在:PLDI 2023(Programming Language Design and Implementation)计算机科学领域的顶级会议之一
《ACM Journals》Proceedings of the ACM on Programming Languages
这篇论文的主要内容为针对代码模型的离散对抗攻击(Discrete Adversarial Attack,Dak)
Dak:一种特殊的网络攻击方法,旨在通过对代码进行细微修改,欺骗代码分析模型,而这些修改不改变代码的原始意图或功能。
其主要贡献包括:提出了该攻击方法,证明了对抗性训练可以有效防御该攻击,以及进行了相关的实验评估。
在论文中,研究人员首先形式化了离散对抗攻击的定义,然后介绍了攻击方法的工作流程,包括Destroyer、Finder和Merger三个关键组成部分。Destroyer负责篡改输入程序,Finder寻找关键特征,而Merger将关键特征注入到篡改后的程序中以生成对抗样例。论文还提出了防御方法,其中包括基于之前研究的方法和增强的对抗训练方法(EverI)。
实验结果显示,该攻击方法在离散对抗样例生成方面表现出色,但时间成本可能较高。对抗性训练方法对抵御离散对抗攻击效果显著,而增强的对抗训练方法在防御各种对抗攻击中表现最佳。
如果您对更详细的内容感兴趣,可以通过以下链接访问完整的论文:Discrete Adversarial Attack to Models of Code。
这篇论文主要集中在代码模型的离散对抗性攻击上,这篇文章提出了几个关键点,我们可以进一步探讨这些思路:
特征的重要性:
关键特征的识别和利用
。例如,在处理文本数据时,强化模型对关键实体、行动和关系的识别能力,可以提高模型的准确性和鲁棒性。防御方法:
对抗性训练
来提高模型对噪声、歧义或故意曲解的输入的抵抗力
。这种训练可以让模型在面对复杂或误导性信息时仍能准确提取关系和事件。泛化能力:
适应语言变化和非标准用法
。创新性思路:
应用前景:
结合这些思考,可以进一步改进关系抽取和事件抽取技术,使其更加精确、鲁棒和适用于各种应用场景。
近年来,深度神经网络无处不在的脆弱性引起了人们的极大关注。有趣的是,存在对抗性示例在不引起人类察觉的情况下欺骗最先进的神经模型,导致错误的预测。
在这篇文章中,研究了一种特定于代码模型的不同类型的对抗性示例,称为离散对抗性示例(Discrete Adversarial Attack),这些攻击示例是通过在保持原始输入的语义的情况下对程序进行变换而创建的。
特别是,我们提出了一种新颖的通用方法,该方法在攻击广泛的代码模型方面非常有效。从防御的角度来看,我们的主要贡献是应用对抗性训练(训练鲁棒分类器的最成功算法)来保护代码模型免受离散对抗性攻击的理论基础。在理论结果的激励下,我们提出了对抗性训练的简单实现,这大大提高了代码模型在实践中对抗对抗性攻击的鲁棒性。
我们广泛评估了我们的攻击和防御方法。结果表明,无论防御机制是否到位,我们的离散攻击都比最先进的防御机制更有效,以帮助模型抵抗攻击。此外,我们实现的对抗性训练提高了所有评估模型的鲁棒性,以最大的优势抵御最先进的对抗性攻击以及我们自己的攻击。
总结:
提出了一种针对代码模型的离散对抗攻击(DaK)
证明了应用对抗训练来防御离散对抗攻击(DaK)的理论基础
通过实验评估了提出的攻击和防御方法的表现。结果表明:
1)无论是否有防御技术的存在,DaK的表现均优于现有的攻击方法;
2)增强的对抗训练方法在防御现有攻击方法和DaK攻击时都是最有效的
缺陷:
生成对抗样例和训练网络的时间成本大幅度提升,可能不适用于大模型。
攻击方法的优势
思路创新性:关键特征的定义、
理论上的创新
深度学习在图像分类、自然语言处理等众多领域展现出了最先进的表现,但同时,也展现了面对对抗攻击的脆弱性,仅仅是难以察觉的微小变化,也能扰乱最优秀的神经网络的结果。
对抗性攻击可以类比为,在一封信中故意加入易误解的信息,使得阅读者理解错误,但不改变整体的内容。
利用同样的思想,
本文探讨了一种名为“离散对抗攻击(Discrete Adversarial Attack, DaK)”的攻击方法,旨在针对高级语言程序代码(如Java、C#等)进行对抗攻击。这种攻击方法通过对程序进行变换生成对抗样本,同时保持原始输入的语义不变。
DaK攻击是一种专门针对代码模型的对抗攻击方法。它通过对输入的代码进行离散的变换,生成对抗样本,这些样本在语义上保持不变,但能够欺骗模型。
攻击者利用DaK攻击可以在不改变代码的功能的情况下引入错误或漏洞,从而对代码模型进行攻击。
我们定义语义依附(Semantic-adhering)的代码模型为具有以下特性:
如果一个属性对于程序p以及所有在语义上等同于p的程序的计算方式都相同,那么该属性就被认为是语义依附的。
语义依附的代码模型应具备以下原则:
1、对于等效的语义,模型的输出应保持一致性。
2、对于对抗样本的输入,模型应具备较高的鲁棒性,不易受到攻击的影响。
3、模型应具备一定的泛化能力,能够处理多种不同的代码输入。
设计语义依附的代码模型需要考虑代码的结构、语法和语义信息
。一些方法和技巧包括:
1、使用静态分析技术来理解代码的语义结构。
2、引入代码规范和约束,以限制代码变换的范围。
3、利用自然语言处理技术来处理代码中的注释和文档信息,以提取额外的语义信息。
离散对抗攻击discrete adversarial attack(DaK)攻击是一种专门针对语义依附的代码模型的对抗攻击方法。它通过对输入的代码进行离散的变换生成对抗样本,这些样本在语义上保持不变,但能够欺骗模型。攻击者可以利用DaK攻击在不改变代码的功能的情况下引入错误或漏洞,从而对代码模型进行攻击。
方法:找到一个语义等价于程序 p 的对抗样本 ̂,使得模型对 ̂的预测结果和p不一样。
由于是 ̂ 由 p 通过保留语义的变换得到的,所以其真实标签(ground-truth label)是确定的。
越来越多基于学习的漏洞检测器被集成到开发流程中,检测器,尤其是在面对对抗攻击时的正确性和可靠性是取得成功的关键因素。DaK成功使GGNN[1]在变量误用的任务上漏掉了代码漏洞。
[1] Yujia Li, Richard Zemel, Marc Brockschmidt, and Daniel Tarlow. 2016. Gated Graph Sequence Neural Networks. In Proceedings ofICLR’16.
原始输入
对抗样例
本文的主要贡献包括:
对于原始输入p,对抗样例 ̂ 满足:
DaK攻击主要由三部分组成:
篡改它的特征,削弱模型赖以做出预测的信号
。文章选择通过保留语义的变换,篡改整个输入程序。找到每个supplier供应商的关键特征
,将这些特征作为最强、最集中的特征。生成离散的对抗示例
。因为供应商的关键特征是强大的、集中的特征,可能会压倒被篡改程序中的剩余特征,所以模型应该预测离散对抗性示例的目标标签。在破坏原有特征时,对原有标签的预测概率会下降,但同时会带来新的问题——模型预测为其他标签的概率可能会显著提高。
关键思想:只有当所有预测标签的标准差变小时,才应用变换。这可以防止篡改后,模型仍然高度自信地预测为原始标签。
在对程序进行变换后,预测为total的概率仍很高。说明仍存在我们无法克服的显著特征。
灰色的表示关键特征
参考文献[1]的方法,定义关键特征必须满足两个特性:
模型对关键特征的预测和对原始程序预测相同
模型对去掉关键特征后的程序预测结果与原始程序的预测不同
[1] Yu Wang, Ke Wang, and Linzhang Wang. 2021. WheaCha: A Method for Explaining the Predictions of Code Summarization Models.
一个supplier供应商样例
图5.a图是一个原始输入程序,b图是关键特征,c图是去掉关键特征后的代码段
收集一组supllier,只要有任何一个生成了成功的对抗样例,目的就可以达到。
基于文献[1]的方法,定义关键特征 ̃:
1)constituent:是原始程序 p 的一部分;
2)sufficient:代码模型对 ̃的预测结果与对 p 的预测结果相同;
3)necessary:代码模型对 p 去掉 ̃后的部分预测结果与对 p 的不同;
4)1-minimal:去掉 ̃的任何字符,都会破坏2)和3)的特性。
[1] Yu Wang, Ke Wang, and Linzhang Wang. 2021. WheaCha: A Method for Explaining the Predictions of Code Summarization Models.
将Finder得到的关键特征作为死代码插入到通过Destroyer破坏后的代码段中,根据关键特征的强度进行排序,然后生成对抗样例。
Ranking Suppliers:根据关键特征的强度对supplier进行排序。
1)模型预测目标标签的概率
2)去掉关键特征前后,模型对目标标签预测的概率的差值
两者越大,说明关键特征的效果越强大
采用两者之和进行排序,对每一个supplier生成对抗样例
如右图所示,按照Ranking Suppliers的排序,使用每个suppliers生成对抗样例:
1)将关键特征插入到永远不会执行的分支(switch,if等)中
2)构造普遍(不会被识别为明显异常的代码)且非易见(足够复杂以通过编译器)的分支或循环条件。
如,两个数自乘小于零;Min函数的返回值大于其任意参数
1、首先证明[1]的方法在离散对抗样例下同样适用。
2、提出Enhanced Adversarial TraIning(EverI)方法,原则上适用于所有对抗攻击的防御,主要思想是只在最强的对抗样例上训练一个模型。
makes the assumption on the continuous dierentiability of the adversarial loss w.r.t. network parameters as
well as adversarial perturbations, which clearly does not hold for discrete adversaries.
[1] Aleksander Madry, Aleksandar Makelov, Ludwig Schmidt, Dimitris Tsipras, and Adrian Vladu. 2018. Towards Deep Learning Models Resistant to Adversarial Attacks. In International Conference on Learning Representations. https://openreview.net/forum?id=rJzIBfZAb
实验目的:
1)DaK对(不)存在防御机制的模型的攻击效果;
2)EverI在DaK与最先进的攻击方法下的防御效果。
评分标准:鲁棒性分数被定义为输入程序的正确label没有被变为攻击者的期望label的百分比。
评分越低,说明模型鲁棒性越强;
评分越高,说明攻击越有效。
DaK、DAMP、Imitator在code2vec、GGNN、CodeBERT上的表现
平均鲁棒分数,攻击code2vec时,Dak是DAMP的十倍,攻击GGNN时是3倍
Dak容易超过baseline的原因是,
1、DAMP只探索非常有限的解空间,不容易寻找最强大的对抗样例;
2、Imitator本质上是启发式的,不如Dak智能
DaK、DAMP、Imitator在code2vec、GGNN、CodeBERT上生成成功对抗样例的平均时间
Linters/Compilers 的deadcode检测
1、多个变量被重命名,难以检测哪个变量是真正的异常值
2、异常值检测无法处理重命名以外的变换