跳到主要内容

潜伏开源项目3年,混成核心开发者,竟然只为加一个后门

· 阅读需 9 分钟
古时的风筝

这几天爆出了一个开源项目xz 的漏洞,在安全研究员分析了漏洞原因以及这个漏洞产生的整个过程,不得不感叹,这黑客的心思缜密,真就像电视剧里的卧底一样,步步为营,从普通贡献者到核心开发者,有直接commit权限,用两年半的时间悄悄加一个后门进去。

我们之前听说过的漏洞是怎么出现的呢?基本上有两种形式。

第一种,软件或者操作系统本身的代码不严谨,在某些特殊情况下会产生问题,黑客通过研究操作系统或软件本身的代码,或者使用某些手段,构造特定的攻击流程和数据,从而完成漏洞的利用。比如每年都会举办针对各种电脑、手机的安全大赛,能够使用某些手段破解系统的高手,可以获得丰厚的奖励。

第二种,就是黑客将病毒挂当网页,或者植入到某些应用中,例如你访问了某些不太友好的网站,或者在某些不知名平台下载了软件,就可能带有病毒。这些病毒会为电脑打开后门,制造者只需要用事先设计好的方式就可以干坏事儿了。

而这次的方式不同,作者以一个程序员的身份参与到 xz 这款开源的压缩工具,并且用将近 3 年的时间混到了主要贡献者,甚至是主要负责人。然后一步步的、非常巧妙的将后门植入进去。

xz 是一个压缩工具,并且被远程登录工具 sshd 使用,MacOS 和 Linux 都装有 sshd,所以,也就是都要用到 xz,可想而知,如果 xz 被植入后门,那影响可不是一般的大,而是非常之大。

被植入后门的是 xz 5.6.0 和 5.6.1 这两个版本,因为是刚合并不久就被发现了,所以目前影响很小,如果你用的是 MacOS ,检查一下吧,如果不幸就是这两个版本中的一个,那降下来就好了。

我看了一下我的版本是 5.2.10,还有一台服务器,版本是 5.2.5,很好。看样子,只有非常新的系统版本或者主动升级过的才有问题。

步步为营的过程

整个过程是这样的:

  1. 始作俑者 JiaT75 (Jia Tan) 在 2021 年注册了 GitHub 账号,之后积极参与 xz 项目的维护,并逐渐获取项目组高层信任,最终获得了直接 commit 代码的权利。他用的名字非常像中国人名,并且提交代码的时区是东八区,有意制造出自己是个中国人的假象。但是黑客肯定是不会傻到使用真名的,所以这个身份应该是假的。
  2. JiaT75 在最近几个月的一次 commit 中,悄悄加入了 bad-3-corrupt_lzma2.xz 和 good-large_compressed.lzma 两个测试用二进制数据,这两个测试数据看起来再正常不过了,然而在编译脚本中,在特定条件下会从这两个文件中读取内容对编译结果进行修改,致使编译结果和公开的源代码不一致。并且测试数据在直接源代码编译的时候还不会调用,只有在打包编译上才会调用。
  3. 据初步研究显示,注入的代码会使用 glibc 的 IFUNC 去 Hook OpenSSH 的 RSA_public_decrypt 函数,致使攻击者可以通过构造特定的验证数据绕过 RSA 签名验证。
  4. 所以,只要是同时使用了 liblzma 和 OpenSSH 的程序就会受到影响,最直接的目标就是 sshd,使得攻击者可以构造特定请求,绕过密钥验证远程访问。
  5. 目前,受影响的 xz 包已经被并入 Debian testing 中进行测试,攻击者同时也在尝试并入 fedora 和 ubuntu。 这位黑客故意在ubuntu beta freeze 的几天前才提交并入,应该是为了减少测试时间,以免被发现。

这位黑客到被揭穿的前夕,已经从普通贡献者混到了主要贡献者,并且有了直接提交代码的权限,可想而知,实力是非同一般的。

并且 xz 项目的负责人有定期「断网」的习惯,就是隔一段时间就去享受人生,不关注网络,所以据说到现在还没联系上。这也给了这位黑客一个好机会,因为不会有人 review 代码了。

百密一疏,还是被发现了

这位兄弟机关算尽,但终究是百密一疏。他注入的代码有一点点 Bug,导致特定情况下 sshd 的 CPU 占用飙升。另一个开源贡献者PostgreSQL的开发者发现了 CPU 飙升并查找原因,在进行性能分析的时候发现有一个 500毫秒的延时 ,这样顺藤摸瓜才将这个后门揪出来。

xz 项目的其他人以及所有下游厂商安全研究都没有及时发现,如果不是这个巧合,那不知道这个后门会进入到多少台电脑、服务器,没准以后我们用的MacOS开发机都会中招。

目前看到的这段代码,是编译打包时进行的安全测试文件(make)指令,在其中加入了一个".",这会导致文件失效并跳过沙盒测试。

基本的原理就是在编译的时候,把测试数据里的一些东西扒出来当成 shell 命令执行了,执行的命令可以往编译产物里再注入其他东西。

这段代码被合并到公版后,黑客就可以在下一版中就可以往沙盒代码库里加入“不经过安检”的任何代码了。

最后

为了最终的目的,可以在开源项目中潜伏 2 年多,并且一步步混到差不多是最高层,这不妥妥的卧底当上了老大的爽文情节吗。有这种实力,不来参加面试可惜了,这不想进阿里进阿里,想进字节进字节吗。

还看到有人说,Linux 用了那么多第三方的依赖,说不定哪一个就有差不多的后门而不为人所知呢,细思极恐啊。

风筝

作者

风筝

古时的风筝,一个平庸的程序员,主语言 Java,第二语言 Python,其实学 Python 的时间比 Java 还要早。喜欢写博客,写博客的过程能加深自己对一个知识点的理解,同时还可以分享给他人。喜欢做一些小东西,所以也会一些前端的东西,React、JavaScript、CSS 都会一些,做一些小工具还够用。