文章总结: 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)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论