XZ后门技术解读:狼是怎么进来的?

20240401202705

这一篇文章尝试从技术角度来解读XZ后门事件,试图搞清楚这个恶意代码引入和执行的逻辑。关于该事件的整体情况,请关注本公众号,查看最新的另一篇文章《XZ压缩工具被植入后门,Linux发行版差点全部沦陷?开源软件界炸了~》。

后门是如何工作的

首先,liblzma库中被引入了恶意代码,这个代码劫持了 RSA_public_decrypt 这一函数,在 sshd 的公钥认证过程中,会调用RSA_public_decrypt 函数(实际上调用了攻击者植入的函数),从而执行攻击者的代码,之后该代码会回调 libcrypto 进行正常认证,这样攻击者在特定条件下就有可能绕过认证,从而对存在漏洞的服务器造成远程代码执行(RCE)。

这有点像中间人攻击,看起来并不复杂。问题是,这么明显的代码漏洞怎么会被引入到软件中呢?

社会工程学

攻击者为了能顺利让自己的恶意代码被合并进来,其实进行了一系列的准备和复杂操作,其中也用到了社会工程学。

首先,攻击者专门创建了一系列开发者账号,其中Jia Tan是主要的代码贡献者,另外还有一些配合的账号,可以认为是“僚机”。

2022 年 4 月,Jia Tan 通过邮件列表提交了一个补丁。这个补丁无关紧要,但接下来的事件却很重要。一个新的角色——Jigar Kumar进入,并开始施压要求合并这个补丁。不久之后,Jigar Kumar 开始向Lasse Collin施压,要求他为 XZ 增加一名维护者。…… 之后Jigar Kumar再也没有出现过。另一个账户 — Dennis Ens也参与了施压,使用类似的名称+数字格式的电子邮件。这个账户在 xz 讨论之外也从未出现过,并且两者都没有任何被发现的关联账户。

成为一名维护者意味着对项目有更大的权限,Jia Tan为了达到这一目的,需要更多的人配合,很明显另外两个人都是他的“僚机”。当然,不排除这些账号背后都是一个人在控制。下面看看这些人是怎么对项目维护者施压(进行PUA)的:

“现在在这里提交补丁已经没有意义了。当前的维护者失去了兴趣或不再关心维护。看到这样的仓库真是令人难过。”

事实上,项目维护者此时也承担着巨大的压力,并且有了一些心理健康问题,项目维护者反驳道:

“我并没有失去兴趣,但我的关注能力相当有限,这主要是由于长期的心理健康问题,但也有一些其他原因。最近,我与 Jia Tan 在 XZ Utils 上合作了一些,也许他未来会扮演更重要的角色,我们拭目以待。请记住,这是一个无偿的业余项目。”

项目维护者的回答也令人心酸,这里引出了另一个令人值得反思的问题,很多开源项目都是一些开发者无偿的业余项目,开源世界不能只知道享受这些开源软件的果实,开发者的状态,包括心理健康,难道不值得关注吗?言归正传,Lasse Collin最终在压力下添加了Jia Tan为维护者,2023年3 月份,XZ项目在 Google oss-fuzz 中的主要联系人电子邮件更新为Jia ,而不是Lasse Collin。(oss-fuzz应该是用来对xz软件进行测试的工具)

OSS-Fuzz是谷歌推出的一个项目,为开源软件提供持续的模糊测试。模糊测试是一种自动化的代码测试技术,有助于发现编程错误,许多错误可能会有严重的安全影响,如缓冲区溢出。OSS-Fuzz的目标是通过结合现代模糊测试技术与可扩展的分布式执行,使开源软件更加安全稳定。

完成了这关键一步——获取了信任和权限——接下来,攻击者的戏码开始上演了:

首先,攻击者在几个账号的配合下,通过连续几个PR的迷惑操作,让oss-fuzz项目禁用了利用 ifunc 进行模糊测试,此举可以让后面xz要添加的恶意代码不会被检测出来——这就好比入室盗窃之前先把院子里的狗解决掉。

然后,随着Jia Tan逐渐获取对项目的更大控制权,他找机会把包含后门的代码合并了进来。这些恶意代码伪装成了“不重要代码”而躲过了代码审查。当然,这也意味着代码审查流程存在着很大的问题。

当然,为了让后门代码不被检测出,攻击者所花费的心思远不止上面这些,接下来我们重点介绍一下其中的反调试手段。

反调试

恶意函数虽然被包含进了代码仓库,但是显然不能用恶意函数直接替换 RSA_public_decrypt ,那也太明目张胆了,很容易被发现。实际上,攻击者是在构建程序的过程中,通过篡改makefile中的链接符号,让最终生成的代码调用了恶意函数,而不是RSA_public_decrypt 。换句话说,攻击者没有在c语言中去篡改目标函数,他是在二进制代码中篡改了目标函数的地址,这就让人更难发现。

不止如此,在执行用于构建xz的混淆脚本后,它会执行各种检查,包括验证操作系统是否为 x86-64 Linux 以及构建是否是 Debian 或RPM包构建的一部分。XZ构建过程必须是 Debian 或RPM包构建的一部分才会安装后门(当尝试手动构建 XZ 包时,不会安装后门),这使得重现更加困难。

if ! (echo "$build" | grep -Eq "^x86_64" > /dev/null 2>&1) && (echo "$build" | grep -Eq "linux-gnu$" > /dev/null 2>&1); then

总结

世界上没有不透风的墙,只要他是人建造的。有多少安全问题本质上都是人的问题呢?我相信这个比例会非常大,如果不是全部。

扩展阅读

20240401203343


如果你对本文有任何疑问或建议,欢迎联系我。本博客所有文章除特别声明外,均为原创文章,未经授权请勿转载!

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密! 上一篇
XZ压缩工具被植入后门,Linux发行版差点全部沦陷?开源软件界炸了~ 下一篇

 目录