hplip: hpps 程序因使用固定的 /tmp 路径而存在的安全问题
#tmpfiles本报告关于 hplip 项目的 hpps 程序中存在的问题,该问题是由使用固定的临时路径引起的。hplip 项目。Hplip 是用于 HP 打印机和扫描仪设备的实用程序集合。
目前该问题还没有上游修复程序,本次发布是在尝试协调披露 90 天后进行的,但上游未对我的报告作出回应。
更新 2024-01-04:我已获悉,上游版本 3.23.12(发布于 2023-11-30)已悄然修复了此问题。该修复基于我在本报告中建议的补丁。
本报告基于 hplip 的最新上游版本 3.23.8。
问题
/usr/lib/cups/filter/hpps 程序使用多个不安全的固定临时文件,这些文件可以在 prnt/hpps/hppsfilter.c 中找到。
prnt/hpps/hppsfilter.c:1027: sprintf(booklet_filename, "/tmp/%s.ps","booklet");
prnt/hpps/hppsfilter.c:1028: sprintf(temp_filename, "/tmp/%s.ps","temp");
prnt/hpps/hppsfilter.c:1029: sprintf(Nup_filename, "/tmp/%s.ps","NUP");
这些路径仅在启用“手册打印”时使用。为了测试,可以通过类似以下方式调用程序来强制执行该逻辑:
$ export PPD=/usr/share/cups/model/manufacturer-PPDs/hplip-plugin/hp-laserjet_1020.ppd.gz
$ /usr/lib/cups/filter/hpps some-job some-user some-title 10 HPBookletFilter=10,fitplot,Duplex=DuplexTumble,number-up=1
程序将以这种方式等待 stdin 中的打印数据。只需键入一些随机数据并按 Ctrl-d 即可继续。由于程序中很大一部分错误返回未被检查,因此可能会崩溃。
这三个路径是通过 fopen() 创建和打开的,因此没有生效的特殊打开标志可以阻止跟随符号链接,并且还缺少 O_EXCL 标志来防止打开现有文件。系统调用结果(用于创建/打开读取)如下所示:
openat(AT_FDCWD, "/tmp/temp.ps", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
openat(AT_FDCWD, "/tmp/temp.ps", O_RDONLY)
此外,对 /tmp/temp.ps 文件进行了 chmod() 操作
hppsfilter.c:110 chmod(temp_filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
要打印的数据(来自 stdin)会写入此文件,并且该文件通过此 chmod() 被显式地设置为对所有人可读。这些路径的多重问题在于:
- 存在本地信息泄露,因为打印作业数据将对系统中的每个人可见。
- 数据完整性被破坏,因为其他用户可以预先创建这些文件并操纵例如要打印的数据。
- 如果 Linux 内核的符号链接保护未激活,则通过放置符号链接可能允许在意外位置创建文件。
- 同样,在
chmod()过程中通过跟随符号链接,可能允许将世界读取权限授予任意文件。 - 如果将精心制作的数据放入 /tmp/temp.ps 文件中,并且该文件由复杂的
PS_Booklet()函数处理,则可能导致其他未指明的影响。
我没有进一步研究该问题的影响,以查看它是否可能导致调用 hpps 的用户在上下文中执行本地代码。
建议的补丁
要解决此问题,需要将所有三个固定的临时路径替换为安全创建的、命名不可预测的临时文件。我编写了一个建议的补丁来实现这一点。该补丁还删除了 chmod()。其目的尚不清楚,因此如果其他具有不同权限的进程需要访问此文件,这可能会导致问题。
上游没有提供任何补丁或其他信息。
受影响范围
据我所知,hplip 没有公开的版本控制系统,因此很难确定该问题何时引入。通过对旧 SUSE 发行版进行一些抽样,我发现该问题至少自 2019-12-12 的上游版本 3.19.12 起就一直存在。
CVE 分配
由于 HP 是 CVE CNA,因此它自己负责分配 CVE。由于上游没有回应,我不知道 CVE 是否以及何时可用。
时间线
| 2023-08-21 | 我已通过Launchpad私下向 Suse 报告了此发现,并提供了协调披露。hplip 没有记录其他联系方式。 |
| 2023-09-05 | 由于我还没有收到任何反馈,我通过 Launchpad 敦促 Suse 提供回复。 |
| 2023-10-04 | 我与 Suse 分享了建议的补丁,但仍然没有回应。 |
| 2023-11-17 | 我们提供的最长 90 天的保密期已到,我们发布了此发现。 |
| 2024-01-04 | 我获悉 Suse 已于 2023-11-30 在版本 3.23.12 中悄然修复了此问题。 |