xz漏洞从5.6.0版本开始CVE-2024-3094漏洞分析存在于XZ Utils的5.6.0和5.6.1版本中

周鹏程2024-04-07Security

漏洞描述

xz是用于压缩/解压缩文件的一款压缩库,微软的安全研究员Andres Freund调查程序性能下降时发现了该漏洞,xz漏洞从5.6.0版本开始存在恶意后门,该后门存在于XZ Utils的5.6.0和5.6.1版本中,攻击者可能利用这一漏洞在受影响的系统上绕过SSH的认证获得未授权访问权限,执行任意代码。

openEuler的漏洞响应

  • 2024年3月28日,openEuler初步感知到xz 5.6.0/5.6.1版本存在安全风险。立即发起了对openEuler 2203-LTS,2003-LTS各个发行分支,以及测试中的分支2403-LTS进行全量的软件版本排查,最后确认有缺陷的xz 5.6.0/5.6.1版本没有引入openEuler仓库。
  • 2024年3月29日, openwall 披露了xz CVE-2024-3094的攻击代码和攻击手段。openEuler安全团队实时跟进,组织相关技术人员分析openEuler xz的源码是否存在恶意攻击代码,从源码代码层面确认了CVE-2024-3094漏洞不涉及openEuler xz软件。

漏洞背景

Jia Tan 是本次xz后门漏洞的攻击者,为了实现本次的xz软件的后门注入,JiaT75在xz代码和社会工程学上的设计可谓是处心积虑,印证了有句古话:”不怕贼偷,就怕贼惦记”。本文xz事件的关键节点信息梳理引用自:https://research.swtch.com/xz-timeline

Jia Tan成为xz社区maintainer

2021年10月26日 JiaTan第一次向xz开源社区贡献了代码,并开始活跃于xz的社区,在2021年Jia Tan共提交了546次代码,JiaTan提交表现为一名勤奋、高效的开源社区贡献者,并在此之后不断地对xz压缩库做出代码贡献。 2022年4月到6月 xz初始的维护人 Lasse Collin由于长期的心理健康问题以及其他原因,会定期退网一段时间进行调理。在2022年4月到6月之间,Lasse Collin陆续收到了Jigar Kumar,Dennis Ens等用户的施压邮件,邮件的内容大致是:质疑Lasse Collin是不是是去了对xz的维护兴趣?为什么没有及时合入JiaTan的贡献代码?以及让 Lasse Collin给予Jia Tan具有maintainer提交权限的心理暗示。其中部分内容展示如下:

  • Jugar Kumar:“按照你现在的速度,我非常怀疑今年能看到5.4.0版本的发布。自从四月以来唯一的进展就是对测试代码的一些小改动。你忽视了邮件列表中腐败中的许多补丁。现在你在扼杀你的存储库。为什么要等到5.4.0版本才换维护人?为什么要延迟你的存储库所需要的改变?”
  • Dennis Ens:“我对你的心理健康问题感到遗憾,但是认识到自己的限制是非常重要的。我知道对于所有的参与者来说,这只是一个业余项目,但是社区需要更多。为什么不将C语言的XZ的维护权转交给其他人,这样你就可以更多地关注Java的XZ了呢?或者把Java的XZ的维护权转交给其他人,以便你可以专注于C语言的XZ?试图同时维护两者意味着两者都不能被很好地维护。”

2022-06-29 Lasse Collin回复到:“正如我在之前的邮件中暗示的,Jia Tan 可能会在未来在项目中扮演更大的角色。他已经在邮件列表之外大力帮助过我,现在实际上已经是一名共同维护者了。我知道在git存储库中还没有发生太大的事情,但是事情是在慢慢发生的。无论如何,维护权的一些变动已经在进行中,至少对于XZ Utils是这样。“

基于Jia Tan在xz社区的贡献表现,社区用户Jigar Kumar和Dennis Ens等用户的邮件施压,还有Lasse Collin自身的身体健康原因,最终Lasse Collin给予了 Jia Tan在xz社区的 maintainer席位。事后Evan Boehs观察到,Jigar Kumar和Dennis Ens都未在互联网上的其他地方出现过,在Jia Tan成为社区maintainer后,Jigar Kumar和Dennis Ens也未在xz社区中使用邮件来沟通过任何其它问题,看起来它们很可能是为了促使Lasse赋予 Jia Tan 获得更多控制权而创建的伪造身份。这种策略起作用了。

