PHP 8.5.12修复CVE-2026-109618和CVE-2026-109619两个内核级RCE漏洞,但不解决PHP-FPM裸奔导致的FastCGI参数注入问题,后者需网络层与配置层双重隔离。

PHP 8.5.12 本身不修复 FastCGI 参数注入漏洞——这个漏洞和 PHP 版本升级无关,它属于PHP-FPM 配置与网络暴露层面的问题,不是 PHP 解释器内核缺陷。CVE-2026-109618 和 CVE-2026-109619 是两个独立的、需通过 8.5.12 修复的 RCE 漏洞,但它们和 FastCGI 协议滥用(如 SCRIPT_FILENAME 伪造)不是一回事。
你真正要防的,是攻击者直连 PHP-FPM 的 9000 端口,构造恶意 FastCGI 请求,控制 SCRIPT_FILENAME、PHP_VALUE 等环境变量执行任意代码。这跟 PHP 版本号无关,哪怕你用 8.5.12,只要 PHP-FPM 裸奔在公网或内网未受控网段,就仍可被利用。
PHP-FPM 直连暴露导致的 FastCGI 参数注入怎么防
- 攻击者不需要登录、不需要任何凭证,只要能 TCP 连上
9000(或你配置的其他监听端口),就能发原始 FastCGI 包 - 关键风险点:PHP-FPM 默认信任所有传入的
FCGI_PARAMS,尤其是SCRIPT_FILENAME和PHP_VALUE - 常见暴露场景:Nginx 配置错误、云主机安全组放行了
9000、Docker 容器端口映射到宿主机、开发环境误部署
必须从网络层 + 配置层双重收紧:
-
listen不要绑定0.0.0.0:9000,改用 Unix socket 或仅限本地回环:listen = /var/run/php/php8.5-fpm.sock
或listen = 127.0.0.1:9000
- 如果必须用 TCP,确保系统防火墙(
iptables/nftables)和云平台安全组只允许可信来源 IP 访问 9000 端口(例如仅 Nginx 所在服务器) - 在
php-fpm.conf或 pool 配置中禁用危险参数传递(非完全可靠,但有辅助作用):security.limit_extensions = .php
env[PATH] = /usr/local/bin:/usr/bin:/bin
(注意:PHP_VALUE/PHP_ADMIN_VALUE无法靠此完全拦截,必须靠网络隔离)
SCRIPT_FILENAME 校验不能只靠应用层
很多开发者试图在 PHP 代码里做路径白名单校验,比如:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
if (!in_array($_SERVER['SCRIPT_FILENAME'], $allowed_paths)) {
exit;
}这完全无效——因为 $_SERVER['SCRIPT_FILENAME'] 是 PHP-FPM 解析 FastCGI 请求后设置的,攻击者在请求到达 PHP 用户代码前,已经让 PHP-FPM 加载并执行了任意文件。此时校验早已晚了。
真正有效的校验必须由前端代理(Nginx/Apache)完成:
- Nginx 中严格限制
fastcgi_param SCRIPT_FILENAME只能指向预期目录:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
并确保$document_root是绝对路径、不含用户可控变量 - 禁用
fastcgi_param的动态覆盖,不要在 location 块里用set或map构造路径
为什么升级到 8.5.12 还不够
-
8.5.12修复的是 PHP 内核级 OOM 状态残留(CVE-2026-109618)和全局状态 Use-After-Free(CVE-2026-109619),这两个漏洞在 PHP-FPM、mod_php 等长驻进程模型下可能被链式利用 - 但它不改变 FastCGI 协议处理逻辑,也不限制
SCRIPT_FILENAME的取值范围 - 换句话说:一个裸奔的
8.5.12PHP-FPM,仍然会被 FastCGI 参数注入打穿;而一个正确隔离的7.4PHP-FPM,反而不会因该问题被直接 RCE(尽管它有别的高危漏洞)
最关键的遗漏点往往不是“要不要升级”,而是“有没有确认 PHP-FPM 是否仍在监听公网/内网不可信地址”。很多人升级完 8.5.12 就以为万事大吉,却忘了检查 netstat -tlnp | grep :9000 ——只要那一行还存在且监听在 * 或非 127.0.0.1,风险就还在。


















