日前,开源软件XZ被植入“后门”事件,引发了网络安全界的轩然大波。研究人员发现,在包括Red Hat和Debian在内的多个流行Linux版本中,一款压缩工具被悄悄植入了恶意代码,这样攻击者即使没有有效账号,也可以通过SSHD(一个负责SSH连接工作的关键二进制文件)访问系统了。
据了解,Lasse Collin在2005年使用LZMA压缩算法设计了.xz文件格式。久而久之,这种压缩格式被广泛用于压缩tar文件、Linux内核映像及许多其他用途。值得庆幸的是,这个后门及时被发现,且目前还未收到其被实际利用的报告。GitHub也以违反服务条款为由,立即禁用了Tukaani项目维护的XZ Utils代码库。如果这个后门的植入技术更加隐秘高超,那么当XZ被广泛引入各Linux发行版后,后果将不堪设想,甚至是灾难级别的。
通过进一步的深入分析,研究人员认为本次爆出的“后门”事件是一次典型的软件供应链投毒事件。因为相关的恶意代码是由一位名为Jia Tan(JiaT75)的项目维护人员,通过多次代码变更的方式,植入到了Tukaani项目中。在近三年的时间里,Jia Tan一直为XZ项目贡献高质量代码,最终才获得了该项目的提交访问权和维护权。以下总结梳理了一个详细的时间轴,对本次意义深远的后门攻击事件进行复盘回顾:
2021年10月29日:Jia Tan向xz-devel邮件列表发送了第一个无害补丁,添加“.editorconfig”文件。
2021年11月-2022年4月:Jia Tan向xz-devel邮件列表发送了多个无害补丁,对项目中存在的构建问题进行了修复,这些补丁看起来质量很高。
2022年4月22日:Jigar Kumar向Jia Tan发送了首封邮件,希望他提交的补丁能够被合并。此时,Lasse Collin已经合并了Jia Tan的四个补丁,并在提交信息中标注了“感谢Jia Tan”。
2022年5月19日:一个名为“Dennis Ens”的开发者向xz -devel发送了施压邮件,询问XZ for Java是否得到及时的维护。Lasse Collin为自己回复慢道歉,同时表示,Jia Tan在XZ Utils方面帮助了我,未来他可能扮演更重要的角色。因为我精力有限,从长远来看需要有所变化。
2022年6月7日:另一个名为“Jigar Kumar”的开发者向Java主题帖发送施压邮件。“除非有新的维护者,否则该项目不会有进展。XZ for C的提交日志也寥寥无几。当前的维护者失去了兴趣,或者不再关心维护。看到代码库出现这样的局面,我很难过。”
2022年6月8日:Lass Collin回复称,我正在与Jia Tan进行沟通交流,希望他将来会扮演更重要的角色。尽管这是没有报酬的业余项目。
2022年6月10日:Lasse Collin在git元数据中合并了Jia Tan作为作者的首次提交。
2022年6月14日:Jigar Kumar再次发送施压邮件。“以你目前的速度,我很怀疑今年能不能看到5.4.0版本。自4月份以来,唯一的进展是测试代码出现了小小的修改。你忽略了这个邮件列表中无人注意的许多补丁。为什么等到5.4.0才换维护者?为什么迟迟未合并你的代码库需要的补丁?”
2022年6月21日:Dennis Ens也再次发送了施压邮件。“我知道这是所有贡献者的业余项目,但社区需要更多。为什么不放弃XZ for C的维护工作,这样可以对XZ for Java给予更大的关注?或者把XZ for C交给别人维护、专注于XZ for C?试图维护两个项目意味着两者都得不到精心的维护。”
2022年6月29日:面对多次的邮件催促,Lasse Collin进行了统一回复:Jia Tan已帮了很多忙,实际上他已经是这个项目的共同维护者。在git代码库中,一些小的修改一直在进行。至少对于XZ Utils来说,维护方面已出现了一些变化。
2022年7月:在各种邮件施压下,Lasse开始与Jia Tan更密切地合作。但是现在看来,Jigar Kumar和Dennis Ens的邮箱地址nameNNN@mailhost从未出现在网络上的其他地方,也没有再出现在xz-devel,看起来很可能是为了迫使Lasse为Jia赋予更大的控制权而伪造的。在随后时间里,Jia开始在xz-devel上回复关于即将发布的5.4.0版本的帖子。
2022年9月27日:Jia Tan作为项目主要维护者发布了5.4.0版本的摘要。
2022年11月30日:Lasse Collin将bug报告邮箱修改为属于他和Jia Tan的别名,并在README文件中指出“可以通过xz@tukaani.org联系项目维护者Lasse Collin和Jia Tan”。
2022年12月30日:Jia Tan将第一个提交直接合并到xz代码库中。此时我们知道他们有提交权限。
2023年1月1日:Lasse Collin标记并构建了他的最终版本v5.4.1。
2023年3月18日:Jia Tan标记并构建了他的第一个版本v5.4.2,并在两天后更新了Google oss-fuzz配置,向他们发送bug。
2023年6月22日:Hans Jansen发送了一对补丁(由Lasse Collin合并),使用“GNU间接函数”特性在启动时选择快速CRC函数。最后的提交由Lasse Collin改动,并由Jia Tan合并。这个更改很重要,因为它提供了一个钩子(hook)后门代码,可以通过这个钩子在全局函数表被重新映射为只读之前修改它们。
2023年7月7日:Jia Tan在oss-fuzz构建期间禁用ifunc支持,声称ifunc与地址消毒程序不兼容。这本身可能是无害的,不过这为以后使用ifunc奠定了基础。
2024年1月19日:Jia Tan将网站移至GitHub页面,得以控制XZ Utils网页。Lasse Collin为指向GitHub页面的xz.tukaani.org子域创建了DNS记录。攻击被发现后,Lasse Collin删除了这条DNS记录,回到了他控制的tukaani.org。
2024年2月23日:Jia Tan将隐藏的后门二进制代码合并到一些二进制测试输入文件中。README表明“该目录包含一堆文件,用于测试解码器实现中的.xz、.lzma (LZMA_Alone)和.lz(lzip)文件的处理。对于这类库而言,拥有这些类型的测试文件司空见惯。Jia Tan趁机添加了不会被仔细审查的几个文件。
2024年2月24日:Jia Tan标记并构建v5.6.0,并发布带有额外恶意build-to-host.m4的xz-5.6.0.tar.gz发行版,构建deb/rpm软件包时该文件添加后门。这个m4文件不存在于源代码库中,但打包过程中另外其他合法文件也被添加了,因此它本身并不可疑。但脚本已被改动,添加了后门。
2024年2月24日:Gentoo在5.6.0中开始出现崩溃。这似乎是一个真正的ifunc漏洞,而不是隐藏的后门中的漏洞,因为这是附有Hans Jansen的ifunc更改的第一个xz。
2024年2月28日:Jia Tan在一个用来检查landlock支持的C程序中添加了不易发现的误拼(typo),破坏了配置脚本中的landlock检测。配置脚本尝试构建并运行C程序以检查landlock支持,但由于C程序有语法错误,根本不会构建和运行,脚本会始终认为没有landlock支持。Lasse Collin被标为提交者,他可能未发现这个误拼,因为Jia Tan在他的许多其他更改中没有费心去伪造提交者。这个补丁似乎是为sshd更改之外的操作而精心准备的,因为landlock支持(而不是liblzma)是xz命令的一部分。
2024年3月4日:RedHat发行版开始在liblzma的_get_cpuid(进入后门的入口)中看到Valgrind错误。工作人员开始竭力解决这个问题。
2024年3月5日:libsystemd合并请求被合并,以移除libzma。攻击者在发行版完全杜绝这种方法之前竭力给libzma植入后门;Debian将xz-utils 5.6.0-0.2添加到测试版;Jia Tan提交了两个ifunc错误修正版。这些似乎是对实际ifunc错误的真正修复。一个提交链接到Gentoo bug。
2024年3月8日:Jia Tan提交了所谓的Valgrind修正版。这是一种遮眼术,但很有效。在第二天,Jia Tan又提交了更新后的后门文件。这是实际的Valgrind修正版,更改了含有攻击代码的两个测试文件。Jia Tan还故意作了说明,“原始文件是在我的机器上随机生成的。为了在将来更好地再现这些文件,使用了constant种子来重建这些文件。”
2024年3月9日:Jia Tan标记并构建v5.6.1,并发布xz 5.6.1发行版,含有新的后门。
2024年3月20日:Lasse Collin向LKML发送了补丁集,用他自己和Jia Tan作为内核中xz压缩代码的维护者替换了他的个人邮件。没有任何迹象表明Lasse Collin在这里行为不端,他只是澄清自己是唯一维护者。
2024年3月25日:Hans Jansen回来,提交了Debian bug,将xz-utils更新到5.6.1。就像在2022年的施压活动中一样,出现了更多的name###@mailhost地址以示支持。
2024年3月28日:Jia Tan提交了Ubuntu bug,从Debian将xz-utils更新到5.6.1。就在当天,Andres Freund发现了风险隐患,私下通知Debian和distros@openwall。Debian回退5.6.1,引入了5.6.1+really5.4.5-1。
2024年3月29日:Andres Freund在公开的oss-security@openwall列表上发布后门警告,称他“在过去几周”发现了后门。当天,RedHat宣布发布的Fedora Rawhide和Fedora Linux 40测试版中有植入后门的xz。
2024年3月30日:Debian关闭构建版本,使用Debian稳定版重建构建系统,可能是为了防止恶意软件xz逃离沙箱。