Jia Tan攻击开始

2024-02-23: Jia Tan 将隐藏的后门二进制代码巧妙地隐藏在一些二进制测试输入文件中。README文件(从 Jia Tan 出现之前很久就已经存在)中已经提到,“这个目录包含了许多文件,用于测试解码器实现中对.xz、.lzma ,以及.lz 文件的处理。许多文件是手工使用十六进制编辑器创建的,因此没有比文件本身更好的‘源代码’。” 对于这种压缩软件的库来说,拥有这类被压缩的二进制测试文件是非常常见的。Jia Tan 利用这一点添加了一些不会被仔细审查的文件。 2024-02-24: Jia Tan 标记并构建了v5.6.0版本,并发布了包含额外恶意build-to-host.m4的xz-5.6.0.tar.gz发行版,该m4文件在构建deb/rpm包时添加了后门。这个m4文件在源代码仓库中不存在,但是在打包过程中还添加了许多其他合法的文件,所以它本身并不引起怀疑。但是这个脚本已经从通常的副本中被修改以添加后门。 2024-03-09: Jia Tan 标记并构建了v5.6.1版本,并发布了包含新后门的xz 5.6.1发行版。 2024-03-25: 很多用户在Debian社区中提出建议,要求xz-utils更新到5.6.1。就像在2022年Jia Tan成为xz社区maintainer之前的邮件压力活动中一样,出现了更多在之前互联网上不存在的邮件地址来倡导更新xz 5.6.1版本。 2024-03-28: Jia Tan 在Ubuntu中提出了一个bug,要求从Debian更新xz-utils到5.6.1。

攻击被检测到

2024-03-28: 微软的安全研究员Andres Freund调查程序性能下降时发现了该漏洞,私下通知了Debian和distros@openwall。 随后RedHat 分配了CVE-2024-3094。 2024-03-29 :CVE-2024-3094公开披露,CSSV漏洞评分10分,是一个满分漏洞,是第一起严重的、针对广泛使用的开源软件的供应链攻击。它标志着开源供应链安全的一个分水岭时刻。在此以后开源社区贡献者的真实身份验证以及二进制测试文件的审核可能会变得更为严苛,各大开源社区和操作系统发行商也会受到该事件的推动,进一步完善关于软件安全的运作规则。

漏洞代码触发分析

上游社区5.6.0/5.6.1 release的xz源码tar包包含build-to-host.m4恶意构建文件,该构建文件调用脚本解压恶意测试数据tests/files/bad-3-corrupt_lzma2.xz 、tests/files/good-large_compressed.lzma来修改构建过程以构建出留有后门的动态库liblzma.so。由于SSH底层依赖了liblzma库,攻击者可能利用这一漏洞在受影响的系统上绕过SSH的认证获得未授权访问权限,执行任意代码。更多代码技术细节信息,请参见:xz攻击脚本演练帖子

影响性分析

如果机器上装有涉及CVE-2024-3094缺陷的xz软件,远程攻击者能够通过SSH发送任意代码,造成远端任意代码执行,进而有效控制受害者的整台机器。

规避措施

解决方案

卸载/弃用xz 5.6.0/5.6.1缺陷版本,使用openEuler社区发行的xz稳定版本xz 5.2.5,或者其他社区的稳定版本。

本文参考链接

https://www.openwall.com/lists/oss-security/2024/03/29/4

https://gist.github.com/thesamesam/223949d5a074ebc3dce9ee78baad9e27

https://boehs.org/node/everything-i-know-about-the-xz-backdoor

https://tukaani.org/xz-backdoor/

https://research.swtch.com/xz-timeline

https://research.swtch.com/xz-script


【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。

【Windows迁移】之SQL Server迁移至openEuler

img

futao2023-12-21openEulerWindows迁移

概述

近些年,数量庞大的企业和个人放弃Windows平台选择Linux平台,并且这个数字呈现扩大的趋势。很长的一段时间,Linux是网络服务器的领导者,具有更强的稳定性、可靠性、成本和安全性等,能够在苛刻的工作负载中实现高可用性和高性能,已经更好的用户体验和丰富的工具集,这也是人们选择Linux的重要原因。

