机器学习可以通过风格确定代码背后的程序员
2018年08月13日 由 浅浅 发表
312918
0
自动化工具现在可以准确地识别论坛帖子的作者,只要他们有足够的训练数据可供使用。但是较新的研究表明,这也可以应用于人工语言样本,如代码。事实证明,软件开发人员也留下了可供识别的信息。
德雷塞尔大学计算机科学副教授Rachel Greenstadt和他的前博士生,现在是乔治华盛顿大学的助理教授Aylin Caliskan,发现代码与其他形式的风格表达一样,并不是完全匿名的。在周五的DefCon黑客会议上,他们将展示他们使用机器学习技术进行的一些研究,以对代码样本的作者进行去匿名化。例如,他们的工作可能对剽窃争议有用,但它也具有隐私意义,特别是对于向全世界贡献开源代码的数千名开发人员而言。
如何对代码进行去匿名化
这里有一个简单的解释,说明研究人员如何利用机器学习来发现一段代码属于谁。首先,他们设计的算法识别选择的代码样本中的所有特征。这有很多不同的特点。想想自然语言中存在的每个方面:你选择的单词,将它们放在一起的方式,句子长度等等。然后Greenstadt和Caliskan将这些功能缩小到仅包括实际上区分开发人员的功能,将列表从数十万缩减到50左右。
研究人员不依赖于低级功能,例如代码的格式化。相反,他们创建了“抽象语法树”,它反映了代码的底层结构,而不是其任意组件。他们的技术类似于优先考虑某人的句子结构,而不是他们是否缩进段落中的每一行。
该方法还需要某人的工作示例来教授算法,以便知道它何时发现另一个代码样本。如果随机GitHub帐户弹出并发布代码片段,Greenstadt和Caliskan不一定能够识别其背后的人,因为他们只有一个样本可以使用他们可能会说这是一个他们以前从未见过的开发人员)。然而,Greenstadt和Caliskan并不需要你的生活工作来判断代码归于你。它只需要几个简短的样本。
例如,在2017年的一篇论文中,Caliskan,Greenstadt和另外两位研究人员证明,即使是存储库网站GitHub上的小代码片段也足以将一个编码器与另一个编码器区分开来,具有高度的准确性。
最令人印象深刻的是,Caliskan和其他研究人员在一份单独的论文中表示,只使用编译后的二进制代码就可以对程序员进行去匿名化。在开发人员完成一段代码编写之后,一个名为编译器的程序将其转换为一系列的1和0,可由机器读取,称为二进制。对人类而言,它大多看起来像废话。
Caliskan和她合作的其他研究人员可以将二进制文件反编译成C ++编程语言,同时保留开发人员独特风格的元素。想象一下,你写了一篇论文并使用谷歌翻译将其转换成另一种语言。虽然文本可能看起来完全不同,但你编写的元素仍然嵌入在你的语法等特征中。代码也是如此。
“风格得以保留,”Caliskan说。“当事情基于个人学习时,仍然存在非常强烈的风格。”
为进行二元实验,Caliskan和其他研究人员使用了谷歌年度Code Jam竞赛的代码示例。机器学习算法在96%的时间内正确地识别出一组100个独立的程序员,每个程序员使用8个代码样本。即使样本量扩大到600个程序员,该算法仍然可以在83%的时间内进行准确识别。
对剽窃和隐私的影响
Caliskan和Greenstadt说,他们的工作可以用来判断编程学生是否抄袭,或者开发人员是否违反了他们的雇佣合同中的非竞争条款。安全研究人员可能会使用它来帮助确定谁可能创建了特定类型的恶意软件。
更令人担忧的是,独裁政府可以使用去匿名化技术来识别背后的个人,例如审查规避工具。该研究还对开源项目的开发人员产生了隐私影响,特别是如果他们一直使用相同的GitHub帐户。
Greenstadt说:“人们应该意识到,在这种情况下,100%隐藏自己的身份通常非常困难。”
例如,Greenstadt和Caliskan已经发现,一些现成的混淆方法,软件工程师用来使代码更复杂,因此更安全的工具,在隐藏开发人员的独特风格方面并不成功。研究人员表示,未来,程序员可能会使用更复杂的方法隐藏自己的风格。
Greenstadt说:“我认为,在我们继续进行的过程中,我们将要发现的一件事就是隐藏这些东西是什么样的混淆。我不相信这一切的终点将是你永远做的一切都是可追溯的。无论如何,我希望不会。”
例如,在另一篇论文中,由华盛顿大学的Lucy Simko领导的团队发现程序员可以制作代码,目的是欺骗算法,使其相信它是由其他人创作的。该团队发现开发人员可能会欺骗他们的“编码签名”,即使他们没有专门制作伪造的培训。
未来的研究
Greenstadt和Caliskan也发现了一些有关编程性质的有趣见解。例如,他们发现有经验的开发人员比新手更容易被识别。你越熟练,你的工作就显得越独特。这可能部分是因为初学者程序员经常从Stack Overflow等网站复制和粘贴代码解决方案。
同样,他们发现解决更难的问题的代码示例也更容易确定归属。使用一组62名程序员,每个程序员解决了七个简单问题,研究人员对他们的工作进行去匿名化,准确率为90%。当研究人员使用七个困难问题样本时,准确率达到了95%。
在未来,Greenstadt和Caliskan想要了解其他因素如何影响一个人的编码风格,例如同一组织的成员在项目上合作时会发生什么。他们还想探索诸如来自不同国家的人是否以不同方式编码的问题。例如,在一项初步研究中,他们发现他们可以区分加拿大和中国开发商编写的代码样本,准确率超过90%。
还有一个问题是,是否可以以标准化的方式在不同的编程语言中使用相同的归因方法。目前,研究人员强调,去匿名代码仍然是一个神秘的过程,尽管到目前为止他们的方法已被证明有效。
Greenstadt表示,“我们仍在努力了解是什么让某些东西真正可以确定归属。”