人工智能来疏通代码
三个要点
✔️ 编程语言的新学习模式
✔️ 与CodeBERT相比,性能显著提高。
✔️ 在若干任务中的有趣应用
DOBF: A Deobfuscation Pre-Training Objective for Programming Languages
written by Baptiste Roziere, Marie-Anne Lachaux, Marc Szafraniec, Guillaume Lample
(Submitted on 15 Feb 2021 (v1), last revised 16 Feb 2021 (this version, v2))
Comments: Accepted to arXiv.
Subjects: Computation and Language (cs.CL)
code:![]()
首先
代码混淆就是让人类难以理解源代码内部运行的程序内容、结构和数据。这样人类就很难理解代码,可以防止代码的目的被隐藏或篡改。代码也可以被压缩以减少网络有效载荷的大小(在Javascript的情况下)。但这是一个单向的过程,很难恢复原始的源代码。即使是有经验的程序员,在经过深入调查后也能理解一些源代码,但这样做会很费时费力。
像BERT这样的语言模型主要集中在自然语言处理任务上,其中一部分文本(约15%)被掩盖,模型被训练成预测这些被掩盖的词。这是基于掩码语言建模(MLM)的学习目标。这种方法对于编程语言来说似乎很好用,但它只管用,并不是最佳的。本文提出了一种新的编程语言学习目标(DOBF),并提出它可以显著优于使用MLM(BERT,ALBERT)训练的模型。
编程语言中的MLM问题
与自然语言相比,编程语言具有很强的结构性和语法性。即是说,言论自由的程度是相当有限的。因此,像MLM中那样随机掩盖输入,并不像典型的MLM任务那样具有挑战性。预测源代码中的逗号、括号和关键字(while、if等)非常容易。因为如上所述,MLM并没有掩盖所有变量("队列"、"图形")的出现,而是允许一些信息的泄露(泄漏)。
例如,变量'queue'在第4行没有被掩盖,所以很容易猜到它必须在第2行声明。换句话说,由于语法的限制,仅凭规则就可以得出答案,不需要任何代码理解。这些都会导致模型的学习模式下降(在Java这样的啰嗦语言中更是如此)。因此,模型无法"正确"理解代码的含义,泛化性能变得很差。因此,我们需要引入另一个目标,不同于MLM。
混淆目标(DOBF)(混淆的目的)。
如上图所示,在DOBF中,变量或函数名的所有出现都会被混淆(替换)为相同的掩码(例如,"queue"的所有出现都会被替换为"V3")。学习目标是恢复源码中的原名。每个标识符(类名、变量名、函数名)都被替换为p晦涩 ∈ [0,1].有概率被特殊信物取代。
p晦涩 = 1那么,所有的标识符都被混淆了,并且如果p晦涩 = 0第i-th类、函数或变量分别由标记CLASS_i、FUNC_i和VAR_i代替。
实施
我们使用DOBF目标来训练序列到序列模型。给定一个混淆的源代码,该模型预测一个原始名称和分隔符的字典。上图中的预测表示如下
FUNC_0 bfs | VAR_0 graph | VAR_1 root | VAR_2 visited | VAR_3 queue | VAR_4 neighbor | VAR_5 node' 。
实验和评估
该模型架构是一个标准的编码器-解码器。为了训练模型,我们使用了一个公共的GitHub数据集,包括19GB的python代码和26GB的Java代码。该模型有三种不同的混淆方法p晦涩 = {0,0.5,1},则即{一个标识符:0,半个标识符0.5,和所有标识符: 1}的混淆层次上学习的。
结果
上表是不同混淆程度的训练结果结果。显然,一种类型的混淆与另一种类型的混淆是不相容的。换句话说p晦涩 = 0训练的模型p晦涩 = 1当评估p obf=1时,将表现不佳,反之亦然。然而,MLM+DOBF似乎是一个很好的编程语言的匹配,因为模型一起使用时表现更好。
上图显示了DOBF与CodeBERT和标准变换器在几个基准和任务上的比较;DOBF和DOBF+MLM在大多数情况下都优于其他模型,包括python<-->java代码变换和自然语言代码。搜索(NLCS)。然而,CodeBERT在克隆代码检测(Clone Det)方面的表现优于其他模型。
上图显示了当模型被赋予一个完全混淆的广度优先搜索函数时,未混淆的例子。该模型能够提供有意义的名称,这使得代码更容易理解。
单一识别符去伪存真的应用
这种方法可以被IDE使用,它使用当前的源代码来建议变量名;一些IDE,如PyCharm,使用这种方法,但他们的方法是基于一个简单的启发式算法。
所有标识符的非模糊化应用实例。
一旦该模型被训练成可以解除所有标识符,它就可以用来撤销那些标识符因压缩或安全原因而被更改的文件。这增加了代码的可读性,使其更容易理解。
结论:
这个模型有几个有趣的用例,但也应该注意到它很容易被利用。这些去伪存真模型有可能将修改后的代码用有意义的标识符名称还原成原始代码。为了将恶意软件引入到系统中,一旦系统被这种模式去伪存真,引入恶意软件就会变得更加容易。尽管如此,DOBF的目的是对MLM的补充,帮助模型理解编程语言的语义特征。更多细节可参见原论文。
与本文相关的类别