2016年,微软重新构建了SQL Server,致力于将大部分依赖特定操作系统的功能划分,以支持更多的平台。该项目帮助更多想要将Windows平台应用服务迁移至Linux平台的用户。本文介绍如何将SQL Server 2019迁到至openEuler,以帮助用户完成Windows平台数据迁移。

在openEuler上安装SQL Server并创建数据库

准备工作

本部分参考https://www.cnblogs.com/linuxjava/p/17456089.html

安装Python2

安装SQL Server 2019需要Python2依赖,而默认yum源中并没有提供Python2,因此需要手动下载和安装。

  1. 使用wget获取Python包:
wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
  1. 安装Python2需要的一些基本库:
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
  1. 如果没有安装tar,请先安装tar:
sudo yum install tar -y
  1. 解压和安装Python2:
# 使用tar命令解压
tar xzf Python-2.7.9.tgz
# 进入解压后的目录中
cd Python-2.7.9
# 生成MakeFile文件
sudo ./configure --prefix=/usr/local
# 安装
sudo make altinstall
  1. 将安装在/usr/local/bin/目录下的Python软链接到/usr/bin/目录下:
sudo ln -s /usr/local/bin/python2.7 /usr/bin/python
sudo ln -s /usr/local/bin/python2.7 /usr/bin/python2

建立so文件软链接

系统中没有liblber-2.4.so.2libldap-2.4.so.2这两个文件,但有liblber.so.2libldap.so.2(即文件名中不含有版本号),可以建立软链接完成替代:

sudo ln -s /usr/lib64/liblber.so.2 /usr/lib64/liblber-2.4.so.2
sudo ln -s /usr/lib64/liblber.so.2 /usr/lib/liblber-2.4.so.2
sudo ln -s /usr/lib64/libldap.so.2 /usr/lib/libldap-2.4.so.2
sudo ln -s /usr/lib64/libldap.so.2 /usr/lib64/libldap-2.4.so.2

安装SQL Server

本部分参考https://learn.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-ver15&tabs=rhel8

安装SQL Server服务

  1. 由于openEuler本身并没有SQL Server源,并且与Red Hat有一定相似性,故而采用Red Hat的存储库作为下载源。下载SQL Server 2019 (15.x) Red Hat存储库配置文件:
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo
  1. 安装SQL Server:
sudo yum install -y mssql-server
  1. 运行mssql-conf setup,按照提示设置 SA 密码并选择版本。选择版本时,Evaluation、Developer和Express版是免费的
sudo /opt/mssql/bin/mssql-conf setup

根据提示完成设置即可。 4. 完成配置后,验证服务是否正在运行:

systemctl status mssql-server
  1. 在防火墙上打开SQL Server端口。默认的SQL Server端口为TCP 1433:
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload

如果使用的防火墙不是FirewallD,则需要使用其对应的命令。

禁用sa账户

根据官方文档中的建议,在安装后应当禁用sa账户以确保安全性,但本教程中后续将使用sa账户,故而跳过本步骤,在实际使用时可根据安全性需要选择是否禁用sa账户。

步骤参考:https://learn.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-ver15&tabs=rhel8#disable-the-sa-account-as-a-best-practice

安装SQL Server命令行工具

  1. 本步骤需要再次使用Red Hat存储库作为下载源。下载Microsoft Red Hat存储库配置文件:
curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/mssql-release.repo
  1. 如果安装了早期版本的mssql-tools,请删除所有旧的unixODBC包。
sudo yum remove mssql-tools unixODBC-utf16 unixODBC-utf16-devel
  1. 使用unixODBC开发人员包安装mssql-tools18:
sudo yum install -y mssql-tools18 unixODBC-devel
  1. 将 mssql-tools 更新至最新版本:
sudo yum check-update
sudo yum update mssql-tools18
  1. 向bash shell中的PATH环境变量添加/opt/mssql-tools18/bin/: 若要使sqlcmd和bcp能从登录会话的bash shell进行访问,请使用下列命令修改~/.bash_profile文件中的PATH
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile

若要使sqlcmd和bcp能从交互式/非登录会话的bash shell进行访问,请使用下列命令修改~/.bashrc文件中的PATH

echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc

连接数据库

使用SQL Server名称(-S)、用户名(-U)和密码(-P)的相应参数运行sqlcmd:

sqlcmd -S localhost -U sa -P '<YourPassword>'

