国产化替代:观察漏洞修补的及时性以供应链关系选择操作系统

作者:Sender Su  来源:本站原创  发布日期:2024-07-26  最后修改日期:2024-07-26

其实笔者本来是想技术性地分析一下 CVE-2024-29510 Ghostscript 漏洞的影响。因为之前已经写过一篇选择发行版的方式:

国产化替代:资源有限的甲方如何选择操作系统?

但开始分析后,就发现自己在这篇文章中默认了一件事:

发行版的厂商会及时修补漏洞。但实际并不一定。

所以,通过观察厂商对漏洞修补的态度和及时性,明晰厂商的供应链关系,也是在国产化替代过程中选择合适自己的操作系统的一种方法。

article banner

笔者:国际认证信息系统审计师、软考系统分析师、软件工程硕士

了解 GhostScript 及 CVE-2024-29510

先说说 Ghostscript CVE-2024-29510 这个漏洞的基本情况[1]。

该漏洞危险等级评分是 5.5/10,也就是中等程度。但随着对该漏洞的远程代码执行 POC 的发布,鉴于 Ghostscript 被使用的广泛程度,安全社区普遍认为其危险等级被严重低估。

Ghostscript 一定程度上属于 Linux 发行版中“默默无闻”的组件之一。但这个组件的重要性对于无论是桌面应用或是 WEB 服务都很高。

ghostscript logo

因为它承担了 Postscript (.ps 文件)和 PDF 文件的解析器的作用,很多应用程序或者WEB服务依赖于调用它来实现对 PDF 和 Postscript 文件的查看、转换和打印等操作。

CVE-2024-29510 是一个 RCE 远程代码执行漏洞,Ghostscript 团队在今年 3 月收到了漏洞报告,4 月就释出补丁缓解了该漏洞的影响。

但随着补丁释出,Ghostscript 的版本号来到了 10.03.1。这就引出了另一个技术性话题:

发行版的向后移植(backport)操作

在软件供应链上,Linux 操作系统发行版作为开源社区的下游,需要保持发行版的稳定性和兼容性,以便自己的下游,也就是建筑在操作系统之上的其它基础软件、应用程序能具备稳定性和兼容性。

所以比如 Red Hat Enterprise Linux 8,其纳入的 Ghostscript 版本是9.27;又如 RHEL 9,Ghostscript 版本是 9.54。

在整个大版本的生命周期内,发行版的这些组件的版本一般都是不会变化的,这样就保证了基于发行版开发建设的应用软件有稳定的运行环境。

那么这些组件出现漏洞怎么办?

答案就是把开源社区对组件当前版本(不是发行版的版本)漏洞的修正补丁转移到旧的版本上。这就是向后移植(backport)[2]。

向后移植是个麻烦活

这个过程由发行版的开发商实现,比如 Red Hat。所以 Linux 一级(姑且这样定义)发行版并不是简单地把源代码打个包就能卖的,是需要付出实际劳动的。

也就是,Red Hat 需要在其发布的发行版的生命周期内,把发行版组件比如 GhostScript,在此期间发现的 BUG 的代码修正比对发行版引入的老版本的代码,判断是否老版本也存在 BUG,然后再研究应如何调整代码修正补丁,使老版本的 BUG 也被同步修正。

每一个 CVE 漏洞,发行商都会进行如上的流程。但由于向前移植的过程确实需要耗费时间和人力,尤其是发行版的生命周期越长,厂商向后移植漏洞补丁所要耗费的资源就越高。

所以就不是每一个 CVE 漏洞都会被厂商即时修正。对于一些被认为不那么重要的漏洞,会被排期。

观察 Red Hat 对此漏洞的修补情况

从Red Hat 的漏洞说明页面[3],概括如下:

1)RHEL 6 和 RHEL 7 受影响,但已经超出支持期限,不会修补。RHEL 8 的 GhostScript 是 9.27 版本,小于 9.30 不受影响。

2)RHEL 8 的 gimp:flatpak/ghostscript 受影响但不予修补,因为 Flatpak 的性质是频繁变化的,超出发行版本身修补范围。

3)RHEL 9 的 GhostScript 受影响,但:

尚未修正。什么时候安排修正没有给出更多的信息。

那么是否确实未修补?这可以通过观察当前版本的源代码包是否包含了对应的补丁。

对于 RHEL 9,该源代码包名为是:

ghostscript-9.54.0-16.el9_4.src.rpm

