XZ-Utils后门事件过程及启示

2024-04-19 01:28

本文主要是介绍XZ-Utils后门事件过程及启示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Part.01

背景

XZ-Utils(曾经叫做LZMA Utils)是一款开源的无损压缩命令行工具,是用C语言编写的跨平台工具,可以用于类Unix系统和Windows系统。在多数情况下,xz的压缩率要好过gzip和bzip2,解压速度也快过bzip2,尽管压缩速度要慢于gzip。这款工具目前是大多数Linux发行版本的默认工具之一。

XZ-Utils包含两个主要的组件,一个是用于压缩和解压的命令行工具xz(类似gzip),一个是API软件库liblzma(类似zlib)。使用方法也和gzip类似,只能针对单个文件进行压缩和解压,比如:

xz archive.tar

unxz archive.tar.xz

2024年3月29日,一名微软的PostgresSQL工程师Andres Freund在X上发出警告,称在做postgres的基准测试时发现sshd进程的CPU占用率异常的高,而其中的CPU时间大多都分配给了liblzma。之后,Freund向Openwall项目的开源安全邮件列表报告了他的发现,并引起多家软件厂商的注意,最终被确认是XZ的5.6.0和5.6.1版本中存在SSH后门。

图片

这个SSH后门允许远程攻击者绕过系统的身份验证获得系统管理员的同等级别权限,因此,该后门分配的CVE编号CVE-2024-3094的CVSS评分达到了10分。

图片

但是该后门也有一些利用条件,比如:受影响的服务器需要暴露SSH服务到公网,SSH服务需要以Systemd的守护进程运行。

Part.02

事件过程

2021年

一个叫Jia Tan的用户在GitHub创建自己的账户JiaT75。

图片

11月16日,Jia Tan在libarchive项目中提交了自己的第一个PR(Pull Request),标题是Added error text to warning when untaring with bsdtar.(使用bsdtar解包时增加错误文本警告)

但实际PR的内容却比该标题声明的多,比如将safe_fprint替换为不安全的变量。而该项目的维护者直到XZ后门事件曝光后才迟迟拒绝了这次的PR。

2022年

3月10日,Jia Tan首次出现在了XZ项目的邮件列表中,称自己发现了一个bug,并在自己fork的项目中做了相关的测试代码,即没有提交PR,而是通过邮件列表积极参与项目沟通。

图片

4月19日,Jia Tan通过邮件列表补充提交了一个补丁,这个补丁的提交得到另一个邮件列表成员Jigar Kumar(非项目维护人员)在精神上的支持,因为XZ项目开发和维护进度太慢了,而Jia Tan表现的相当积极。

图片

5月19日,邮件列表成员Dennis Ens(非项目维护人员)在邮件列表中吐槽项目开发进度太慢,这封邮件得到Jigar Kumar的附和,希望向原维护者Lasse Collin施压增加一名项目维护者。

图片

这次施压有了一定的效果,原维护者Lasse Collin在回复中称联合维护者者需要有技术、时间和足够的耐心投入XZ项目,而他在早前的邮件列表历史中发现Jia Tan或许可以担当重任。

图片

2023年

1月7日,Jia Tan终于迎来了他提交的PR的第一次合并,这意味着他已经得到了XZ项目的信任。

3月20日,在Google的oss-fuzz项目(该项目是为开源项目做模糊测试,因Heartbleed漏洞的出现而于2016年发起)中,Jia Tan将XZ项目的主要联系人更换为了自己的邮箱。

图片

6月27日,Jia Tan提交了由Hanz Jansen编写的漏洞利用测试框架。

图片

2024年

2月11日,Jia Tan在oss-fuzz项目中将项目主页地址做了修改,说明Jia Tan已经彻底接管了XZ项目。

图片

2月23日和3月9日,Jia Tan分别提交了Tests:Add a few test files和Tests:Update two test files两个commit,这两个commit也是XZ项目后门出现的两次提交。

图片

图片

3月25日,Hans Jansen、misoeater91、krygorin4545等用户开始推动在Debian等Linux发行版中加入后门版本XZ-Utils,Jia Tan也试图推动在Ubuntu的beta版本冻结前加入后门版本XZ-Utils,但没有成功。

图片

图片

3月29日,Andres Freund向开源项目安全邮件列表(https://www.openwall.com/lists/oss-security/2024/03/29/4)提醒XZ-Utils后门的发现。

图片

Part.03

事件启示

如果不是微软的工程师Andres Freund这次意外的发现,XZ-Utils后门可能会在未来的很长一段事件里造成巨大的危害和影响。
 

由此事件可以看出,针对供应链的安全攻击已经衍生到了社区舆论和心理战范畴,虽然事件的主要角色是Jia Tan,但在事件一步一步演进的过程中可以看到疑似Jia Tan所在团队的其他成员的身影,包括Hans Jansen、misoeater91、krygorin4545等。

以往单一的通过PR植入后门或者通过制造恶意软件的第三方库或软件包,在XZ后门事件中已经变为针对开源项目维护者和社区的攻击。

对于开源项目而言,Jia Tan让各个项目的维护者更加清醒的认识到项目参与者对于项目安全的影响,以及对于每一位贡献者和贡献代码进行慎重审核的必要性。正如Linus定律所说:

With enough eyes,all bugs are shallow.(足够多的关注能让所有问题浮现)

Linus定律

好在Andres Freund发出警告的当天,XZ项目原维护者Lasse Collin立即更新了XZ项目补丁,各个软件供应商(包括oss-fuzz项目)分别做出了响应。

此外,后门版本的XZ-Utils也只影响到了各个Linux发行版本的unstable版本,而未影响stable版本,这也说明在生产环境中使用稳定版本的重要性。

类似事件的还包括Heartbleed漏洞、Log4j漏洞,它们的共性都在于项目维护者的精力不足,维护者需要如XZ原维护者Lasse Collin在邮件中所说:

Someone would need to have the skills, time, and enough long-term interest specifically for this.(一个有技术、有时间和有足够兴趣致力于此的人)

Lasse Collin

如果开源项目的维护仅局限在少数人的兴趣,那么基于此的各个基础系统会长期处于下图的状态。

图片

作者:repoog

2024年4月18日    

洞源实验室 

这篇关于XZ-Utils后门事件过程及启示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916292

相关文章

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Conda国内镜像源及配置过程

《Conda国内镜像源及配置过程》文章介绍Conda镜像源使用方法,涵盖临时指定单个/多个源、永久配置及恢复默认设置,同时说明main(官方稳定)、free(逐渐弃用)、conda-forge(社区更... 目录一、Conda国内镜像源二、Conda临时使用镜像源指定单个源临时指定多个源创建环境时临时指定源