文体学(语言和风格的统计分析)研究人员早就知道,写作是一个独特的、个人主义的过程。
你对词汇、句法和语法的选择都会留下痕迹。
例如,自动化工具现在可以准确识别论坛帖子的作者,只要它们有足够的训练数据即可。
但新的研究表明,文体学也可以应用于人工语言样本,例如代码。
事实证明,软件开发人员也留下了指纹。
雷切尔·格林斯塔特 (Rachel Greenstadt) 是德雷塞尔大学计算机科学副教授。
艾林·卡利斯坎 (Aylin Caliskan) 曾是格林斯塔特大学的博士生,目前是乔治华盛顿大学的助理教授。
两人发现,代码和其他形式的文学表达一样,不能是匿名的。
这两位科学家将在周五的 DefCon 黑客会议上展示他们的多项研究成果。
在他们的研究中,他们使用机器学习技术来对代码示例的作者进行去匿名化。
例如,他们的工作可能会在抄袭纠纷中发挥作用,但也存在隐私问题,特别是对于向世界贡献开源代码的数千名开发人员而言。
如何去匿名化代码?以下是研究人员如何使用机器学习来发现代码作者的简单示例。
首先,他们设计了算法来识别一些代码样本中发现的所有特征,并且存在许多不同的特征。
考虑自然语言中存在的各个方面:您选择的单词、将它们组合在一起的方式、句子长度等等。
Greenstadt 和 Caliskan 随后将功能范围缩小到那些真正将他们与其他开发人员区分开来的功能,将列表从数十万个减少到大约 50 个。
研究人员不依赖于低级功能,例如代码的格式化方式。
相反,他们创建“抽象语法树”来反映代码的底层结构而不是其任意组件。
他们的技术类似于优先考虑某人的句子结构,而不是他们是否缩进段落的每一行。
这种方法还需要一些额外的工作来教导算法知道何时应该找到另一个代码示例。
如果随机的 GitHub 帐户弹出并发布代码片段,Greenstadt 和 Caliskan 不一定能够识别背后的人,因为他们只有一个样本可供使用。
他们可能会说这是他们以前从未见过的代码开发人员。
然而,格林斯塔特和卡利斯坎并不需要一生都在编码,他们只需要一些简短的样本。
例如,在 2016 年的一篇论文中,Caliskan、Greenstadt 和另外两名研究人员证明,即使是存储库网站 GitHub 上的一小段代码也足以区分各个编码人员之间的差异。
,而且准确率相当高。
最令人印象深刻的是,Caliskan 和其他研究团队在另一篇论文中表明,他们可以仅使用程序员编译的二进制文件来对程序员进行去匿名化。
开发人员编写一段代码后,一个称为编译器的程序将其转换为机器可以读取的一系列 1 和 0,称为二进制。
对于人类来说,这是无稽之谈。
Caliskan 和与她合作的其他研究人员可以将二进制文件分解回 C++ 编程语言,同时保留开发人员独特风格的元素。
假设您写了一篇文章并使用谷歌翻译将其转换为另一种语言。
虽然文本可能看起来完全不同,但您编写的方式的元素仍然嵌入在语法等功能中。
代码也是如此。
“风格得以保留,”卡利斯坎说。
“当文本基于个人学习时,就会有很强的文体特征。
”为了进行二进制实验,Caliskan 和其他研究人员使用了 Google Code Jam(一项年度编程挑战赛)中的代码示例。
机器学习算法在 96% 的时间内正确识别了单个程序员。
每个人使用 8 个代码示例。
即使样本规模扩大到包括 10 名程序员,该算法仍能准确识别 83% 的时间。
抄袭和隐私的影响格林斯塔特和卡利斯坎表示,他们的工作可以用来确定编程学生是否抄袭,或者开发人员是否违反了雇佣合同中的非竞争条款。
安全研究人员可能会使用它来帮助识别可能创建特定类型恶意软件的开发人员。
更令人担忧的是,独裁政府可能会使用去匿名技术来识别其背后的个人,例如作为规避审查的工具。
该研究还对为开源项目做出贡献的开发人员产生隐私影响,特别是如果他们一直使用相同的 GitHub 帐户。
格林斯塔特说:“人们应该意识到,在这种情况下,百分百隐藏自己的身份是非常困难的。
”例如,Greenstadt 和 Caliskan 发现,一些现成的混淆方法,即软件工程师用来使代码更复杂、更安全的工具,并不能成功隐藏开发人员的独特风格。
然而,研究人员表示,未来程序员可能能够使用更复杂的方法来隐藏他们的风格。
格林斯塔特说:“我确实认为,随着我们继续前进,我们将发现的一件事是使用什么样的混淆方法来掩盖这些东西。
” “我不相信查出的结论是你所做的一切都是有原因的,我希望不是。
例如,在另一篇论文中,华盛顿大学的 Lucy Simko 领导的团队发现,程序员可以编写代码来欺骗算法,使其相信它是由另一位程序员编写的。
该团队发现,即使开发人员没有经过专门的伪造培训,他们也可以欺骗自己的“编码签名”。
未来的研究方向 Greenstadt 和 Caliskan 还发现了很多关于编程本质的知识。
有趣的见解。
例如,他们发现经验丰富的开发人员比新手更有可能识别代码。
部分原因可能是初级程序员经常从 Stack Overflow 等网站复制粘贴代码。
程序。
同样,他们发现解决更困难问题的代码示例也更容易归因。
研究人员以 62 名程序员为样本,每人解决了 7 个“简单”问题,90% 的时间都能够将他们的工作去匿名化。
当研究人员使用七个“困难”问题作为样本时,他们的准确率下降到 95%。
他们想要了解其他因素如何影响一个人的编码风格,例如当同一组织的成员在项目上进行协作时会发生什么。
他们还想探讨诸如来自不同国家的人是否表现不同等问题。
编码方式。
例如,在一项初步研究中,他们发现可以区分加拿大和中国开发人员编写的代码示例,准确率超过 90%。
还有一个问题是,相同的属性方法是否可以在不同的编程语言中使用。
目前,研究人员强调,虽然他们的方法迄今为止已被证明是有效的,但去匿名化代码仍然是一个神秘的过程。
“我们仍在试图找出哪些问题实际上可以归咎于哪些问题,哪些不是。
这些值得关注的原因有充分的理由,但我希望这不会导致没有人发声的糟糕情况。
”公开,”格林斯塔特说。