源码包需要订阅才能获得。由于 CentOS 已经变更为 RHEL 的上游 CentOS Stream[4],所以需要从比如 Rocky Linux 这种新的下游的镜像仓库获取到这个源代码包[5],然后解包观察:

[root@RL9 ~]# dnf list ghostscript
上次元数据过期检查:0:09:49 前,执行于 2024年07月26日 星期五 12时45分22秒。
可安装的软件包
ghostscript.x86_64        9.54.0-16.el9_4        appstream
[root@RL9 ~]# dnf download --source ghostscript
[root@RL9 ~]# rpm -ivh ghostscript-9.54.0-16.el9_4.src.rpm
[root@RL9 ~]# ll rpmbuild/SOURCES
总用量 54748
-rw-r--r--. 1 root root     3782  6月 20 17:19 ghostscript-9.54.0-covscan-fixes.patch
-rw-r--r--. 1 root root     1558  6月 20 17:19 ghostscript-9.54.0-CVE-2023-28879.patch
-rw-r--r--. 1 root root     5345  6月 20 17:19 ghostscript-9.54.0-CVE-2023-36664.patch
-rw-r--r--. 1 root root      845  6月 20 17:19 ghostscript-9.54.0-CVE-2023-38559.patch
-rw-r--r--. 1 root root      746  6月 20 17:19 ghostscript-9.54.0-CVE-2023-43115.patch
-rw-r--r--. 1 root root     3214  6月 20 17:19 ghostscript-9.54.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch
-rw-r--r--. 1 root root      807  6月 20 17:19 ghostscript-9.54.0-ESC-Page-driver-does-not-set-page-size-correctly.patch
-rw-r--r--. 1 root root     2638  6月 20 17:19 ghostscript-9.54.0-Fix-op-stack-management-in-sampled_data_c.patch
-rw-r--r--. 1 root root     2089  6月 20 17:19 ghostscript-9.54.0-gdevtxtw-null-also-pointers.patch
-rw-r--r--. 1 root root     7566  6月 20 17:19 ghostscript-9.54.0-include-pipe-handle-in-validation.patch
-rw-r--r--. 1 root root     3938  6月 20 17:19 ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch
-rw-r--r--. 1 root root 56001768  6月 20 17:19 ghostscript-9.54.0.tar.xz
-rw-r--r--. 1 root root     2385  6月 20 17:19 gs-cve-2024-33871.patch

可以发现,其中并没有包含这个漏洞的补丁。

因此,Rocky Linux 等下游发行版也并未补上这个漏洞。

这不就攻防演练期间留了个尾巴?

既然 Red Hat 有自己的考虑和安排,那么笔者转而看看国产发行版的情况如何。

1、龙蜥 OpenAnolis 8

OpenAnolis 8 是一系列下游商业发行版(也就是甲方在实施国产化替代时能获得有效证明的发行版)的上游,所以如果 OpenAnolis 8 有补丁,那么这些下游商业发行版就必然会有漏洞补丁。

按 OpenAnolis 8 的生命周期选择在维护期内的版本。下图1 OpenAnolis 小版本生命周期,源自官方发布的 Anolis OS 生命周期及更新策略[6]:

OpenAnolis 8 LifeCycle

图1 OpenAnolis 小版本生命周期

按图1,笔者观察的是在维护期内的 8.9 GA 版本。

在已经安装好的 OpenAnolis 8.9 GA 上先观察 GhostScript 的版本:

[root@ANOLIS8 ~]# dnf list ghostscript
上次元数据过期检查:21:46:40 前,执行于 2024年07月25日 星期四 15时22分11秒。
已安装的软件包
ghostscript.x86_64                9.54.0-17.an8                 @AppStream
可安装的软件包
ghostscript.src                   9.54.0-17.an8                 AppStream-source
[root@ANOLIS8 ~]#

可以看到 GhostScript 的版本是 9.54,也就是和 RHEL 9 同一个版本,而不是 RHEL 8 的 9.27 版本。

然后直接下载 GhostScript 9.54.0-17.an8 的源码包,解包安装观察,发现其中包含了名称带有 CVE-2024-29510 的漏洞补丁:

