PHPonWindows保留设备名未拒绝导致DoS(CVE-2026-17545)

admin 2026-09-28 05:15:24 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: PHP在Windows平台存在保留设备名未拒绝导致的拒绝服务漏洞CVE-2026-17545,CVSS评分6.5中危。攻击者可利用CON、NUL等设备名作为文件名,通过文件API打开设备导致请求阻塞耗尽进程池。影响PHP8.2至8.5多个版本,官方已发布修复版本8.2.34、8.3.35、8.4.26、8.5.11。建议升级修复并对用户输入文件名实施白名单校验。 综合评分: 85 文章分类: 漏洞分析,WEB安全,应用安全,安全建设


PHP on Windows 保留设备名未拒绝导致 DoS(CVE-2026-17545)

撅人

2026年9月27日 00:00 广东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

PHP on Windows 保留设备名未拒绝导致 DoS

CVE-2026-17545 · GHSA-9f67-6fw4-hpfp | CVSS 6.5 | 披露时间 2026-09-26

1

漏洞速览

CVE 编号CVE-2026-17545

漏洞类型输入验证缺失 → 设备文件 DoS

影响产品PHP on Windows

安全等级Medium(中危)

CVSS v3.16.5

披露时间2026-09-26

利用情况暂无公开利用

GHSA 编号GHSA-9f67-6fw4-hpfp

影响平台仅 Windows 部署

远程利用是(需用户可控文件名)

2

漏洞概述

PHP 是全球使用最广泛的 Web 服务器端脚本语言之一,大量 Windows 平台运行的 PHP 应用(如 ThinkPHP、Laravel on IIS 等)通过文件系统 API 处理用户上传的文件名或请求中的路径参数。2026 年 9 月 26 日,PHP 安全团队披露了一个在 Windows 平台上存在的关键输入验证缺失漏洞。CVE-2026-17545 的 CVSS v3.1 评分为 6.5 分(中危)。

在 Windows 操作系统中,CON、PRN、AUX、NUL、COM1~COM9、LPT1~LPT9 等名称被保留为设备文件名。当这些名称作为路径组件出现在文件/流 I/O 操作中时,PHP 的文件系统 API 不会拒绝它们,导致 CreateFileW() 打开的是设备而非普通文件,从而可能阻塞请求、耗尽工作进程,导致拒绝服务(DoS)。

影响范围:该漏洞仅影响 Windows 平台部署的 PHP,因为保留设备名是 Windows 文件系统特有的概念。在 Linux/Unix 平台上,这些名称被视为普通文件名,不存在此问题。受影响版本为 PHP 8.2.33 及以下、8.3.34 及以下、8.4.25 及以下、8.5.10 及以下。

3

详细漏洞分析

CVE-2026-17545 — Windows 保留设备名未拒绝导致 DoS(CVSS 6.5)

GHSA-9f67-6fw4-hpfp · 影响:8.2.0~8.2.33 / 8.3.0~8.3.34 / 8.4.0~8.4.25 / 8.5.0~8.5.10 · 修复:8.2.34 / 8.3.35 / 8.4.26 / 8.5.11

第一层:底层概念

Windows 操作系统在早期 PC DOS 时代为硬件设备预留了特殊文件名:CON(控制台)、PRN(打印机)、AUX(辅助串口)、NUL(空设备)、COM1~COM9(串行端口)和 LPT1~LPT9(并行端口),以及 CONIN$ 和 CONOUT$(Windows NT 内核控制台设备)。当应用程序尝试以这些名称创建或打开文件时,系统不会创建普通文件,而是返回硬件设备句柄。

第二层:漏洞机制

应用代码中的路径会流经流包装器层(stream wrapper layer)进入 Windows I/O 层。例如:file_get_contents() 通过 php_stream_open_wrapper_ex() 打开请求路径,move_uploaded_file() 通过 VCWD_RENAME() 和 php_copy_file_ex() 处理路径,用户可控的上传文件名最终会到达同一个地方。

Windows 路径验证宏仅检查尾随空格和某些尾随点(如 file.txt.),没有检查保留设备名。php_win32_ioutil_open_w() 将路径直接传递给 CreateFileW(),而不会进行设备名过滤。

第三层:攻击链

步骤 1 — 攻击者构造恶意文件名,如 CON、CONIN$、NUL.txt、COM3

↓

步骤 2 — 将恶意文件名传入 PHP 应用的路径参数(如 ?file=CONIN$)

