Ghostscript 漏洞 CVE-2026-39919:一份 PDF 如何接管服务器,真正面临风险的是谁

服务器机房的桌上,一只披着白布扮成小幽灵的小猫,一位女子轻轻掀起布角

大多数人从没安装过 Ghostscript,也不知道自己在用它。然而这个程序默默运行在数量庞大的服务器背后:在 WordPress、文档管理系统、邮件网关以及“在线压缩 PDF”之类的服务里,把上传的 PDF 变成缩略图的正是它。2026 年 9 月,它修复了一个漏洞:一份精心构造的 PDF 可能导致处理该文件的机器执行外来代码。

下面是确定知道的、尚不清楚的、如何检查自己的服务器,以及这件事对每一个把文档发到网上处理的人意味着什么。

要点速览

  • 漏洞:CVE-2026-39919,Ghostscript 处理 JPEG 2000 图像时的堆缓冲区溢出。只需一份包含特制图像的 PDF 即可触发。
  • 受影响版本:据发现者称为 9.21 至 10.07.1(CVE 记录笼统地写作“10.08.0 之前”)。
  • 修复:2026 年 9 月 8 日发布的 Ghostscript 10.08.0。Linux 发行版会把修复移植到旧的版本号上,因此关键是软件包的完整修订号,而不是 gs --version 显示的数字。
  • 严重程度:CVE 记录给出 CVSS 3.1 评分 9.8,Red Hat 评为 7.8(“Moderate”)。两个数字都是诚实的,只是描述的场景不同。
  • 实际攻击:目前没有任何确认案例。能用的漏洞利用代码诞生于实验室,并且是针对某个特定构建版本调校的。
  • -dSAFER 起不了保护作用。即使开启沙箱,缺陷照样会被触发。

事情经过

发现这个漏洞的是专注于 WordPress 安全的公司 Wordfence,用的是其 AI 辅助测试系统 Argus。时间是 2026 年 8 月 23 日,当时正在对 WordPress 7.1 进行安全评估。这个工具沿着一个上传文件一路追踪,越过接收它的 PHP 代码:经过 Imagick 扩展,经过 ImageMagick,一直到最底层的 Ghostscript 和 JPEG 2000 解码器。

开发 Ghostscript 的 Artifex 公司第二天就确认了报告,并于 9 月 8 日发布了包含修复的 10.08.0 版本。CVE 记录于 9 月 15 日公布。Wordfence 在 10 月 12 日公开了技术细节,一天后 BleepingComputer 等业内媒体相继报道。

缺陷的原理

理解它不需要懂 C 语言。图像是由采样点组成的网格。JPEG 2000 允许图像的各个分量(例如亮度和透明度)具有不同的分辨率,也允许单个采样占用不到 8 位。如果是 2 位采样,一个字节能装下四个。

在研究人员描述的例子中,图像的一行包含 1,024 个这样的采样。紧凑存放时占 256 字节,Ghostscript 也正确地预留了 256 字节。可当上面两个条件同时出现时,填充这一行的循环不是每个字节装四个采样,而是每个采样写满一整个字节。于是 1,024 字节被写进了 256 字节的缓冲区。每行多出来的 768 字节会覆盖 Ghostscript 存放自身管理数据的内存。由于这些字节来自图像,它们的内容由文件的制作者决定。

老邮局里的木制信件格,每一格里都有一只小猫,排到尽头的小猫纷纷掉到地上

这正是从“程序崩溃了”走到“程序按攻击者的意思行事”的经典路径。现代系统让这条路难走得多(内存布局随机化等保护措施),但并没有把它彻底堵死。

在 WordPress 中,PDF 如何到达 Ghostscript

WordPress 自己并不绘制 PDF 预览。从 4.7 版起,它能为上传文档的第一页生成图像,而这是借助其他程序完成的。链条如下:

WordPress → PHP 扩展 Imagick → ImageMagick → Ghostscript

Ghostscript 作为独立进程运行,通常与 Web 服务器使用同一个账户。只有当有东西请求 PDF 的图像时它才会启动。一个只把文件存到磁盘、别的什么都不做的表单,永远不会启动它。

