新用户新用户即享 DNS 与 CDN 免费套餐。立即注册

PHP2Shell(CVE-2026-109618/109619):我们如何在边缘打上虚拟补丁

PHP 官方同日发布两条 Critical 公告,OOM 中断与跨请求残留状态都能导致未认证远程代码执行。本文讲清漏洞原理、Yeap WAF 当天在边缘拦截了什么,以及源站还必须做哪些修复。

2026 年 10 月 21 日,PHP 官方一次发布了两条 Critical 级安全公告:GHSA-w8hw-w9fx-j79w(CVE-2026-109618)和 GHSA-6wmf-4rv5-p3rp(CVE-2026-109619),CVSS v4 评分均为 9.2。两者都能在无需登录的情况下实现远程代码执行,社区把这组漏洞叫作 PHP2Shell。

PHP 8.2、8.3、8.4、8.5 四个在维护的分支全部受影响,而且官方确认 mod_php 在默认配置下即可被利用。对于跑着 WordPress、Laravel、ThinkPHP 或任何 PHP 程序的网站来说,这意味着一个匿名 POST 请求就可能拿到服务器权限。

公告发布当天,我们就把针对公开攻击路径的虚拟补丁推送到了 Yeap CDN 的全部边缘节点。这篇文章说明漏洞原理、我们的规则拦什么、拦不了什么,以及你还需要在源站上做哪些事。

PHP2Shell 两个漏洞的攻击链:OOM 中断导致半初始化内存被信任,以及跨请求的陈旧全局状态导致释放后使用
两个漏洞的根因都在 Zend 引擎的请求生命周期,而不在某个具体扩展。

漏洞是怎么回事

CVE-2026-109618:OOM 中断造成的内存损坏

PHP 遇到内存不足(OOM)时,会用 longjmp() 直接中止当前请求。问题在于,有些场景下请求内存在尚未完全初始化时就已经可以被访问了。如果恰好在这时分配失败,提前退出会留下一块无效内存,而随后的请求收尾阶段还会去读取它、根据它做分支判断。

攻击者可以在正常的 PHP 限制内,通过构造畸形的 multipart/form-data 请求来稳定触发 OOM:比如没有可用的内容长度、单个分段带有海量头部、用空文件字段绕过 max_file_uploads、使用深度嵌套的字段名。官方修复直接去掉了 OOM 时的 longjmp(),改为在下一个安全点优雅退出,超过更高阈值时直接 _exit()。

CVE-2026-109619:跨请求残留的全局状态

错误、会话、对象、扩展等属于“某个请求”的全局状态,在请求内存被释放之后,可能仍然残留在同一个 worker 进程里。有些代码会在下一个请求正式初始化之前就去读这些状态,于是读到了一个已经释放的指针,形成释放后使用(UAF)。

  • 生产者(留下陈旧状态的请求):致命错误、执行超时、require 失败、OOM,以及 PHP 8.5 的 fatal_error_backtraces;
  • 消费者(读取陈旧状态的请求):请求启动前的 INI 诊断,以及默认开启的 session.upload_progress 上传进度处理。

只要生产者和消费者落在同一个 worker 上,攻击者就可以通过堆布局把 UAF 变成远程代码执行。官方已在 mod_php 和 PHP-FPM 上验证了上传进度这条路径。

受影响版本

分支受影响修复版本
PHP 8.5< 8.5.128.5.12
PHP 8.4< 8.4.278.4.27
PHP 8.3< 8.3.368.3.36
PHP 8.2< 8.2.358.2.35

运行方式上,mod_php 已确认可利用;FPM、FrankenPHP、LSAPI 经源码分析同样存在风险。已经停止维护的旧版本不会收到官方补丁,更需要前置防护。

WAF 能挡住什么

目前公开的攻击方式,本质上是一个未认证的 multipart POST 请求:带上 PHP_SESSION_UPLOAD_PROGRESS 字段和一个文件上传,触发上传进度处理;同时塞进大量表单字段做堆喷射,把被释放的内存重新占住。这个形状在 HTTP 层面是看得见的,所以可以在请求到达 PHP 之前就把它拦下。

我们在 Yeap WAF 的 OWASP CRS 引擎里加了一组独立的虚拟补丁规则,识别这类攻击依赖的“上传进度触发 + 堆喷射”组合特征,在 PHP 解析请求之前直接返回 403。

  • 独立拦截,不依赖异常评分。命中即拦截,不受站点防护强度和评分阈值影响。
  • 看行为,不看固定特征。改字段名、换载荷形状都绕不过去。
  • 不误伤正常上传。正常的上传表单(包括带进度条的)照常可用。
  • 边缘统一生效。规则跑在 CDN 边缘,源站不用安装任何模块,不用改一行配置。