[root@ANOLIS8 ~]# ll rpmbuild/SOURCES/
总用量 54752
-rw-r--r--. 1 root root     3782 7月  16 20:54 ghostscript-9.54.0-covscan-fixes.patch
-rw-r--r--. 1 root root     1558 7月  16 20:54 ghostscript-9.54.0-CVE-2023-28879.patch
-rw-r--r--. 1 root root     5345 7月  16 20:54 ghostscript-9.54.0-CVE-2023-36664.patch
-rw-r--r--. 1 root root      845 7月  16 20:54 ghostscript-9.54.0-CVE-2023-38559.patch
-rw-r--r--. 1 root root      746 7月  16 20:54 ghostscript-9.54.0-CVE-2023-43115.patch
-rw-r--r--. 1 root root     3005 7月  16 20:54 ghostscript-9.54.0-CVE-2024-29510.patch
-rw-r--r--. 1 root root     3214 7月  16 20:54 ghostscript-9.54.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch
-rw-r--r--. 1 root root      807 7月  16 20:54 ghostscript-9.54.0-ESC-Page-driver-does-not-set-page-size-correctly.patch
-rw-r--r--. 1 root root     2638 7月  16 20:54 ghostscript-9.54.0-Fix-op-stack-management-in-sampled_data_c.patch
-rw-r--r--. 1 root root     2089 7月  16 20:54 ghostscript-9.54.0-gdevtxtw-null-also-pointers.patch
-rw-r--r--. 1 root root     7566 7月  16 20:54 ghostscript-9.54.0-include-pipe-handle-in-validation.patch
-rw-r--r--. 1 root root     3938 7月  16 20:54 ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch
-rw-r--r--. 1 root root 56001768 10月  6 2023 ghostscript-9.54.0.tar.xz
-rw-r--r--. 1 root root     2385 7月  16 20:54 gs-cve-2024-33871.patch

查看 ghostscript-9.54.0-CVE-2024-29510.patch 补丁文件头,有如下说明:

From 8584d98dab950f70017ec4466c525434a30ad126 Mon Sep 17 00:00:00 2001
From: Ken Sharp 
Date: Thu, 21 Mar 2024 09:01:15 +0000
Subject: [PATCH] Uniprint device - prevent string configuration changes when
 SAFER

Bug #707662

We cannot sanitise the string arguments used by the Uniprint device
because they can potentially include anything.

This commit ensures that these strings are locked and cannot be
changed by PostScript once SAFER is activated. Full configuration from
the command line is still possible (see the *.upp files in lib).

This addresses CVE-2024-29510
---

补丁来源是直接来自 GhostScript 的开发商 Artifex,所以可见这个漏洞的向后移植是最简单直接的,不需要发行版厂商对补丁进行再修改才能向后移植到历史版本上。

不熟悉以上操作的读者也可以从镜像站点获取源代码包 src.rpm[7],用压缩软件比如 7-zip 即可解包观察。

从以上情况,可以确认:

OpenAnolis 8 已经在早期源自 RHEL 8/CentOS 8 的基础上实现开展了自主的漏洞修补维护。

也就是在软件供应链关系上,OpenAnolis 8 已经开始脱离最早期的下游环节,上升到成为直接对接开源社区的上游环节。

2、欧拉 OpenEuler

要对 OpenEuler 进行观察,首先要选对版本,原因是 OpenEuler 的版本规划及生命周期定义比较复杂[8],见下图2 OpenEuler LTS 版本生命周期(局部,原图太大,有裁剪):

openEuler LTS LifeCycle

图2 OpenEuler LTS 版本生命周期(局部)

从图2可以看到,就以 22.03 LTS 为例,从全版本到SP4 共6个细分版本,以扩展支持计算的生命周期长度各有不同,个别比如 22.03 LTS SP2 还特别短。

这犬牙交错的截止时间......笔者作为用了二十多年 Linux 的人都觉得困惑,对新手就可想而知了。

鉴于现在是2024年7月,所以笔者选择的是 24.03 LTS 和 22.03 LTS SP4 这两个版本,均在维护期内。

本来还想测试一下社区创新版,测试发现创新版 23.09 安装后完全刷不出有补丁,而创新版 24.03 尚未见踪影,估计是不会出了。

过程不啰嗦了,经观察可以发现 OpenEuler 这两个 LTS 版本的 GhostScript 是不同的版本:

22.03 LTS SP4 是 9.55.0-9.oe2203sp4

24.03 LTS 是 9.56.1-5.oe2403

下载源码包观察具体补丁情况,首先是 22.03 LTS SP4:

