作为20世纪出生的老年读者,当年或多或少都会在自己的QQ消息框或者QQ签名之类的地方做一些手脚,让自己的文字显示或者变成竖排或者变成从右往左顺序^_^ 而研究人员想到把这种攻击引入到代码中,是否能够让人工代码审计无法察觉,从而引入潜在的安全问题呢?本文作者关注的就是这种最让开发人员头痛的代码编码多样性,首先作者发现在Unicode规范中有如下表所示的一些方向指示字符,一旦使用了这些方向转换字符,文字方向就会改变!
于是,我们可以构造如下的代码:
由于RLI转换方向的作用,这行代码在文本编辑器里面实际上会被渲染为:
也就是说,之前那个return被RLI转换成了单词序从右往左,看起来好像是文本中的一个单词,然而在实际执行中,它是在文本之外起到了关键字的功能。这样,代码就无法产生实际的扣款作用了!
这种攻击方法对 C、C++、C#、JavaScript、Java、Rust、Go 和 Python 都有效,例如攻击者构造如下一个C代码片段:
如果IDE或者文本编辑器渲染之后,显示效果应该是:
实际上,这个代码中的if条件根本没有执行,而是被放置在注释部分,只是因为显示效果才起到了对人的欺骗作用!
作者验证了GNU’s gcc v7.5.0 (on Ubuntu)、Apple clang v12.0.5 (on MacOS)、.NET 5.0 dotnet-script interpreter (on MacOS)、Node.js v16.4.1 (MacOS)、OpenJDK v16.0.1 on MacOS、Rust
v1.53.0 (on MacOS)、 Go v1.16.6 on MacOS、Python 3.9.5 compiled using clang 12.0.0 (on MacOS)、Python 3.7.10) compiled using GNU’s gcc (on Ubuntu) 等诸多编译器/解释器,作者还对一众编辑器的代码渲染显示(包括GitHub和BitBucket在线代码显示功能)进行了测试,发现它们大部分都有一致的显示效果,也就是说攻击者的攻击代码在这些编辑器上显示出来的效果都能起到同样的欺骗作用!
作者不仅关注了上述的一些攻击,还注意到攻击者可能会利用长相相似的字符集来做相关攻击:
看到这里,你是不是已经回忆起来了2019年 G.O.S.S.I.P 暑期学校上,奇安信研究员郑晓峰老师为大家介绍的《网络基础协议安全研究初探》课程中,介绍过的相关内容!
如果你还记得当时的课程,读完今天的论文,你在会心一笑的同时,是不是会马上举一反三,想到其他的研究点呢?实际上,本文作者也在大规模扫描中发现了现实中的在野利用,例如利用上述技巧来隐藏代码中的关键调用:
system(“cat /etc/passwd”)
作者不仅报告了相关漏洞,也开发了酷炫的网站https://trojansource.codes/ (最近搞安全研究,不会美工和web开发都不好意思发论文啊!)
扩展阅读:
https://lwn.net/Articles/57135/
早在2003年,内核维护人员就注意到有人想要通过浑水摸鱼往代码中引入后门,今天这篇论文可以说是将这种手段发展到了新的高度!
PoC:
https://github.com/nickboucher/trojan-source
论文PDF:
https://trojansource.codes/trojan-source.pdf
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 学术论文推荐 2021-11-01