经由这条路径发动攻击,需要以下四个条件同时成立:

  1. 外部有人(匿名或使用低权限账户)可以上传 PDF;
  2. 网站会为该文件请求预览图或缩略图;
  3. 服务器上有 Imagick 或其他为此调用 Ghostscript 的工具,并且 ImageMagick 的策略允许读取 PDF;
  4. 已安装的 Ghostscript 没有打上修复。

一个重要的前提:默认状态下的 WordPress 不允许匿名访客向媒体库上传文件。攻击者需要一个插件、一个带附件字段的表单,或一个能打开这条路的账户。Wordfence 还检查了 WordPress 官方 Docker 镜像:里面有存在漏洞的 Ghostscript 10.05.1、Imagick 扩展,以及可用的 PDF 预览路径。但仅凭这个镜像本身,还不足以发动匿名攻击。

有一个细节对攻击者有利:生成预览的第一次尝试失败后,WordPress 会自动换一组设置再试一次。因此三个恶意附件就意味着 Ghostscript 运行六次。在 Wordfence 的测试中,表单一直显示“上传成功”,而 Ghostscript 则在后台悄无声息地崩溃。

这不是 WordPress 或表单插件的缺陷。它们只是文件抵达 Ghostscript 的通道。

实际危险有多大

这里值得停下来想一想,因为“一份 PDF 就能接管你的服务器”这类标题只说对了一半。

为什么有两个不同的评分。CVE 记录给出 9.8 分(满分 10,CVSS 3.1)和 9.3 分(CVSS 4.0)。这些数字描述的是最坏情况:一个可从网络访问、无需登录也无需人工参与就接收 PDF 的应用。Red Hat 给同一个漏洞打 7.8 分并称之为“Moderate”,因为它评估的是用户在自己电脑上打开恶意文件的场景。两个评分都没有错,它们回答的是不同的问题。

试了多少次,成功多少次。Wordfence 为其实验室构建版本编写了两个可用的漏洞利用程序,随后在另外十个环境中运行了 10,240 次:Debian、Ubuntu、Fedora、AlmaLinux、Alpine 以及 WordPress 官方容器。一次都没有成功。而在为之编写的那个构建版本上,即使更换了字体、语言设置和一个核心系统库,它们依然有效,只是并非每次都成功。

结论有两面。不存在一份能打开世界上所有服务器的文件。但如果攻击者瞄准的是某家特定公司,或是数百个网站运行在同一系统镜像上的主机服务商,他并不需要万能文件。研究人员提醒,在一个与 libheif 库相关的类似案例中,另一个团队借助 AI,每遇到一个新目标只需一两天就能把漏洞利用程序改造适配。

以什么权限运行。攻击者的代码以处理 PDF 的账户身份运行,通常是 Web 服务器的账户。这并不自动等于 root,但该账户通常能读取网站文件,包括存有数据库密码的配置文件。

实际攻击:截至本文撰写时,没有人报告过该漏洞在实验室之外被利用。

如何检查自己的服务器

戴眼镜的女子坐在笔记本电脑前,身旁一只虎斑小猫专注地盯着屏幕,桌上放着一把放大镜

如果你能访问命令行,先从三个问题开始。

1. 这里到底有没有 Ghostscript?软件包修订号是多少?

  • Debian 和 Ubuntu:dpkg -s ghostscript | grep Version
  • Fedora、RHEL、AlmaLinux:rpm -q ghostscript
  • 补充一下:gs --version,但单凭这个数字说明不了什么。

为什么光看版本号不够?Ubuntu 22.04 在软件包 9.55.0~dfsg1-0ubuntu5.14 中修复了该漏洞,而这个包被问到版本时仍然回答“9.55.0”。Debian 13 的修复在 10.05.1~dfsg-1+deb13u2 中(安全公告 DSA-6516-1)。Red Hat 在 10 月 1 日至 6 日之间为 RHEL 10、9 和 8 发布了修复。根据 Debian 的安全追踪器,Debian 12(bookworm)仍被标记为存在漏洞。请务必对照你所用发行版的安全公告。

反方向也有一个陷阱:10.08.0 的候选发布版(RC)自称 10.08.0,却不含修复。Wordfence 的测试机上运行的恰恰就是它。如果你是从源码编译的 Ghostscript,请确认它是正式版。