[root@OE2203SP4 ~]# ll rpmbuild/SOURCES/
总用量 65892
-rw-r--r--. 1 root root      804  6月 23 02:15 backport-Bug-704405-Fix-typo-in-non-forked-lcms2-code.patch
-rw-r--r--. 1 root root     1417  6月 23 02:15 backport-CVE-2022-2085.patch
-rw-r--r--. 1 root root     2407  6月 23 02:15 backport-CVE-2023-43115-Bug707051-IJS-device-try-and-secure-the-IJS-server-startup.patch
-rw-r--r--. 1 root root     1629  6月 23 02:15 backport-CVE-2023-46751.patch
-rw-r--r--. 1 root root     1774  6月 23 02:15 CVE-2023-28879.patch
-rw-r--r--. 1 root root     5344  6月 23 02:15 CVE-2023-36664.patch
-rw-r--r--. 1 root root      855  6月 23 02:15 CVE-2023-38559.patch
-rw-r--r--. 1 root root     1099  6月 23 02:15 fix-cve-2023-52722.patch
-rw-r--r--. 1 root root     3004  6月 23 02:15 fix-CVE-2024-29510.patch
-rw-r--r--. 1 root root     1202  6月 23 02:15 fix-CVE-2024-33869.patch
-rw-r--r--. 1 root root     3308  6月 23 02:15 fix-CVE-2024-33870.patch
-rw-r--r--. 1 root root      891  6月 23 02:15 ghostscript-9.23-100-run-dvipdf-securely.patch
-rw-r--r--. 1 root root 67417724  6月 23 02:15 ghostscript-9.55.0.tar.xz

然后是 24.03 LTS:

[root@OE2403 ~]# ll rpmbuild/SOURCES/
总计 61168
-rw-rw-r--. 1 root root     1629  5月19日 19:33 backport-CVE-2023-46751.patch
-rw-rw-r--. 1 root root      651  5月19日 19:33 CVE-2023-28879.patch
-rw-rw-r--. 1 root root     4360  5月19日 19:33 CVE-2023-36664.patch
-rw-rw-r--. 1 root root      411  5月19日 19:33 CVE-2023-38559.patch
-rw-rw-r--. 1 root root     1116  5月19日 19:33 fix-cve-2023-52722.patch
-rw-rw-r--. 1 root root     3004  5月19日 19:33 fix-CVE-2024-29510.patch
-rw-rw-r--. 1 root root     1202  5月19日 19:33 fix-CVE-2024-33869.patch
-rw-rw-r--. 1 root root     3308  5月19日 19:33 fix-CVE-2024-33870.patch
-rw-rw-r--. 1 root root     1427  5月19日 19:33 fix-CVE-2024-33871.patch
-rw-rw-r--. 1 root root      891  5月19日 19:33 ghostscript-9.23-100-run-dvipdf-securely.patch
-rw-rw-r--. 1 root root 62589232  5月19日 19:33 ghostscript-9.56.1.tar.xz

发现两者都包含了:

fix-cve-2024-29510.patch

补丁的内容都是一样的,区别只是两者的文件名大小写有点不同(CVE一个小写一个大写),可能还是不同的人负责的向后移植呢。

观察到此为止。也就是说,OpenEuler 也在发行版的生命周期内及时自主地对漏洞进行了修补。

时间关系,其它国产发行版笔者没有观察,也没有具体比较哪个发行版最快释出补丁更新。读者可以参考笔者这个套路自主开展观察。

总要有结论

按如上观察结果,笔者认为:

1、软件供应链安全管理角度看,环节越少风险自然就越少。国产化替代的 Linux 发行版能直接对接开源社区而不是对接到上游的发行版开发商,充分凸显了自主性。

2、由于自主性提高,有效维护期内的国产化替代的发行版在(起码是 CVE-2024-29510)漏洞修补上的速度比老牌发行版要迅速,安全性也随着得到提高。

3、负面作用也随之而来。原本的上游发行版开发商自称是基于大量的测试进行支撑实现了发行版大版本有很长的生命周期[9]。

但国产化替代的发行版自行对接开源社区,就不能直接继承原来上游发行版的生命周期了,导致生命周期普遍缩短。

其实,在发行版生命周期更替上,简单、清晰且周期时间长的,无疑对最终用户是一种解脱,对发行版厂商也是一种竞争优势。

4、国产化发行版的文档跟不上发行版释出节奏。例如 OpenAnolis 的文档只更新到 8.6 QU1。

最后提醒

GhostScript CVE-2024-29510 确实很容易被利用[9],包括 Windows 环境比如 LibreOffice Windows 版本的用户。要尽快处置。

