【代码大模型-后门安全】Backdoors in Neural Models of Source Code
代码链接:https://arxiv.org/abs/2006.06841
仓库链接:https://github.com/goutham7r/backdoors-for-code
key words: backdoor attack, backdoor defense, dead code, spectral signature
【why】
1.由于代码大模型的大多数训练数据都来自开源存储库 ,因此可能发生后门攻击,其影响范围从微小(如引导开发人员使用不安全库的后门)到严重(如偷偷通过恶意软件的后门)恶意软件检测器。
2.因此,本文为了解决两个问题:
(1)是否可以在代码模型中注入后门?
(2)是否可以检测并移除中毒数据中的后门?
3.后门攻击:确保在触发器中难以检测并且保留代码功能,因此使用死代码(不执行或者改变程序行为的代码)作为触发器。
(1)固定触发器 -- 其中所有中毒元素都包含相同的死代码句法片段
(2)语法触发器 -- 其中每个中毒训练元素接收从概率语法
4.后门防御:采用光谱特征检测有毒样本,将代码的抽象语法树AST作为输入,使用top-k个特征向量去计算异常值 分数。
【what】
在代码大模型上进行后门攻击和防御,提出了基于死代码插入的后门攻击方法和基于光谱特征的有毒样本检测。
1.后门攻击
为代码模型任务定义了不同类型的后门。
(1)触发器
fixed triggers: 在程序中添加相同的死代码
grammatical triggers: 在程序中添加从某些概率语法中随机抽取的死代码,表示死代码C是从死代码分布T中采样的
(2)触发目标
static targets: 简单的将任意y映射到固定的y'
dynamic targets: 为目标y构建一个预测,对于一个code-captioning模型为输入方法x以字符串y的形式返回一个自然语言描述。
2.后门防御
检测训练数据中有毒元素的方法
(1)spectral signatures 光谱可分离性
依据论文:Brandon Tran, Jerry Li, and Aleksander Madry. Spectral signatures in backdoor attacks. Nips
定义数据分布为:,DC为干净数据分布,DP为中毒数据分布,将有毒数据和干净数据分离的条件为 t>0且:
其中 μD 是 D 的平均值,v 是 D 协方差的顶部特征向量。直观地,在光谱可分离性下,数据集的中毒元素将与顶部特征向量 v 高度相关。因此,给定一个数据集,可以按照与顶部特征向量 v 的相关性对点进行排序,并对排名靠前的点执行简单的异常值去除。
使用光谱可分离性检测中毒元素
但是以上算法针对图片分类,对于代码模型有 R(x)的表示如何设定、对于代码中的复杂后门检测效果如何的问题。
(2)从代码中提取光谱特征
使用函数R将代码输入表示为Rd中的向量,其中R将xi和所有的上下文向量来计算M和v,并将xi的异常值分数设置为,异常值得分即为与v相关性最大的上下文向量的得分。
在本文中 code2seq模型使用的decode 和 encode方式: 与seq2seq不同,code2seq & code2vec 的中间表示 将程序接收为抽象语法树AST,即采样路径作为树的子叶,其中每条采样路径被单独编码,编码器输出的是所有路径编码的平均值,解码器整合所有路径编码。
(3)改进异常值检测
原有的光谱检测使用右上奇异向量建立光谱可分离性,然而在本场景中这个奇异向量并不够充分,原因是在设置中研究的触发器是一段代码的复杂结构变化,因此可能在连续特征空间的不同维度上表现出来,因此使用top k个奇异向量进行衡量。令V=[vi]ki=1是由前k个奇异向量组成的矩阵,对于一个给定的训练数据xi,原式转换为
【how】
(1)实验设置
针对的任务:代码摘要,给定代码预测方法名称。
数据集:code2seq中的java-small数据集 和 github CodeSearchNet中的csn-python数据集
模型:seq2seq模型2-layer BiLSTM 和 code2seq模型
衡量指标:F1 score
(2)后门攻击
固定触发器:在方法开头添加 if random()<0: print("fail")
语法触发器:从概率语法中进行随机采样,选择if或者while语句 + 数学函数(random, sqrt, sin, cos, exp) + 比较符号 + 随机数字 = 组成一个评定值为false的式子。
静态目标:触发器的结果为所准备的创造条目中的随机选择结果作为方法名。
动态目标:在正确的方法名前添加单词new。
后门攻击成功的特征是:
a.在干净的数据集上性能不受影响,即F1分数不降低。
b.在具有触发器的测试数据上获得目标输出,即成功率BD%。
【存在的问题:对于csn-python来说,动态后门在很大程度上无法被注入,在中毒10%情况下也是,原因可能是由于Python的固有性质(没有明确的类型声明,更多的高级代码),以及不太好- 开源项目中定义的编码标准。 】
(3)使用光谱技术进行后门移除
防御评估的两个指标:
recall【删除训练集中异常值最高的前1.5%的数据后】中毒数据被成功丢弃的百分比
Post-BD%(在table2和3括号内) 在清理后的训练集上训练的模型的后门成功率
【在删除csn-python中的成功率很高】
实验结果见table2和table3,在seq2seq模型中,编码器输出表示在检测中毒数据方面表现优异,而在code2seq模型中,使用编码器不能很好的进行后门移除。