本报告关于 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 中悄然修复了此问题。

参考文献