概况说明

事故发生于一个叫 XZ Utils 的库,它是一组用于压缩和解压缩 .xz 格式文件的工具和库,被广泛用作基础库。3 月 29 日,微软 PostgreSQL 开发人员 Andres Freund 在 开源安全邮件列表 上发帖称,他在调查 SSH 性能问题时发现了 XZ 包中的恶意代码。随后,人们发现写入恶意代码的人处心积虑,在 2021 年就着手准备这次计划。这个漏洞在 Freund 观察下发现在某些情况下允许恶意攻击者破坏「SSHD 身份认证」,最终攻击系统。

详情

  1. 攻击者 JiaT75 (Jia Tan) 于 2021 年注册了 GitHub 账号;
  2. 这家伙做的 第一个提交 并不是针对 xz,但现在看来非常可疑。
  3. JiaT75 在最近几个月的一次 commit 中,悄悄加入了 bad-3-corrupt_lzma2.xz 和 good-large_compressed.lzma 两个看起来人畜无害的测试用二进制数据。然而在编译脚本中,在特定条件下会从这两个文件中读取内容对编译结果进行修改,致使编译结果和公开的源代码不一致。
  4. 目前初步的研究显示,注入的代码会使用 glibc 的 IFUNC 去 Hook OpenSSH 的 RSA_public_decrypt 函数,致使攻击者可以通过构造特定的验证数据绕过 RSA 签名验证。(具体细节还在分析中)
  5. 只要是同时使用了 liblzma 和 OpenSSH 的程序就会受到影响,最直接的目标就是 sshd,使得攻击者可以构造特定请求,绕过密钥验证远程访问。
  6. 受影响的 xz-utils 包已经被并入 Debian testing 中进行测试,攻击者同时也在尝试并入 fedora 和 ubuntu。

被发现

After observing a few odd symptoms around liblzma (part of the xz package) on Debian sid installations over the last weeks (logins with ssh taking a lot of CPU, valgrind errors) I figured out the answer:
The upstream xz repository and the xz tarballs have been backdoored.

Freund 发现使用 ssh 登录时 CPU 占用很高,去寻找原因的时候发现了这个后门植入。

I was doing some micro-benchmarking at the time, needed to quiesce the system to reduce noise. Saw sshd processes were using a surprising amount of CPU, despite immediately failing because of wrong usernames etc. Profiled sshd, showing lots of cpu time in liblzma, with perf unable to attribute it to a symbol. Got suspicious. Recalled that I had seen an odd valgrind complaint in automated testing of postgres, a few weeks earlier, after package updates.
Really required a lot of coincidences.

当时 Freund 正在做一些微基准测试,需要使系统静止以减少噪音(就是测试性能时关闭其它消耗)。尽管由于用户名错误等原因立即失败,但 Freund 看到 sshd 进程使用了​​惊人数量的 CPU,分析了 sshd 时,发现 liblzma 用了大量的 cpu 时间,perf 无法定位到对应的方法,于是产生了怀疑。Freund 回想起几周前,在软件包更新后,他在 postgres 的自动化测试中看到了一个奇怪的 valgrind 报告。

如果不是因为这个 Bug,那么这个后门有很高的概率被并入主流发行版的 stable 版本,恐怕会是一件前所未有的重大安全事件。

另外从一些细节能看出来攻击者非常用心:

  1. 攻击者抢在 ubuntu beta freeze 的几天前才尝试让新版本并入,以期望减少在测试期间被发现的时间。
  2. xz-utils 项目的原维护者 Lasse Collin (Larhzu),有着定期进行 internet breaks 的习惯,而且最近正在进行,导致这些变动他并没有 review 的机会,即使到现在也没能联系上他本人。这可能也是攻击者选定 xz-utils 项目的原因之一。

吃瓜后记

后来开源社区很多人都对 Freund 表示感谢。

我觉得这像有政府背景资助的攻击行为。很难想象如果是一个普通的黑客,花费 3 年时间去做这一件事情,却没有其它收益,例如某些组织的奖金等,能有足够的动力去做这件事。

由于攻击者的名称像个华人,而且据说 commit 时间也符合东八区(由于 Github 已经封掉了仓库,我就没深入吃瓜了),现在有中国开发者发帖在切割关系。

We should take all these information provided by Jia Tan himself as fake ones. fake name, fake ip address, fake country, fake timezone, etc.

参考资料

  1. 开源安全邮件列表
  2. Yachen Liu 在 X 上的帖子
  3. Everything I Know About the Xz Backdoor
  4. FAQ on the xz-utils backdoor