💬
最近,关注到了xz开源项目被攻击的事情,整个过程很精彩。原文:https://research.swtch.com/xz-timeline 。对于分析攻击者的隐藏代码部分,可以查看 https://gynvael.coldwind.pl/?lang=en&id=782https://www.openwall.com/lists/oss-security/2024/03/29/4 ,应该可以帮助理解攻击者是如何隐藏真实代码的。
 
在两年多的时间里,一个使用“Jia Tan”名字的攻击者作为一个勤奋、有效的贡献者参与到xz压缩库的开发中,最终获得了提交权限和维护权。利用这些权限,他们在liblzma中安装了一个非常微妙且巧妙隐藏的后门,liblzma是xz的一部分,恰巧也是Debian、Ubuntu和Fedora等系统上OpenSSH sshd的依赖,以及其他通过链接libsystemd补丁ssh的基于systemd的Linux系统的依赖。(注意,这不包括像Arch Linux、Gentoo和NixOS这样没有给sshd打补丁的系统。)这个后门监视攻击者在SSH会话开始时发送隐藏命令,赋予攻击者在目标系统上运行任意命令的能力,而无需登录:未经认证的、针对性的远程代码执行。
该攻击在2024年3月29日被公开披露,似乎是首次严重的已知对广泛使用的开源软件的供应链攻击。这标志着开源供应链安全的一个分水岭时刻,无论是好是坏。
这篇文章是我构建的关于该攻击社会工程方面的详细时间线,看起来可以追溯到2021年底。(也请见我对攻击脚本的分析。)
欢迎在Bluesky、Mastodon或电子邮件上提出更正或补充。

序幕

2005-2008年:Lasse Collin 在其他人的帮助下,使用LZMA压缩算法设计了.xz文件格式,该格式将文件压缩到gzip的大约70%【1】。随着时间的推移,这种格式广泛用于压缩tar文件、Linux内核映像以及许多其他用途。

Jia Tan登场,伴随着配角

2021年10月29日:Jia Tan向xz-devel邮件列表发送了第一个无害的补丁,添加了“.editorconfig”文件。
2021年11月29日:Jia Tan向xz-devel邮件列表发送了第二个无害的补丁,修复了一个显而易见的可重复构建问题。随后发送了更多看似(即使是回顾起来)无害的补丁。
2022年2月7日:Lasse Collin 合并了第一个以“jiat0218@gmail.com”为作者的提交到git元数据中(“liblzma: 为LZMA和LZMA2属性编码器添加NULL检查”)。
2022年4月19日: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。
2022年5月19日:Lasse Collin 回复道歉,因反应迟缓,并补充说“Jia Tan在列表外帮助了我处理XZ Utils,他将来至少在XZ Utils上可能会有更大的作用。很明显,我的资源太有限了(因此许多邮件等待回复),所以长期来看必须做出一些改变。”
2022年5月27日:Jigar Kumar 向补丁线程发送施压邮件。“超过1个月了,合并的可能性并未增加。不意外。”
2022年6月7日:Jigar Kumar 向Java线程发送施压邮件。“在没有新的维护者之前,进展不会发生。XZ for C 的提交记录也很稀疏。Dennis,你最好等新的维护者出现,或者自己分支。在这里提交补丁现在没什么意义。当前的维护者失去了兴趣或不再关心维护了。看到这样的仓库很悲哀。”
2022年6月8日:Lasse Collin 回击。“我没有失去兴趣,但是我的关心能力确实受到了限制,主要是由于长期的心理健康问题,也因为一些其他事情。最近我和Jia Tan在XZ Utils上有一些列表外的工作,也许他将来会扮演更大的角色,我们会看到的。还应该记住,这是一个未付费的爱好项目。”
2022年6月10日:Lasse Collin 合并了以“Jia Tan”为作者的第一个提交到git元数据中(“测试:为硬件函数创建测试”)。注意,之前在2022年2月7日还有一个只设置了全名的提交jiat75。
2022年6月14日:Lasse Collin 合并了唯一一个以“jiat75@gmail.com”为作者的提交。这可能是Jia Tan一时git配置错误,忘记了他们的假电子邮件地址。
2022年6月14日:Jugar Kumar 发送施压邮件。“按照你当前的速度,我非常怀疑今年能看到5.4.0版本的发布。自四月以来的唯一进展是对测试代码的小改动。你忽视了许多在这个邮件列表上腐烂的补丁。现在你让你的仓库窒息。为什么要等到5.4.0才换维护者?为什么要延迟你的仓库所需的改变?”
2022年6月21日:Dennis Ens 发送施压邮件。“我很遗憾你的心理健康问题,但重要的是要意识到自己的极限。我明白这对所有贡献者来说都是一个爱好项目,但社区期望更多。为什么不把XZ for C的维护权转让给别人,这样你就可以给XZ for Java更多的注意力?或者把XZ for Java转让给别人,专注于XZ for C?试图同时维护两者意味着两者都无法维护好。”
2022年6月22日:Jigar Kumar 向C补丁线程发送施压邮件。“有进展吗? Jia,我看到你最近有提交。为什么你自己不能提交这个?”
2022年6月29日:Lasse Collin 回复说:“正如我之前的邮件中暗示的,Jia Tan将来可能在项目中扮演更大的角色。他在列表外已经提供了很多帮助,实际上已经是共同维护者了。:-) 我知道在git仓库中还没有发生太多事情,但事情是一步一步发生的。无论如何,维护权的某些变化已经在进行中,至少对于XZ Utils是这样。”

