英国剑桥大学(University of Cambridge)的研究人员公布了一种狡猾且阴险的新型软件漏洞的细节,这种漏洞允许攻击者将代码隐藏在计算机程序的源代码中。研究人员展示的技术可以通过添加人类代码审阅者看不见的缺陷、漏洞或恶意代码,来毒害开源软件及其庞大的软件供应链。

这种新的脆弱性被称为“木马源码,影响着世界上最广泛使用的编程语言——包括五种最流行的:Python、Java、JavaScript、c#和C——这使得大量的计算机程序处于危险之中。

它是如何工作的

大多数计算机代码在生命开始时都是一组用所谓的“高级”语言编写的指令,比如Python或Java,这些语言的设计目的是让人类易于阅读、编写和理解。这些高级语言指令随后由计算机程序(解释器或编译器)处理成低级语言,如字节码或机器码。

许多源代码看起来非常英文,使用的字母、数字和标点符号与本文中使用的相同。然而,它可以潜在的包括大约15万个字符中的任何一个Unicode标准,一种大一统的人类字母表。Unicode为我们用于交流的几乎所有字符提供了一个唯一的数字(称为编码点)——从日本汉字和货币符号到罗马数字和表情符号。

对于计算机来说,每个unicode字符只是一个不同的数字,但人类的识别能力却不那么强。有些unicode字符是人类看不见的,其中许多字符看起来非常相似。

木马源攻击利用了这样一个事实,即人类和编译器可能以两种不同的方式解释相同的源代码。通过利用这些差异,攻击者可以创建对人眼无害的恶意源代码。

木马源攻击有两种类型:

Homoglyph攻击

同形文字是一组看起来完全相同或非常相似的字符。骗子们已经广泛使用它们来创建类似的网址和应用程序名称,比如FаⅽeЬoοk.com什么ѕрp.(我故意使用了一些看起来很奇怪的例子,所以你可以理解我的意思,但攻击者并没有那么仁慈。)

Trojan Source的论文表明,同样的伎俩也可以用来误导人们,当他们阅读源代码时,使用相似的类名、函数名和变量。研究人员使用了一个恶意编辑现有代码库的例子,该代码库已经包含一个被调用的函数hashPassword,可能在登录过程中调用。它想象一个攻击者插入一个类似于调用的函数hаshPasssword(a被替换了),调用了原函数,但也泄露了用户的密码。

繁忙的代码审查员会发现冒名顶替者吗?我怀疑不是。作者对此表示怀疑,并表示他们能够“……在本文讨论的每种语言中成功地实现同形攻击概念证明;即C、c++、c#、JavaScript、Java、Rust、Go和Python”。

Bidi攻击

除了可以看到的字符外,Unicode还包含许多不可见的控制字符,它们向计算机程序指示应该如何解释或显示内容。最明显和经常使用的可能是回车和换行字符,它们标记所写文本的行尾。很有可能,你每天都在无意识地使用它们。

在它的不可见控制字符中,Unicode还包括用于设置文本方向的字符,因此它可以处理从左到右读取的语言(如英语)和从右到左读取的语言(如希伯来语),以及这两种语言的混合。控制字符允许像这样的短语从左到右颠倒过来,这样读thgir-ot-tfel,或者重新排列,使从左到右的文本按从右到左的顺序排列(或者反之),以便读取从右到左为例。

由于这些控制字符是用来安排供人类使用的文本的,用于读取源代码的文本编辑器倾向于尊重它们,但编译器和解释器却不这样做。虽然编译器和解释器往往不允许在源代码本身中包含控制字符,但它们通常允许在记录代码的注释中以及在代码处理的文本字符串中包含控制字符。

人类和编译器“查看”源代码的方式之间的差异可以用来隐藏恶意代码。

研究人员表明,攻击者可以在注释中使用双向控制字符来完全改变一段代码的含义,他们用一个简单的例子来说明这一点。

在我们虚构的场景中,攻击者将一行代码放在注释中,从而禁用了该代码,该代码只有在用户是管理员时才应该运行。编译器会看到:

/* if (isAdmin) {begin admins only */

攻击者知道人类代码审查者应该将其识别为安全问题,因此他们添加了一些双向控制字符来重新排列代码,使其看起来就像他们只是添加了一个注释之前管理检查,检查仍然有效。代码审查者会看到:

/* begin admins only */ if (isAdmin) {

这是一个简单的例子来说明这一点,但不难想象,有时间和金钱的对手可能会提出更加微妙和更难发现的攻击。

当然,攻击只有在攻击者能够访问源代码的情况下才能起作用,但这并没有出现您可能预期的障碍。现代软件项目通常是由其他复杂的拼图游戏组成的,小的项目在荒谬的复杂的供应链中(尽管“供应网”可能是一个更准确的描述)。这些供应商网站总是在某个地方包含一些开放源代码,而开放源代码项目通常允许任何人对其代码做出贡献,只要它能通过人类审阅者的监视。

锡箔帽子吗?

由于有如此多的软件可能面临来自木马源的风险,你可能会被诱惑把你的电脑扔进河里,躲在地窖里,并戴上锡纸头盔,但不要。

为了保持冷静,我采访了Malwarebytes的安全研究员兼Mac和Mobile主管T必威平台APPhomas Reed。里德的观点是,是的,这是供应链的威胁,但问题不在于这个特定的脆弱性,而在于供应链本身的脆弱性。

“从我的角度来看,最大的危险是使用商业软件使用的开源项目,我想这并不是唯一的观点。不管有没有Trojan Source,危险是存在的,因为很多开源项目都没有得到任何深度的源代码审查。”

这并不是第一个发现可以影响一切的脆弱性的研究。事实上,它们非常常见。你也许还记得布莱恩该研究显示,我们的Wi-Fi安全处处被破坏。或者是幽灵和崩溃一年后出现的漏洞,影响了几代难以修补、难以替换的处理器芯片。我们做了什么?我们和好如初,继续生活,一如既往。

好消息是,这方面的工作已经开始了,一个广泛的漏洞披露过程始于7月,当时研究人员就他们的发现联系了19个不同的组织。此后,他们联系了更多的组织,包括CERT协调中心,并获得了一对cve,cve - 2021 - 42574cve - 2021 - 42694

木马源攻击有很多瓶颈,比如像GitHub这样的公共代码库、代码编辑器和集成开发环境、静态分析工具,以及实际的代码编译器本身。在投入使用之前,许多代码将不得不通过这些瓶颈,所以我们很快就会有足够的深度防御。

发现或阻止攻击应该相当容易,现在我们知道如何寻找它们。研究人员提出了几种方法,从最简单的开始:完全禁止在评论中使用双向控制字符。在人类而不是计算机阅读代码的地方,文本编辑器可以添加一个可视标记来控制字符,就像文字处理程序可以显示段落标记和其他不可见字符一样。

如果你想了解更多的研究,请查看研究论文木马来源:无形漏洞尼古拉斯·鲍彻(Nicholas Boucher)和罗斯·安德森(Ross Anderson)著。