上述命令中,连接方式是本地连接,服务器名称是localhost,用户名是sa,密码是安装时指定的sa密码。

如果不想显式输入密码,可以省略-P选项以及对应参数,执行命令后将被要求输入密码。

如果在登录时出现SSL证书认证失败错误,可以通过添加-C选项解决。

当出现了sqlcmd的命令提示符1>时,说明连接成功。

例如,下面是一个成功的交互案例:

[spy@localhost ~]$ sqlcmd -S 192.168.137.223 -U sa -C
Password: #此时输入密码,密码不显示
1> #此时已经登录成功,可以输入SQL语句了

上面的案例中,192.168.137.223是本机IP,也可以替换成远程IP,根据实际情况更改。

若要退出sqlcmd,输入exit或quit即可。

将SQL Server数据迁移至openEuler

本部分参考https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-migrate-restore-database?view=sql-server-ver15

请将下面出现的所有YourDB替换为实际数据库名称。

备份数据

在参考的微软官方文档中,主要使用了SQL Server Management Studio (SSMS)并通过图形化交互的方式完成备份文件的创建。由于数据库管理系统的多样性,该方法在使用了其他数据库管理系统或不使用图形化管理系统时难以使用,因此此处不做介绍,如果希望使用该方法,请参阅https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-migrate-restore-database?view=sql-server-ver15#create-a-backup-on-windows

此处推荐使用操作较为简单、适用性较广的使用SQL语句的方法:

BACKUP DATABASE [YourDB] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak'
WITH NOFORMAT, NOINIT, NAME = N'YourDB-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

如果遇到用户权限问题,可以用以下方法解决:

打开Windows服务(按Win+R后输入services.msc或使用其他方法打开),找到对应的数据库实例服务(例如SQL Server (MSSQLSERVER)),右键打开属性,选中登录选项卡,将登录身份改为本地系统账户或为指定账户赋予需要的权限。

生成备份文件后,使用scp等方法将该文件传输到openEuler上。

迁移数据

  1. 进入超级用户模式:
sudo su
  1. 创建新的备份目录:
mkdir -p /var/opt/mssql/backup
  1. 将备份文件移动到该目录:(假设备份文件就在当前目录下,实际使用时更改文件路径或先cd到正确的目录下)
mv YourDB.bak /var/opt/mssql/backup/

移动备份文件的目的是:/var/opt/mssql的子目录属于用户mssql和组mssql。 4. 退出超级用户模式:

exit
  1. 启动sqlcmd:
sqlcmd -S 192.168.137.223 -U sa -C
  1. 登录sqlcmd后,输入下面的SQL语句:
RESTORE DATABASE YourDB
FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
GO

sqlcmd中不可以同时复制和粘贴多行命令。

如果执行成功,应当收到已成功还原数据库的消息。

如果遇到类似下述错误:

File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf'. Use WITH MOVE to identify a valid location for the file.
Msg 5133, Level 16, State 1, Server servername, Line 1
Directory lookup for the file "Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf" failed with the operating system error 2(The system cannot find the file specified.).

在这种情况下,数据库包含辅助文件。 如果未在RESTORE DATABASEMOVE子句中指定这些文件,则还原过程将尝试在与原始服务器相同的路径中创建这些文件。

可以列出备份中包含的所有文件:

RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
GO

应会看到如下所示的列表(仅列出前两列):

LogicalName         PhysicalName                                                                 ..............
----------------------------------------------------------------------------------------------------------------------
YourDB              Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB.mdf          ..............
YourDB_Product      Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf  ..............
YourDB_Customer     Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Customer.ndf ..............
YourDB_log          Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Log.ldf      ..............

可使用此列表为其他文件创建MOVE子句。在本示例中,RESTORE DATABASE为:

RESTORE DATABASE YourDB
FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
MOVE 'YourDB_Product' TO '/var/opt/mssql/data/YourDB_Product.ndf',
MOVE 'YourDB_Customer' TO '/var/opt/mssql/data/YourDB_Customer.ndf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
GO
  1. 列举所有数据库来验证是否还原成功:
SELECT Name FROM sys.Databases
GO
  1. 数据迁移成功 img

文中所述SQL Server迁移方案,由 Porting Platform WinApp SIG 参与。如果您对Windows迁移的相关技术感兴趣,欢迎您的围观和加入。您可以添加小助手微信,加入对应 SIG 微信群。

img


【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。