Unicode漏洞集
2022-01-18 15:32:26 阿炯

本站赞助商链接,请多关照。 Unicode 算法漏洞“Trojan Source”几乎影响所有编程语言

2021年11月1日,剑桥大学研究人员:Nicholas Boucher 和 Ross Anderson 公布了一个 Unicode 双向算法“bidi”相关的漏洞,该漏洞被命名为“ Trojan Source”,追踪代号:CVE-2021-42574

bidi 双向算法设计之初是用于处理不同语言的文字排序问题,比如将阿拉伯语单词(从右到左阅读)写入英语句子(从左到右)。大多数编程语言都允许开发者将 bidi 字符放在字符串文字和注释里边,但是,注释和字符串需要遵守语法,Bidi overrides 却不用遵守。因此,将一段代码使用 Bidi 算法多层 LRI 和 RLI 相互嵌入,就可以把其中的字符串任意组合,重新排序。如果你有足够的时间,甚至可以重排一份源代码的字符,生成一份新的符合语法规范的代码。

这对于像 Linux 或 Webkit 这样的超大型开源项目来说并不是一个好消息。如果这个漏洞被用于恶意攻击,将导致一个很大的问题:审查者看到的代码逻辑很可能和编译器编译出来的程序逻辑不一样。来看一下这个 python 的例子:


图一和图二都定义 alice 的值为100, 并调用同一个函数:将 alice 减去 50 ,根据程序逻辑,两组程序都应该返回 50。

但图一插入了 RLI ,subtract_funds 函数体的 return 实际上是由于 bidi RLI 覆盖而执行的,因此图一的 bank{account} _=amount 语句永远也不会执行,只会返回 100 。

相同的原理也可以应用于其他语言,这个漏洞实际上是 Unicode 自身的问题,却实实在在地影响到了所有支持 Unicode 的语言,包括 C、C++、JavaScript、Java、Rust、Go、Perl 和 Python 等一系列流行的编程语言。

目前,研究组已将“ Trojan Source”漏洞通知所有受影响的编程语言组织和软件商,“Trojan Source”漏洞报告原文。

相关新闻

Rust 收到消息后迅速发布 1.56.1 版本,以解决此问题。软件开发商 Atlassian 迅速发布了针对 CVE-2021-42574 的安全公告,影响了从 Confluence 到 Jira 的一系列产品,并通过多个软件更新来解决该问题。

GCC 12 已准备好抵御基于 Unicode 的 Trojan Source 攻击

2022年1月中旬消息,利用 Unicode 的控制字符,可对程序的源代码进行重新排序,从而在编译时产生另一种结果。但即将发布的 GCC 12 编译器版本有一个新的警告,可以帮助指出源代码中可能存在的 Trojan Source 攻击。

GCC 12 添加了 -Wbidi-chars 警告标志,用于检测涉及 Unicode 控制字符的 Trojan Source 攻击。此外还有一个新的默认开启的标志,用于 GCC 诊断以转义非 ASCII 字符,以帮助指示控制字符问题。新的 -Wbidi-chars 选项已准备好用于 GCC 12,应该会在 4 月左右以 GCC 12.1 的形式稳定发布。

此外,红帽技术人员 David Malcolm (曾参与 GCC 编译器对抗 Trojan Source 攻击的技术开发)写了一篇博客,详细介绍了 Unicode 算法漏洞“Trojan Source” 的实现原理,以及 GCC 12 这个新的预防警告 -Wbidi-chars 如何生效。