Python生态里使用最广的图像处理库Pillow被披露一处命令执行缺陷:只要给待打开的EPS文件配上一个由攻击者构造的文件名,运行该库的服务器就可能被诱导执行操作系统级命令。该漏洞编号CVE-2026-112900,维护方已随10月16日发布的13.0.0版本完成修复。

漏洞成因:文件名被Ghostscript当作指令执行

据安全公司OX Security披露的信息,问题出在Pillow的EPS处理链路上。Pillow在处理EPS图像时会把这个文件交给外部程序Ghostscript做像素格式转换,而文件名在整个过程中未经验证就直接传了过去。Ghostscript拿到某些经过特殊设计的文件名后,不会把它当成普通路径,而是解析为一条执行指令,并指向第二个文件——那里面才是攻击者真正想执行的命令。

Pillow 13.0.0紧急修复:文件名可触发命令执行,月下载4.36亿次

官方公告对此的表述是:触发点在文件名本身,同PostScript文档内部的任何内容都没有关系。换言之,即使EPS文件本身完全正常,攻击者仍可通过恶意文件名达成目的。公告作者也明确,只有当主机侧安装了gs程序——也就是Pillow处理EPS所需的那项依赖——漏洞才会被激活。从版本维度看,2.6.0到12.3.0之间的所有Pillow发行版均受波及。

在风险判定上出现了明显分歧。Pillow维护团队给出的是中危,理由是攻击者必须完全掌控文件名才能实施利用;同一前提之下,GitHub分配的CVE记录却给出了10分制中的9.2分,归为严重级别。实际环境中最需要警惕的,是那些把用户上传的文件名原样保留,或直接基于用户输入拼接存储名的上传接口。OX Security估算,Pillow每月下载量达到约4.36亿次,覆盖面横跨网页表单、头像与缩略图服务、文档与PDF处理流水线,并作为依赖被大量机器学习项目引入。

13.0.0一次性收口多类高危缺陷

发布的13.0.0并非只针对EPS一处,而是一次覆盖低危到严重四个等级的大规模安全更新,其中两个漏洞被维护方划入最高等级。

Pillow 13.0.0紧急修复:文件名可触发命令执行,月下载4.36亿次

根据发布说明,其中之一属于独立的内存问题,形象说法是模式切换之后遗留的图像数据被再次调用。另一个严重等级修复对应JPEG解码环节里的两个溢出缺陷。其中之一作用于FlashPix(FPX)格式,条件是主机装有olefile这一可选依赖:攻击者做好文件后,仅一次Image.open()调用即可执行任意命令。值得注意的是,Pillow依靠文件内容而非扩展名判断格式,所以服务端只要处理不可信上传,无需用户进行任何交互就可能中招。

另一个缺陷编号为CVE-2026-112403,触发场景是对构造出来的无损JPEG生成缩略图时发生内存缓冲区越界。公告写明:该缺陷先是Anthropic在利用Claude开展开源软件安全研究时找到的,随后Ada Logics人工复核确认,属于该开源安全项目的产出之一——目前这一项目已在各类开源库中累计提交数百个漏洞。就危害而言,这一处只造成程序崩溃,暂时无法升级为代码执行。

CVE-2026-112393是第三处,其存在时间可以追溯至2013年。当程序把压缩后的TIFF图像写入内存缓冲区而非落盘文件时,会出现缓冲区越界,这种写法多见于上传后重编码并直接返回的在线服务。报告者用这一缺陷单独利用只能令进程中断,若配合另一个内存地址泄露类缺陷,才有可能走到代码执行。TIFF直存磁盘的写法不受影响。

Pillow 13.0.0紧急修复:文件名可触发命令执行,月下载4.36亿次

GitHub为上述EPS、TIFF、JPEG缩略图三项均出具9.2分记录;不过每个漏洞的利用都带有评分不能覆盖的前置条件,因此维护方自己对这些项的判定从中危到严重不一。CVE记录补充,CISA分析师已确认EPS问题尚无已知的在野利用,TIFF一项则已有公开的PoC。

升级路径与三种临时缓解手段

官方建议全部使用者升至Pillow 13.0.0,该版覆盖上述所有问题。需要同时留意的是镜像侧:凡内置旧版Pillow的容器、wheel分发包和基础镜像都要重建。此外13.0.0已不再支持Python 3.10,仍停留在该版本的环境需一并切换至Python 3.11或更新版本。

Pillow 13.0.0紧急修复:文件名可触发命令执行,月下载4.36亿次

升级命令为:

pip install -U "Pillow>=13.0.0"

短期无法升级的部署可按Pillow安全指南逐条封路。EPS与Ghostscript一侧,接收不可信上传的主机上不应部署gs程序;确有EPS需求的,务必将攻击者可左右的文件名从传入Image.open()的参数中排除。JPEG缩略图一侧,不要对不信任的JPEG运行draft()与thumbnail();若要绕开,可以先调load(),或者传入reducing_gap=None。TIFF一侧则需特别对待:只要图像源自用户上传,将TIFF写入io.BytesIO等内存缓冲的操作就应当按照敏感路径设防。

Pillow 13.0.0紧急修复:文件名可触发命令执行,月下载4.36亿次

当下没有任何漏洞被证实已遭在野利用,但修复节点的另一面同样值得咀嚼。攻击面扩张是随函数库下沉自然增长的:Pillow的身量越缩越短,被挤兑的也就只有它自己承接上;扩展挂载和形态选型在长期上要换取更规范的登记节奏。短期补丁是对的,把文件名必须放行或调用指纹等位由运行时交进来变修得够长。

同一批补丁也从侧面凸出了第三方影像库在外设上集成链路重、异常处理差异较严重。多数系统面临旧版本能否装入现有系统多道规程、环境容器是否稳定运行的风险。受影响代码正一步步耗尽性能裕量,最终触及该一次根本跳跃;需要一次反向检查——由内置流程下推文件包是否有触发检查的裕度和进程装配清单评估办法已足够处理。

小结:Pillow本次修复的错误标定说明,文件名可见可能比图像本身先破防:一切文件名环节必须完成更优且完整的清洗,涉及版本重装时才不疏漏容器和wheel及镜像的同步推齐;短期内存缓冲区要重读,即回运行时头端检查与准入建议。