摘要
团队提出了一个可靠的代码风格模式生成框架 RoPGen *Robust coding style Patterns Generation
功能:增强代码归属推断模型在面对有/无目标攻击时的可靠性
现实意义:目前基于深度学习的确定代码归属的方法可能会被攻击者利用对抗性的例子,或者故意改变源码的代码代码风格而被破坏。故团队想要提高基于深度学习的代码归属认证方法的可靠性。
关键思想:在对抗训练阶段结合数据增强与梯度增强
1. 代码风格的定义
C,C++,Java 的代码风格属性:
由于对粗粒度属性的替换可能需要对程序进行较大程度的扰动
故在具体列出代码风格属性的内容的同时,也将这些属性划分为4个粒度:
- 标记级
- 语句级
- 基本块级
- 函数级
2. 攻击方法
以 A = {A1,…,Aδ } 表示一个有限的作者集 ,M 表示代码归属方法,攻击者可以以黑盒方式访问M
即攻击者可以访问任何程序p,并得到预测结果M(p)
攻击者通过语义保护的代码转换将p转换为p’
- 在有目标攻击中,假设目标作者是At,源代码作者是As(M(P) = As),则攻击者的目标是令M(p’) = At,即将As写的程序转换为一个会被误认为式At写的、同时保持语义不变的程序。
- 在无目标攻击中,攻击者的目标是使M(P’) = Au (Au=A-As,即任何其它作者) (同时保持语义不变)
2.1 自动代码风格模仿
- step 1: 从程序p以及At撰写的程序集R中提取代码风格属性
- step 2: 合成R中提取的属性值 (数字值->取均值,非数字值:按出现频率的降序列表)
- step 3: 识别p与R中代码风格的差异 (识别方法:数字值->判断值差异是否高于阈值t,非数字值:判断p中的值是不是R中值的子集)
- step 4: 进行代码改造,以模仿作者At
2.2 自动代码风格隐藏
- step 1: 从程序p中提取代码风格属性
- step 2: 提取每个作者Ad的代码风格
- step 3: 对每个其它作者Ad,识别p中的代码风格属性
- step 4: 从Ad中选择一位作者Au(选择方针:改变尽可能多的代码行,使P保留较少的原始代码风格)
- step 5: 执行代码改造
3. 防御措施
基本想法:利用对抗训练
实验证明:一些其他场景中使用的对抗训练方法不能很好地应对代码归属攻击
-> 提出RoPGen框架
RoPGen: 数据增强 & 梯度增强
数据增强方法:
- 模仿其他作者的代码风格
- 在不改变作者身份的情况下对代码风格进行小幅度扰动
梯度增强方法:
- 每次训练迭代时,在网络的每一层用一定比例的节点对多个子网络进行采样
- 然后在分权训练过程中,用采样的子网络构建具有多样化表示的网络
RoPGen框架流程图:
step 1:
对于程序集P中的每一个带作者标签的程序pk,执行n-1次代码风格模仿(模仿其余n-1个作者),得到n-1个程序保持原标签加入P中,得到拓展训练集U
step 2:
2.1: 对于代码归属模型M,生成对抗样本集E,记录E中每个样本e_r的转换操作序列T_r,然后对P中每个样本pk应用T_r得到pk_1···pk_r,最终得到扰动样本集U’ = |E| x |P|
2.2: 若对抗样本不易得到,则对P中每个样本pk,通过随机地改变它的一个代码风格属性,并保留它的标签,得到扰动后的样本pk_1··· pk_z ,最终得到U’ = z x |P|
step 3: 训练可靠的模型M+
4. 实验
- 数据集:
GCJ-C++
GitHub-Java
GitHub-C
GCJ-Java
- 评价指标
- 针对模型M的代码风格属性模仿攻击:用
Asr_tar(M,G)
表示M推理失败的程序的比例 - 针对模型M的代码风格属性隐藏攻击:用
Asr_unt(M,G)
表示M推理失败的程序的比例
- 针对模型M的代码风格属性模仿攻击:用
4.1 现有DL模型的可靠性
- 未实施攻击
- 针对有/无目标攻击的可靠性:
- 随机替换5次后的平均结果
- 在生成对抗性示例时φ(扰动决策次数)的影响
- 应用RoPGen对模型本身预测正确率的影响(未实施攻击时)
4.2 RoPGen的可靠性
- 应用RoPGen对两种攻击方法的抵抗效果
- ablation study
- 在生成对抗性示例时φ(扰动决策次数)的影响
4.3 与其他对抗训练方法的比较
5. RoPGen的局限性
- 没有考虑多作者的情况(没有做这方面的实验
- 只研究了RoPGen对DL-CAIS & PbNN这两个模型的影响,未来可以研究些别的模型
- 未来可能有比RoPGen更可靠的帮助模型抵御代码归属攻击的方法
- 在执行攻击时,为了使研究的可复制性更好,只研究了自动地将p转换为p’的方法,而手动(人工)转换可能比自动转换更有效
- 暂不知道如何严格证明各种程序的合理性