出品
开源中国
作者
罗奇奇
11月1日,剑桥大学研究人员:NicholasBoucher和RossAnderson公布了一个Unicode双向算法“bidi”相关的漏洞,该漏洞被命名为“TrojanSource”,追踪代号CVE--。
bidi双向算法设计之初是用于处理不同语言的文字排序问题,比如将阿拉伯语单词(从右到左阅读)写入英语句子(从左到右)。大多数编程语言都允许开发者将bidi字符放在字符串文字和注释里边,但是,注释和字符串需要遵守语法,Bidioverrides却不用遵守。因此,将一段代码使用Bidi算法多层LRI和RLI相互嵌入,就可以把其中的字符串任意组合,重新排序。如果你有足够的时间,甚至可以重排一份源代码的字符,生成一份新的符合语法规范的代码。
这对于像Linux或Webkit这样的超大型开源项目来说并不是一个好消息。如果这个漏洞被用于恶意攻击,将导致一个很大的问题:审查者看到的代码逻辑很可能和编译器编译出来的程序逻辑不一样。来看一下这个python的例子:
图一和图二都定义alice的值为,并调用同一个函数:将alice减去50,根据程序逻辑,两组程序都应该返回50。
但图一插入了RLI,subtract_funds函数体的return实际上是由于bidiRLI覆盖而执行的,因此图一的bank{account}_=amount语句永远也不会执行,只会返回。
相同的原理也可以应用于其他语言,这个漏洞实际上是Unicode自身的问题,却实实在在地影响到了所有支持Unicode的语言,包括C、C++、C#、JavaScript、Java、Rust、Go和Python等一系列流行的编程语言。
目前,研究组已将“TrojanSource”漏洞通知所有受影响的编程语言组织和软件商。
后续发展
Rust收到消息后迅速发布1.56.1版本,以解决此问题。
据theregister报导,软件开发商Atlassian迅速发布了针对CVE--的安全公告,影响了从Confluence到Jira的一系列产品,并通过多个软件更新来解决该问题。