PHP 官方修复两个高危漏洞:TLS 握手可打崩 PHP-FPM 全池,OpenSSL 存在堆损坏
PHP 官方于 2026 年 7 月初发布安全公告,修复两个漏洞:一个可远程触发、直接拖垮 PHP-FPM 整个进程池的拒绝服务漏洞,以及一个出现在 OpenSSL 相关函数中的堆内存损坏问题。这两个漏洞分别被标记为 CVE-2026-12184(CVSS 8.2,高危)和 CVE-2026-14355(CVSS 4.8,中危),目前均未观察到野外主动利用。
背景
两个漏洞都由 PHP 源码安全团队维护的 GitHub Security Advisory 发布。其中 CVE-2026-12184 的公告位于 php/php-src 仓库:
CVE-2026-12184:远程 DoS,PHP-FPM 进程池可被一次 TLS 失败打崩
CVE-2026-12184 是一个可导致整个 PHP-FPM 进程池崩溃的远程拒绝服务漏洞,CVSS 评分 8.2。
触发路径并不复杂:PHP 与远程服务器进行 HTTPS/TLS 握手时,只要握手失败(例如对端返回过期或无效证书),PHP 就会关闭对应的流并将其置为 NULL。问题在于,后续的清理代码仍会在这个已经失效的流上重置对端名称(peer name),导致空指针解引用并触发崩溃。
关键点在于:
- 无需精心构造恶意载荷,单个远程服务器即可触发;
- 意外或恶意的 TLS 握手失败都能造成影响,触发门槛极低;
- PHP-FPM 往往同时服务大量高流量站点,一次崩溃可能让所有 worker 进程同时退出,形成大面积短时不可用。
CVE-2026-14355:openssl_encrypt 输出缓冲区计算错误导致堆损坏
CVE-2026-14355 是 OpenSSL 相关堆内存损坏漏洞,CVSS 4.8。
问题出在 openssl_encrypt 函数对输出缓冲区大小的估算上。函数按照输入长度确定缓冲区大小,但对于带填充的 AES 密钥封装(key-wrap-with-padding)算法,实际写入的数据会比按输入长度计算出的结果多出若干字节。OpenSSL 在写入时超出缓冲区边界,破坏 Zend 堆的元数据,可能造成内存损坏或进程崩溃。
该漏洞只在应用调用这种罕见算法时才会被触发,实际攻击面有限,但仍然属于内存安全问题,运行不受信任输入的应用需要关注。
受影响版本与修复版本对照
两个漏洞各自的版本范围不同,升级时请对照下表:
| 漏洞 | 影响版本(之前版本均受影响) | 修复版本 |
|---|---|---|
| CVE-2026-12184(远程 DoS) | PHP 8.3.32 / 8.4.21 / 8.5.6 | 8.3.32、8.4.21、8.5.6 |
| CVE-2026-14355(OpenSSL 堆损坏) | PHP 8.2.32 / 8.3.32 / 8.4.23 / 8.5.8 | 8.2.32、8.3.32、8.4.23、8.5.8 |
PHP 官方目前没有提供可用的临时缓解方案。对于使用 PHP 8.3~8.5 的环境,管理员应优先修复 CVE-2026-12184,因为远程 DoS 更易被外部触发,实际影响也更直接。
两个漏洞的详细公告请在 GitHub Advisory 页面跟踪:CVE-2026-12184 见 GHSA-7jrw-539f-x6vr,CVE-2026-14355 见 GHSA-mhmq-mmqj-2v39。