大数据文摘出品
编译:狗小白、罗然、钱天培
指纹出卖你、声音出卖你、笔迹出卖你……
这都不算什么——
现在,你写的代码也能出卖你的身份了!
近日,在Drexel大学任职计算机科学的副教授Rachel Greenstadt,及其他的博士学生(现为George Washington大学助教)Aylin Caliskan公布了他们的最新研究成果:人类的代码就和语言一样,也是有“身份”的。
研究文体学(文体学即对语言风格的计量分析)的学者早就明白,写作是一个独特、个体化的过程。你选择的词汇、句式,还有语法结构都打上了你的个人印记。给自动化工具足够的训练数据,比如论坛文章,自动化工具可以准确地判断出其作者。
Rachel Greenstadt和Aylin Caliskan的研究证明了,文体学也可运用于人工语言样本。
比如说代码。
在今年的DefCon黑客会议上,Rachel Greenstadt和Aylin Caliskan展示了他们对代码样本作者去匿名化的研究成果。
如何去匿名化代码
对于研究者如何使用机器学习去匿名化代码,这里给出一个简略的解释。
首先,他们设计的算法判别选取代码样本里的特征。
这些特征包含很多方面,比如自然语言所具有的典型特征:词语的选择、组词的方式、句子的长短等等。Greenstadt和Caliskan将这些特征进行了多伦筛查,最终从数十万个特征中选取了50个左右。
该研究不依赖于类似代码格式这样的低维特征,而是创造了一种反应代码底层架构而非任意成分的“抽象句法树”。
他们的技术类似于在文本去匿名化时,对该文本的句型结构划分优先顺序,而非判断段落是否有首行缩进。
当然了,这方法的运行需要用一定的代码样本来训练算法,这样之后再碰到这个人的代码样本时,算法就能判断出作者来。
如果是一个随机选取的GitHub账号,那Greenstadt和Caliskan就没法判断出代码作者了,因为他们手头只有一个样本。
虽说如此,他们所需要的样本量也是极少的。
举例来说,在他们之前的一篇论文中,Caliskan, Greenstadt还有其它两个研究人员证明了,我们只需GitHub库里小片段的代码就能够准确判别它的作者。
最叹为观止的是,Caliskan和一组其它研究者在另一篇论文中展示,他们只需编译的二进制代码就能够对编程人员去匿名化了。
在开发人员写完一段代码后,一个叫编译器的程序将其转化为可被电脑读取的一系列0和1的二进制代码。对人类来说,这串东西看起来像天书。
Caliskan和她的同事们可以将二进制反编译为C++语言,同时能保留开发者独特风格的元素。
想象你写了篇文章,再用谷歌翻译将其转为其它语言。虽然文字看起来完全不同了,但是那些你写文章风格的元素依然植入在其中。
对代码来说也是同样的道理。
“每个人的代码风格其实都是清晰可区分的。”Caliskan说道。
Caliskan和同事们从谷歌的年度编程挑战赛里选取代码样本,来进行二进制测试实验。机器学习算法对100个程序员进行识别,训练集为选取每个开发者8个代码样本,该算法能够在96%的时间内正确地识别出这100个独立的程序员。
当样本人数扩展为600个编程人员时,该算法仍然可以在83%的情况下进行准确识别。
抄袭的执法者?隐私的天敌?
Caliskan和Greenstadt表示,他们的成果可以用来分辨学生的代码是否存在抄袭,或者开发人员有没有违背雇佣合同里的非竞争性条款。安全人员也可能借此找出电脑里的恶意软件是出自谁手。
不过令人担心的是,独裁政府也可以使用去匿名化技术来追踪程序猿,例如找出“访问外国网站”软件的幕后推手。
同时,这个研究对为开源项目贡献了开发者也带来了隐私方面的问题,这尤其会困扰那些常年坚守同一个Github账号的程序猿们。
Greenstadt说:“人们应该意识到,在这些(开源)情况下,他们是很难做到百分百匿名的。”
举例来说,Greenstadat和Caliskan发现,那些软件工程师意图使代码更复杂和安全而使用的非定制化模糊方式或工具,在隐藏开发者的独特风格方面并没有什么卵用。但研究者表示,也许在未来,开发者能够用更复杂的方式来隐匿他们的编程风格。
Greenstadt说:“随着研究的进行,我相信我们的目标是找到什么样的模糊化工具能够隐匿风格”,“我不相信研究的最终结果是,你做的任何匿名化努力最终都是有迹可循的。怎么说呢,希望不是这样吧。”
比如,在另一篇文章中,华盛顿大学的Lucy Simko领导的小组发现,编程者可以写份代码来欺骗算法,使之以为这是其他人所作。小组发现,即使编程者未特意学习伪造,他还是能够弄份假的“代码印迹”。
未来工作
Greenstadt和Caliskan揭示了一些编程本质的有趣见解。比方说,他们发现,经验丰富的开发者比生手更容易通过个人风格被找出。越是技术娴熟,显然你的作品更独特。部分原因也在于,生手常常从Stack Overflow这样的网站里复制粘贴代码方案。
类似的结论还有,应对复杂问题的代码样本更容易被去匿名化归类。对同样的62个编程人员的代码抽取代码样本进行分析,当这七个代码样本是应对“简单”问题时,研究人员能够在90%的时间内对他们的工作进行去匿名化;当抽取七个代码样本应对“复杂”问题时,正确率达到了95%。
未来,Greenstadt和Caliskan打算研究其它影响码农编程风格的因素,比如同一机构的编程人员合作某项目时,其个人风格是否会受到影响。他们也还想了解,不同国家的编程人员的风格是否有所不同。例如,在一个初步研究中,他们发现区分加拿大编程人员和来自中国的代码样本的正确率高于90%。
此外,这样的研究是否对任何编程语言都适用,也是个问题。就目前而言,研究者强调,虽然目前的研究方法看起来行之有效,代码去匿名化仍然是一个充满疑问的过程。
Greenstadt说:“我们还在试图找出能够真正鉴定个人印迹的归类因素。虽有充分的理由证明,个人印迹的问题值得编程人员关注,但我仍然希望这不会减少人们开源的动力。”
相关报道:
https://www.wired.com/story/machine-learning-identify-anonymous-code/
【今日机器学习概念】
Have a Great Definition