2. PHP 有没有 Imagick?php -m | grep -i imagick。在 WordPress 后台:工具 → 站点健康 → 信息 → 媒体处理。这只是一个起点:它能告诉你 Imagick 是否识别 PDF,却说明不了 Ghostscript 是否已修补。

3. ImageMagick 能否读取 PDF?convert -list format | grep -i pdf(ImageMagick 7 中为 magick -list format)。PDF 旁边出现 rw 字样,就说明通往 Ghostscript 的路是通的。

容器:重启不够。拉取更新后的基础镜像,不使用缓存层重新构建,然后重新部署。

共享主机:通常你没法自己检查。向服务商问两个问题:其服务器上的 Ghostscript 软件包是否包含 CVE-2026-39919 的修复;客户上传的 PDF 是否会在其系统的任何地方被转换成预览图。

如果暂时无法更新

  • 停止接收匿名访客和低权限账户上传的 PDF。到不了服务器的文件,也到不了 Ghostscript。
  • 在 ImageMagick 策略中禁用 PDF 读取。在 policy.xml 文件(通常位于 /etc/ImageMagick-6/ 或 /etc/ImageMagick-7/)的 <policymap> 部分加入一行 <policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" />。副作用是 WordPress 将不再生成 PDF 缩略图。
  • 限制每次提交的文件数量和上传频率。这能减少攻击者的尝试次数,但修不好任何东西。
  • 隔离文档转换:放到一个单独的服务中运行,让它无法访问网站的机密,也没有多余的网络连接。这能限制损害,但同样不是修复。

不该做的事:别把 -dSAFER 当成防护。Ghostscript 的沙箱限制的是文档能通过已公开的 PostScript 功能做什么。它防不了内存损坏,测试中缺陷正是在沙箱开启时被触发的。任何 WordPress 插件都修不了这个问题,因为 Ghostscript 来自操作系统或容器镜像,而不是 WordPress。

别把这个漏洞和 CVE-2026-65640 搞混。那是另一回事:通过上传 PostScript 文件在 WordPress 中远程执行代码,同样经过 Imagick 和 Ghostscript,但需要一个有上传文件权限的账户(通常是作者及以上角色)。它已在 WordPress 7.0.4 中修复,并向后移植到 4.7 分支。

这不只是 WordPress 的问题

WordPress 只是陌生人的 PDF 抵达 Ghostscript 的众多途径之一。文档管理系统、打印服务器、发票处理、预览生成器、扫描附件的邮件网关以及文件转换 API 也是如此。问题始终只有一个:这个软件会不会渲染来自别人的 PDF?

在自己应用的代码里搜索“Ghostscript”这个词,可能什么也找不到。中间通常隔着 ImageMagick 或其他库,真正调用 Ghostscript 的是它们。

这对把 PDF 发到网上意味着什么

这个故事还有较少被提及的另一面。浏览器里的“压缩 PDF”“PDF 转图片”“合并 PDF”服务,正是上面所说的那类服务器:它接收陌生人的文件,再交给会把文件拆开重组的工具处理。你不知道你的文档是用什么、什么版本处理的,也不知道对方在 9 月 8 日之后有没有更新。你只知道,你的文件至少会有一段时间和成千上万其他人的文件待在同一台机器上,而其中一些可能是特制的。

这并不是说所有在线服务都漏洞百出。而是说,当你上传合同、身份证扫描件或检查报告时,你是把它们交给了一个你无法核实其安全性的地方。更多内容请看在线 PDF 工具风险一文。

公平地说,本地处理也并非天生安全。如果你自己用 Ghostscript 压缩 PDF,就像PDF 压缩指南里那样,请把它更新到 10.08.0 或更高版本。离线工作的优势在别处:文档从不离开你的电脑,由哪个软件版本处理它,是你说了算,而不是某个素未谋面的人。

如果你经常合并、拆分、加密 PDF 或把 PDF 转成 Word,完全可以不上传到任何地方就完成。PDF Manipulator 免费,可在 Windows 和 Linux 上运行,每个文件都留在你自己的电脑上。

参考来源

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部