↓

步骤 3 — PHP 应用通过文件系统 API(如 file_get_contents())尝试打开路径

↓

步骤 4 — Windows CreateFileW() 打开设备(如 CONIN$ 会等待控制台输入,永久阻塞)

↓

步骤 5 — 在高并发场景下,多个阻塞请求会耗尽工作进程池,导致拒绝服务(DoS)

利用示例(PoC):

请求脚本时传入 ?file=CON、?file=CONIN$ 或 ?file=NUL.txt 会使 PHP 打开对应设备而非失败于文件不存在。其中 CONIN$ 会等待控制台输入,从而永久挂起请求。

利用条件:Windows 平台部署的 PHP 应用,且应用构建路径时使用了用户可控的输入(如下载接口、上传文件名来自客户端提交的文件名等)。

4

快速自查命令

① 检查 PHP 版本

php -v

检查 PHP 版本是否在受影响范围内:8.2.0~8.2.33 / 8.3.0~8.3.34 / 8.4.0~8.4.25 / 8.5.0~8.5.10

② 检查 PHP 运行平台

php -r “echo PHP_OS;”

若输出为 WINNT 或 WIN32,则为 Windows 平台,存在受影响可能

③ 检查应用是否存在文件下载接口

grep -rn “file_get_contents|file_put_contents|include|require” –include=”*.php” /path/to/app/

查找可能将用户输入拼接到文件路径的代码

④ 检查应用是否有上传文件名来自客户端的接口

grep -rn “move_uploaded_file|upload[‘name’]” –include=”*.php” /path/to/app/

客户端提交的文件名若未经校验可直接用于构建路径

⑤ 验证修复效果(升级后)

php -r “file_get_contents(‘C:\temp\CON’);”

升级后应返回 “Invalid name” 错误而非打开设备

5

修复方案

PHP 官方已修复所有分支的漏洞,请根据当前使用的版本,升级到对应的修复版本:

受影响版本分支 → 最低修复版本

PHP 8.2.x 系列 → 8.2.34

PHP 8.3.x 系列 → 8.3.35

PHP 8.4.x 系列 → 8.4.26

PHP 8.5.x 系列 → 8.5.11

注意:修复版本仅影响 Windows 平台部署。Linux/Unix 平台不受此漏洞影响,无需升级。升级后,PHP 将通过新增的 php_win32_ioutil_path_kind_w() 函数在 I/O 之前对路径中的保留设备名进行验证,若发现保留设备名则返回 ERROR_INVALID_NAME 错误。

升级操作步骤

步骤 1:备份当前 PHP 配置(php.ini、扩展配置等)

步骤 2:下载对应分支的修复版本,按官方升级流程执行

步骤 3:升级完成后验证版本:执行 php -v

步骤 4:使用 PoC 脚本验证设备名是否被正确拒绝

步骤 5:检查 Web 日志,确认无异常访问请求

6

安全提醒

对用户输入的文件名实施严格白名单校验

禁止使用用户上传的文件名直接作为文件系统路径,应在服务端生成安全的文件名(如 UUID),或使用白名单过滤特殊字符和设备名。

在文件路径构建之前进行设备名过滤

在将用户输入拼接到文件路径之前,检查文件名是否包含保留设备名(CON、PRN、AUX、NUL、COM1~COM9、LPT1~LPT9、CONIN$、CONOUT$),拒绝所有匹配请求。

考虑使用 chroot 或容器隔离

将 PHP 运行在容器化环境中,限制其对底层文件系统的访问范围,即使设备名被打开也不会影响宿主系统。

配置请求超时和并发限制

设置合理的 PHP-FPM 请求超时时间(如 max_execution_time),并对文件操作相关的接口设置并发限制,降低 DoS 攻击的影响面。

关注其他语言生态系统的同类修复

保留设备名问题已在多个编程语言和框架中出现过,如 Java、Python、.NET 等都有过类似的修复。建议关注 PHP 官方安全公告,及时跟进其他语言生态系统的同类修复。

7

参考链接

CVE-2026-17545 官方记录(CVE.org)

GHSA-9f67-6fw4-hpfp(GitHub Advisory)

PHP 8.5.11 Release(修复版本)

win32/ioutil.h — Windows 路径验证宏

win32/ioutil.c — CreateFileW 调用路径


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:撅人 《PHP on Windows 保留设备名未拒绝导致 DoS(CVE-2026-17545)》

    评论:0   参与:  0