Yeap CDN 边缘防护分层:TLS 终止与隐藏源站、PHP2Shell 虚拟补丁、OWASP CRS 托管规则、速率限制与黑名单
攻击请求在边缘被拦截,正常访问照常回源。

从公告到全网生效

时间线:10 月 21 日公告发布,当天完成规则验证并在 23:34 上线全部边缘节点,10 月 22 日随 OWASP CRS v4.30.0 规则包发布

规则在上线前,先用攻击流量形状和多种正常上传形状做了验证:所有攻击形状都被拦截,正常上传全部放行。随后它作为插件编进 CRS 规则包,在 10 月 21 日 23:34(UTC+8)对全部边缘节点生效。10 月 22 日凌晨,我们又把整个规则包升级到 OWASP CRS v4.30.0,虚拟补丁随之一起发布。

这背后是 Yeap WAF 的规则更新流水线:新规则包在后台编译、校验,先上金丝雀节点观察加载状态和拦截率,健康后再全量;边缘节点原子切换规则,旧规则在新规则就绪前一直生效,不会出现防护空窗;出问题可以一键回滚到上一个可用版本。

WAF 不是补丁:你还需要做的事

坦白说,WAF 只能挡住经过 HTTP 请求体的那部分攻击路径。CVE-2026-109619 里还有一些生产者和消费者完全不经过 multipart:比如 PHP 8.5 的 fatal_error_backtraces、启动阶段的 INI 告警,而且释放和使用可以分散在两个看起来都很正常的请求里。这些只能在 PHP 引擎层面解决。另外,慢速 POST 这类基于时序的变种也不是内容型 WAF 能识别的。

所以请把边缘规则当作争取时间的第一道防线,同时尽快完成下面几件事:

  1. 升级 PHP 到 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 或更高版本。这是官方说明的唯一完整修复。
  2. 升级前先收紧 php.ini,改完重启所有 PHP worker:
    ; 不用上传进度条的站点直接关掉(官方建议升级后也保持关闭)
    session.upload_progress.enabled = 0
    
    ; PHP 8.5:去掉已确认的 RCE 生产者
    fatal_error_backtraces = 0
    
    ; 保守的请求体与输入限制
    post_max_size = 8M
    max_input_vars = 1000
    max_input_nesting_level = 16
    
  3. PHP-FPM 可以考虑设置 pm.max_requests = 1,让 worker 处理完一个请求就重建,切断跨请求复用。这会有性能代价,适合作为短期应急。
  4. 不需要上传的路径,直接拒绝 multipart。在 Yeap CDN 控制台的 防火墙 → 自定义规则 里,按“请求方法 = POST”、“请求头 Content-Type 包含 multipart/form-data”和路径组合一条拦截规则,只给真正的上传接口放行。
  5. 给 POST 加速率限制,减缓扫描和反复试探。

检查自己的环境:

php -v
php -i | grep -E "session.upload_progress.enabled|fatal_error_backtraces"

注意 CLI 和 Web 用的可能是不同的 php.ini,最可靠的办法是在站点里临时放一个 phpinfo() 页面查看,看完立即删除。

用 Yeap CDN + WAF 守住 PHP 站点

PHP2Shell 不会是最后一个 PHP 高危漏洞。从公告发布到每台服务器都打完补丁,中间总有一段窗口期,而攻击者的扫描往往在公告后几小时内就开始了。把站点放到 Yeap CDN 后面,这段窗口期由我们在边缘替你守着:

  • 托管规则持续更新:OWASP CRS v4 全量规则,覆盖 SQL 注入、XSS、远程命令执行、PHP 注入、Webshell 等 14 个分类,按分类开关,不用逐条调规则;上游发布新版本后自动构建、灰度、全量。
  • 高危漏洞虚拟补丁:像这次一样,公告当天在边缘上线针对性规则,源站零改动。
  • 隐藏源站:攻击者只能接触边缘节点,配合源站只放行 CDN 回源,可以把直连攻击面降到最低。
  • 自定义规则与速率限制:按 IP、国家、路径、请求头、方法组合规则,拦截、质询或限速。
  • 免费 HTTPS 与全球加速:自动签发和续期证书,多地域边缘节点就近响应。

接入只需要几分钟:添加域名、把 DNS 记录指向 Yeap CDN 给出的 CNAME、在域名的 WAF 设置里开启防护即可。具体步骤可以参考 10 分钟把网站接入 Yeap CDN 并开启免费 HTTPS,产品详情见 Yeap CDN 和 安全防护。

OWASP CRS 托管规则引擎正在按域名逐步开启。如果你希望站点立即获得这组 PHP2Shell 虚拟补丁,在控制台提交一张工单,我们会为你的域名开启。

参考资料

在 Yeap Cloud 上构建

新用户即享 DNS 与 CDN 免费套餐。

免费注册