关于漏洞:简洁优雅的超级漏洞-Unicode可在无形中威胁所有编程语言

16次阅读

共计 1689 个字符,预计需要花费 5 分钟才能阅读完成。

11 月 1 日,剑桥大学钻研人员发现了一个可影响当今大多数计算机软件代码编译器和软件开发环境的破绽。这个破绽来自数字文本编码标准 Unicode 的一个组件,与 Unicode 双向算法“bidi”相干。

危及简直所有软件的超级破绽

Unicode 目前在 154 中不同的编程语言脚本中定义了超过 14.3 万个字符(除了一些非脚本字符集,例如表情符号)。

该破绽被命名为“原木马”(Trojan Source),该算法解决蕴含具备不同显示程序的混合脚本的显示文本,例如阿拉伯语(从右到左浏览)和英语(从左到右)。

大多数编程语言都容许开发者将 bidi 字符放在字符串文字和正文里边, 然而,正文和字符串须要恪守语法,Bidi overrides 却不必恪守。

因而,将一段代码应用 Bidi 算法多层 LRI 和 RLI 互相嵌入,就能够把其中的字符串任意组合,从新排序。如果你有足够的工夫,甚至能够重排一份源代码的字符,生成一份新的合乎语法标准的代码。

这是第一个危及简直所有软件的,“简洁优雅的”超级破绽。

对所有反对 Unicode 的语言不利

剑桥大学计算机平安传授、该钻研的合著者罗斯·安德森称:

“对于像 Linux 和 Webkit 这样的我的项目来说,这相对是个坏消息,这些我的项目承受任何人的代码奉献,人工审核后将它们合并到要害代码中。据我所知,这个破绽是第一个影响简直所有(软件)的破绽。”

如果这个破绽被用于歹意攻打,将导致一个很大的问题:审查者看到的代码逻辑很可能和编译器编译进去的程序逻辑不一样。

来看一下这个 python 的例子:

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

但图一插入了 RLI,subtract\_funds 函数体的 return 实际上是因为 bidi RLI 笼罩而执行的,因而图一的 bank{account} \_=amount 语句永远也不会执行,只会返回 100。

雷同的原理也能够利用于其余语言, 这个破绽实际上是 Unicode 本身的问题,却实实在在地影响到了所有反对 Unicode 的语言 ,包含 C、C++、C#、JavaScript、Java、Rust、Go 和 Python 等一系列风行的编程语言。

安德森示意,这样的攻打对于人类代码审查人员来说可能很难检测到,因为渲染的源代码看起来齐全能够承受。

“如果逻辑上的变动足够奥妙,以至于在后续测试中未被发现,那么攻击者可能会在不被发现的状况下引入有针对性的破绽”,他说。

大多数编译器都能够被 Unicode 坑骗

同样令人担忧的是,Bidi 控制字符通过大多数古代浏览器、编辑器和操作系统上的复制和粘贴性能驻留。

“任何将代码从不受信赖的起源复制到受爱护的代码库中的开发人员都可能无心中引入了一个不可见的破绽。”安德森指出:“这种代码复制是事实世界安全漏洞的重要起源。”

约翰霍普金斯信息安全研究所副教授马修格林示意,剑桥的钻研分明地表明, 大多数编译器都能够被 Unicode 坑骗,以不同于读者预期的形式解决代码。

格林说, 好消息是钻研人员进行了宽泛的破绽扫描,但无奈找到任何人正在利用此破绽的证据。 然而:

坏消息是它没有进攻措施,当初人们晓得了,不法分子可能会开始利用它 ”,格林说:

​“心愿编译器和代码编辑器开发人员可能疾速修补这个问题!但因为有些人不定期更新开发工具,至多在一段时间内会有一些危险。”

安德森指出,到目前为止, 大概一半负责保护受影响的计算机编程语言的组织曾经承诺提供补丁,但其他人正在迁延。

“咱们将在接下来的几天内监控他们的部署,”安德森说。“咱们还期待 Github、Gitlab 和 Atlassian 采取行动,因而他们的工具应该可能检测对依然不足双向字符过滤的语言的代码的攻打。”

至于须要对 Trojan Source 采取什么措施,钻研人员催促依赖要害软件的政府和公司确定其供应商的平安态势,向他们施加压力以部署足够的进攻,并确保工具链中任何一个环节都被笼罩。

截至目前,Rust 已针对此安全漏洞公布了平安布告,破绽编号为 CVE-2021-42574 和 CVE-2021-42694。

正文完
 0