参考引用

[1] CVE - CVE-2024-29510

https://cve.mitre.org/cgi-bin/cvename.cgi?name=2024-29510

[2] RHEL: Behind the scenes of a simple backport

https://www.redhat.com/zh/blog/rhel-behind-scenes-simple-backport

[2] CVE-2024-29510 - Red Hat Customer Portal

https://access.redhat.com/security/cve/CVE-2024-29510

[3] FAQ: CentOS Stream Updates

https://www.redhat.com/en/blog/faq-centos-stream-updates

[4] 吉林大学开源镜像站 Rocky Linux

https://mirrors.jlu.edu.cn/rocky/9.4/AppStream/source/tree/Packages/g/ghostscript-9.54.0-16.el9_4.src.rpm

[5] Anolis OS 生命周期及更新策略

https://gitee.com/anolis/rnotes/blob/master/anolis/policy/life-cycle.md

[6] 南京大学开源镜像站 Anolis

https://mirror.nju.edu.cn/anolis/8.9/AppStream/source/Packages/ghostscript-9.54.0-17.an8.src.rpm

[7] openEuler版本规划及生命周期

https://www.openeuler.org/zh/other/lifecycle/

[8] Red Hat Enterprise Linux Life Cycle

https://access.redhat.com/support/policy/updates/errata/

[9] CVE-2024-29510 – Exploiting Ghostscript using format strings

https://codeanlabs.com/blog/research/cve-2024-29510-ghostscript-format-string-exploitation/

本栏目相关
  •  2022-12-03 VMware vSphere Hypervisor 6.7 手动升级过程实例
  •  2022-05-20 内网DNS服务实现公网域名在内网转换解析
  •  2022-05-13 2022年甲方系统管理运维人员必备远程访问工具
  •  2023-01-11 网络安全运维必须掌握的Windows命令行工具
  •  2024-03-02 网络运维及安全基础:MAC地址安全管理之二
  •  2024-04-29 从MAC地址到802.1X安全实践:MAC地址安全管理之三
  •  2024-07-26 国产化替代:观察漏洞修补的及时性以供应链关系选择操作系统
  •  2024-08-10 支持 Windows 的 SMTP 服务器开源软件:E-MailRelay。
  •  2024-08-04 一线大厂是如何实施代码向后移植的
  • 本站微信订阅号:

    微信订阅号二维码

    本页网址二维码:

    本栏目热门内容
  • Acrobat虚拟PDF打印机执行打印时挂起,解决办法竟然...
  • LINKSYS交换机登录WEB界面显示不正确的解决方法
  • 又一次RAID 5阵列故障记录
  • 解决VMware vSphere ESXi 5.0 Update 1 中虚机不能...
  • 修改CentOS发行信息以绕过Dell服务器BIOS更新和DSET...
  • 解决虚拟化运行的 Windows Server 2003 标准版出现...
  • Windows Server 2008 重命名域和域控制器
  • Intel Nehalem CPU Errata 导致 VMWare ESXi(vSpher...
  • 一次很精神的电脑组装过程记录(但不是自己的电脑)...
  • 解决MySQL Cluster 备份总是失败,提示文件已存在的...
  • MegaCli安装及使用杂记
  • 解决WSUS显示客户端不全的问题
  • 解决 VMWare vSphere 6 客户端无法修改用户密码
  • 解决Windows Server 2008 R2域控制器显示无法连接到...
  • 本站服务器RAID 5阵列双硬盘失效挽救记录
  • 网站数据库从MySQL 5.0升级到5.6的记录
  • 解决MariaDB使用Percona XtraBackup增量备份出错
  • DELL PowerEdge 820 报CPU3 INTERNAL ERROR 的解决...
  • Linux 下的分区调整工具GParted实战
  • 修改arpwatch使通知邮件主题显示IP地址
  • 程序员漫画:如何用8种不同的编程语言去解救公主
  • 解决Samba WINS服务的错误解释问题
  • 解决很好用的多合一即时通信软件pidgin的崩溃问题
  • 使用 GParted 进行虚拟机硬盘分区调整操作
  • 解决Squid代理HTTP时在浏览器出现Content Encoding ...
  • 用Delphi编写使用到ADO的DLL的一些问题
  • 网站简单改版
  • 索尼系列手提电脑备份失败,出现700错误的解决办法
  • Dell R900服务器 BMC firmware incompatible with C...
  • 更多...