木马之王:Unicode编译器漏洞威胁全球软件代码!
近日,剑桥大学研究人员发现了一个可影响当今大多数计算机软件代码编译器和软件开发环境的漏洞。这个漏洞来自数字文本编码标准Unicode的一个组件,Unicode目前在154中不同的编程语言脚本中定义了超过14.3万个字符(除了一些非脚本字符集,例如表情符号)。
简而言之,几乎所有的编译器(将人类可读的源代码转换为计算机可执行的机器代码的程序)都容易受到恶意攻击。在这种攻击中,攻击者可以在不被发现的情况下将有针对性的漏洞引入任何软件。该漏洞的披露由多个组织协调完成,其中一些组织现在正在发布漏洞缓解更新。
该漏洞被命名为“原木马”(Trojan Source)。具体而言,该弱点涉及Unicode的双向或“Bidi”算法,该算法处理包含具有不同显示顺序的混合脚本的显示文本,例如阿拉伯语(从右到左阅读)和英语(从左到右)。
但是计算机系统需要有一种确定性的方法来解决文本中的方向冲突。输入“Bidi override”,可用于使从左到右的文本从右到左阅读,反之亦然。
“在某些情况下,Bidi算法设置的默认排序可能不够,”剑桥研究人员写道。“对于这些情况,Bidi override强制控制字符可以切换字符组的显示顺序。”
Bidi override甚至可以不同于其逻辑编码的顺序显示单个脚本字符。正如研究人员指出的那样,这一功能以前曾被用来伪装通过电子邮件传播的恶意软件的文件扩展名。
问题在于:大多数编程语言都允许开发者将这些Bidi override控制字符放在注释和字符串中。这很糟糕,因为大多数编程语言都允许注释,而且注释中的所有文本(包括控制字符)都被会编译器和解释器忽略。同样糟糕的是,大多数编程语言都允许使用包含任意字符(包括控制字符)的字符串。
这是第一个危及几乎所有软件的,“简洁优雅的”超级漏洞。
剑桥大学计算机安全教授、该研究的合著者罗斯·安德森说:“因此,您可以在对人类审阅者看来无害的源代码中使用它们,(暗地里)却做一些令人讨厌的事情。” “对于像Linux和Webkit这样的项目来说,这绝对是个坏消息,这些项目接受任何人的代码贡献,人工审核后将它们合并到关键代码中。据我所知,这个漏洞是第一个影响几乎所有(软件)的漏洞。”
该研究论文将该漏洞称为“Trojan Source”,指出虽然注释和字符串都有特定语法指示其开始和结束位置,但Bidi overrides不遵守这些界限。论文指出:
“因此,如果将Bidi控制字符有意放置在注释和字符串中,我们能以大多数编译器可接受的方式将它们偷偷混入源代码中。我们的主要见解是,我们可以重新排列源代码字符,让它们看上去是合乎句法的源代码。”
“将所有这些结合在一起,我们能够对源代码实施新型供应链攻击。通过将Unicode Bidi控制字符注入注释和字符串中,攻击者可以在大多数现代计算机语言中生成句法有效的源代码,其中字符的显示顺序呈现与实际逻辑不同的逻辑。实际上,我们已经偷梁换柱将程序A转换为程序B。”
安德森表示,这样的攻击对于人类代码审查人员来说可能很难检测到,因为渲染的源代码看起来完全可以接受。
“如果逻辑上的变化足够微妙,以至于在后续测试中未被发现,那么攻击者可能会在不被发现的情况下引入有针对性的漏洞。”他说。
同样令人担忧的是,Bidi控制字符通过大多数现代浏览器、编辑器和操作系统上的复制和粘贴功能驻留。
“任何将代码从不受信任的来源复制到受保护的代码库中的开发人员都可能无意中引入了一个不可见的漏洞。”安德森指出:“这种代码复制是现实世界安全漏洞的重要来源。”
约翰霍普金斯信息安全研究所副教授马修格林表示,剑桥的研究清楚地表明,大多数编译器都可以被Unicode欺骗,以不同于读者预期的方式处理代码。
“在阅读这篇论文之前,Unicode可以以某种方式被利用的想法不会让我感到惊讶,”格林指出:“令我惊讶的是,有多少编译器会在没有任何防御的情况下愉快地解析Unicode,以及他们的从右到左编码技术在将代码潜入代码库方面的效果如何。这是一个非常聪明的技巧,人们以前压根没有想到这种可能性。”
格林说,好消息是研究人员进行了广泛的漏洞扫描,但无法找到任何人正在利用此漏洞的证据。但是:
“坏消息是它没有防御措施,现在人们知道了,不法分子可能会开始利用它,”格林说:“希望编译器和代码编辑器开发人员能够快速修补这个问题!但由于有些人不定期更新开发工具,至少在一段时间内会有一些风险。”
安德森指出,到目前为止,大约一半负责维护受影响的计算机编程语言的组织已经承诺提供补丁,但其他人正在拖延。
“我们将在接下来的几天内监控他们的部署,”安德森说。“我们还期待Github、Gitlab和Atlassian采取行动,因此他们的工具应该能够检测对仍然缺乏双向字符过滤的语言的代码的攻击。”
至于需要对Trojan Source采取什么措施,研究人员敦促依赖关键软件的政府和公司确定其供应商的安全态势,向他们施加压力以部署足够的防御,并确保工具链中任何一个环节都被覆盖。
论文指出:
“Trojan Source漏洞几乎影响所有计算机语言,这使其成为在整个技术生态中跨平台跨供应商比较响应能力的难得机会。”该论文总结道。“由于使用这些技术可以轻松发起强大的供应链攻击,因此,所有参与软件供应链的组织实施防御至关重要。”
加州大学伯克利分校计算机科学系讲师尼古拉斯韦弗则也指出:
“对该漏洞的协调披露过程将会是观察我们如何解决此类问题的绝佳范本,”他说。“这个漏洞是真实存在的,但也凸显了现代计算机代码依赖性中的更大漏洞。”
截至发稿,Rust已针对此安全漏洞发布了安全公告,漏洞编号为CVE-2021-42574和CVE-2021-42694。
论文地址