Jia Tan 成为维护者

此时,Lasse似乎已经开始与Jia Tan更紧密地合作了。Brian Krebs观察到,这些电子邮件地址之前从未在互联网上出现过,即使是在数据泄露中也没有(在xz-devel中也再没有出现)。看来这些可能是伪造的邮箱,用来推动Lasse给予Jia Tan更多控制权。这奏效了。在接下来的几个月里,Jia Tan开始在xz-devel上权威地回复关于即将发布的5.4.0版本的线程。
2022年9月27日:Jia Tan发布5.4.0版本的发布总结。(“计划在十二月发布将包含多线程解码器的5.4.0版本。我正在跟踪与5.4.0版本相关的开放问题列表……”)
2022年10月28日:Jia Tan被添加到GitHub上的Tukaani组织。成为组织成员并不意味着任何特殊的访问权限,但这是授予维护访问权限之前的必要步骤。
2022年11月30日:Lasse Collin将错误报告的电子邮件从他的个人地址更改为同时发送给他和Jia Tan的别名,README中注明“项目维护者Lasse Collin和Jia Tan可以通过xz@tukaani.org联系到。”
2022年12月30日:Jia Tan直接将一批提交合并到xz仓库中(“CMake: 更新.gitignore以忽略来自源码内构建的CMake产物”)。此时我们知道他们拥有提交权限。有趣的是,在同一批提交中稍后的几个提交中只有一个使用了不同的全名:“Jia Cheong Tan”。
2023年1月11日:Lasse Collin标记并构建了他的最后一个发布版本,v5.4.1。
2023年3月18日:Jia Tan标记并构建了他们的第一个发布版本,v5.4.2。
2023年3月20日:Jia Tan更新了Google oss-fuzz配置,将错误报告发送给他们。
2023年6月22日:Hans Jansen发送了一对补丁,由Lasse Collin合并,这些补丁使用了“GNU间接函数”特性,在启动时选择一个快速的CRC函数。最终的提交由Lasse Collin重新工作并由Jia Tan合并。这个更改很重要,因为它提供了一个钩子,通过该钩子后门代码可以在全局函数表被重新映射为只读之前修改它们。虽然这个变化本身可能是一个无辜的性能优化,但Hans Jansen在2024年返回,推广了被植入后门的xz,而且在互联网上其他地方不存在。
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文件很早以前就说过(在Jia Tan出现之前):“这个目录包含了很多用于测试解码实现中处理.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发行版,该m4文件在构建deb/rpm包时添加了后门。这个m4文件不在源代码仓库中,但在打包过程中也添加了许多其他合法的文件,因此它本身并不引起怀疑。但脚本已经从通常的副本中修改,以添加后门。更多详情请参见我的xz攻击shell脚本演练帖子。
2024年2月24日:Gentoo开始在5.6.0版本中遇到崩溃。这似乎是一个实际的ifunc错误,而不是隐藏后门中的错误,因为这是第一个包含Hans Jansen的ifunc更改的xz版本,而Gentoo没有对sshd进行打补丁以使用libsystemd,所以它没有后门。
2024年2月26日:Debian将xz-utils 5.6.0-0.1添加到不稳定分支。
2024年2月27日:Jia Tan开始给Richard W.M. Jones发邮件,以更新Fedora 40(由Rich Jones私下确认)。
2024年2月28日:Debian将xz-utils 5.6.0-0.2添加到不稳定分支。
2024年2月28日:Jia Tan通过在用于检查landlock支持的C程序中添加一个微妙的打字错误,破坏了configure脚本中的landlock检测。configure脚本尝试构建并运行C程序来检查landlock支持,但由于C程序有语法错误,它将永远不会构建和运行,脚本将始终决定没有landlock支持。Lasse Collin被列为提交者;他可能错过了微妙的打字错误,或者作者可能是伪造的。可能是前者,因为Jia Tan在他的许多其他更改中并没有费心伪造提交者。这个补丁似乎是为了除了sshd更改之外的其他事情做准备,因为landlock支持是xz命令的一部分,而不是liblzma。具体是什么尚不清楚。
2024年2月29日:在GitHub上,@teknoraver发送了停止将liblzma链接到libsystemd的拉取请求。看来这本可以挫败这次攻击。Kevin Beaumont推测,知道这一举措即将到来可能加快了攻击者的进度。@teknoraver在HN上评论说,liblzma的PR是一系列为libsystemd减少依赖的更改中的一个;在1月底提到了两次。
2024年3月4日:RedHat发行版开始在liblzma的_get_cpuid(后门的入口)中看到Valgrind错误。比赛开始了,目标是在Linux发行版深入挖掘之前修复这个问题。
2024年3月5日:libsystemd的PR被合并以移除liblzma。另一场比赛开始了,目的是在发行版完全破坏这种方法之前,让liblzma带上后门。
2024年3月5日:Debian将xz-utils 5.6.0-0.2添加到测试中。
2024年3月5日:Jia Tan提交了两个ifunc错误修复。这些似乎是实际ifunc错误的真正修复。一个提交链接到了Gentoo的错误,并且还错误地打印了一个上游GCC的错误。
2024年3月8日:Jia Tan提交了所谓的Valgrind修复。这是一个误导,但是非常有效。
2024年3月9日:Jia Tan提交了更新的后门文件。这是实际的Valgrind修复,更改了包含攻击代码的两个测试文件。“原始文件是用我机器上的随机本地生成的。为了将来更好地重现这些文件,使用了一个常数种子重新创建这些文件。”
2024年3月9日:Jia Tan标记并构建了v5.6.1版本,并发布了包含新后门的xz 5.6.1发行版。到目前为止,我还没有看到对旧后门和新后门差异的任何分析。
2024年3月20日:Lasse Collin向LKML发送了一个补丁集,用他和Jia Tan的邮件替换了他个人的电子邮件,作为内核中xz压缩代码的维护者。没有迹象表明Lasse Collin在这里有不良行为,只是在清理对他自己作为唯一维护者的引用。当然,Jia Tan可能促成了这一点,能够向Linux内核发送xz补丁对Jia Tan未来的工作来说将是一个不错的杠杆点。我们还没有达到完全信任的水平,但这将更接近一步。
2024年3月25日:Hans Jansen回来了(!),在Debian中提出了一个错误,要求将xz-utils更新到5.6.1。像在2022年的施压活动中一样,更多在互联网上不存在的name###@mailhost地址出现,支持这个更新。
2024年3月27日:Debian更新到5.6.1。
2024年3月28日:Jia Tan在Ubuntu中提出了一个错误,要求从Debian更新xz-utils到5.6.1。

攻击被发现

2024年3月28日:Andres Freund发现了这个错误,私下通知了Debian和distros@openwall。RedHat分配了CVE-2024-3094。
2024年3月28日:Debian回滚到5.6.1,引入5.6.1+really5.4.5-1。
2024年3月28日:Arch Linux将5.6.1改为从Git构建。
2024年3月29日:Andres Freund在公开的oss-security@openwall列表上发布了后门警告,称他在“过去几周内”发现了它。
2024年3月29日:RedHat宣布,在Fedora Rawhide和Fedora Linux 40 beta中分发了带有后门的xz。
2024年3月30日:Debian关闭构建,使用Debian stable重新构建他们的构建机器(以防恶意软件xz逃离他们的沙盒?)。
2024年3月30日:Haiku OS转移到GitHub源代码仓库快照。
 
手机ROOT之后折腾 | 一些资料记录使用Java代码直接调用Jmeter创建测试计划
Loading...