致命错误回溯中的释放后使用
EG(last_fatal_error_backtrace) 在销毁请求堆的 OOM 之后仍然存在。下一个请求中较早的诊断逻辑会沿着这个悬空指针访问。演示中最强的情形:开启 fatal_error_backtraces 的 PHP 8.5,在 mod_php 上实现 RCE。
CVE-2026-109619 · GHSA-6wmf-4rv5-p3rp
PHP2Shell 中“跨请求”的那一半:发生致命错误后,PHP 会留下指向已释放内存的全局指针。同一 worker 的下一个请求会使用它们——导致内存泄露,或让攻击者执行代码。
最后核实 2026-10-22
严重程度
认证
修复版本
所属
致命错误(包括 OOM)可能跳过每个请求结束时的重置,导致错误、会话、对象或扩展相关的全局状态仍指向请求结束时已释放的内存。同一 worker 上的下一个请求可能在正常初始化之前使用这块已释放的内存。
影响: 释放后使用(UAF),可导致 worker 内存泄露或代码执行。 已演示: 已在 WordPress 和 Drupal 上演示认证前 RCE;还演示了与应用无关的远程内存泄露。
PHP 会把一部分状态放在请求级全局变量中——错误、会话、对象和扩展状态。正常情况下它们会在每个请求结束时重置。但致命错误(包括内存耗尽)可能跳过这次重置,关闭阶段的警告也可能在清空之后再次写入错误状态。
这些全局变量指向的内存会在请求结束时被释放。如果同一个 worker 随后在正常请求初始化之前运行代码——比如 INI 诊断或会话上传进度处理——就会使用已释放的内存。连续处理大量请求的 worker(PHP-FPM、mod_php 子进程)正是让这个漏洞可被触达的原因。
致命错误回溯中的释放后使用
EG(last_fatal_error_backtrace) 在销毁请求堆的 OOM 之后仍然存在。下一个请求中较早的诊断逻辑会沿着这个悬空指针访问。演示中最强的情形:开启 fatal_error_backtraces 的 PHP 8.5,在 mod_php 上实现 RCE。
会话上传进度的生命周期
被中断请求遗留的会话状态,会被下一个请求的上传进度处理使用。已在 mod_php 和 PHP-FPM 上验证 RCE。
OPcache 共享内存中的类型混淆
在推进 CG(map_ptr_last) 与发布共享边界之间发生内存分配失败,会留下各 worker 认知不一致的槽位,使某个 worker 把槽位复用于另一种对象类型。
其他请求级状态
公告指出对象和扩展相关的状态在特定条件下可被利用。补丁修复的是整个模式,而不仅是这几条路径。
PHP 官方公告和 Wiz 的文章对部分路径的归类不同。补丁修复的是共同的故障模式,所以归类方式不影响你需要做的事。
| 分支 | 存在漏洞 | 修复版本 |
|---|---|---|
| 8.5 | < 8.5.12 | 8.5.12 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.1 · 8.0 · 7.4 | 全部 | 仅源码回移植 |
| 5.4 – 7.3 | 全部 | 无修复 |
| 部署方式 | …109619 | 说明 |
|---|---|---|
| Apache + mod_php | 已证实 RCE | 两个 CVE 均已在默认限制下验证可达 RCE。风险最高的部署方式。 |
| PHP-FPM(nginx、Apache、Caddy……) | 已证实 RCE | 已在 FPM 上验证通过会话生命周期实现 RCE;OOM 路径已通过应用层代码路径证实,但尚无公开的通用 FPM 利用。 |
| FrankenPHP / LiteSpeed LSAPI | 很可能受影响 | 公告评估为很可能受影响。常驻 worker 只会让跨请求残留状态的问题更突出。 |
| CLI(cron、队列 worker、artisan) | 公告未涉及 | 公告未讨论,正常使用时也无法通过 HTTP 请求触达。但仍要升级——它们来自同一个软件包。 |
向量: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
| 指标 | 在本漏洞中的含义 | 对分数的影响 |
|---|---|---|
AV:N Attack Vector: Network(网络) | 通过互联网发送普通 HTTP 请求即可触达。 | 拉高分数 |
AC:H Attack Complexity: High(高) | 利用必须针对每个目标的内存布局调整,不是复制粘贴一个请求就能成功。 | 拉低分数 |
AT:P Attack Requirements: Present(存在前提) | 能否成功取决于攻击者无法控制的部署条件(SAPI、内存限制、worker 复用)。 | 拉低分数 |
PR:N Privileges Required: None(无) | 不需要账号,不需要登录。 | 拉高分数 |
UI:N User Interaction: None(无) | 不需要任何人点击任何东西。 | 拉高分数 |
VC:H / VI:H / VA:H 对漏洞系统的影响:High(高) | PHP 服务器的机密性、完整性和可用性全部失守。 | 拉高分数 |
SC:N / SI:N / SA:N 对后续系统的影响:None(无) | 评分不计入横向移动到其他系统——但实际中被窃取的凭据往往能做到这一点。 | 拉低分数 |
修复方法是升级 PHP
安装已修复版本并重启所有 PHP worker。修复指南 →
如果无法立即升级,php.net 列出了以下部分缓解措施:
session.upload_progress.enabled = 0,然后重启所有 worker。详情 →fatal_error_backtraces = 0 并重启。这只能挡住已证实的回溯路径。error_reporting、display_errors 或 @ 隐藏它们没有用。pm.max_requests = 1。能。跨请求的释放后使用可以泄露 worker 内存——其他用户的密码、API 密钥、会话令牌——而攻击者全程无需执行代码,因此更难被发现。
只能部分缓解。它能挡住已证实的会话路径,但挡不住其他变种,而且只有在 php.ini、FPM 池或服务器配置中设置(不能用 .user.ini 或 ini_set())并重启所有 worker 后才有效。
受影响。会话生命周期 RCE 已在 mod_php 和 PHP-FPM 上都得到验证。FPM worker 会连续处理大量请求,这正是跨请求残留状态所需要的条件。
它能缩短被破坏状态的存活时间,设为 pm.max_requests = 1 则完全不复用 worker,但性能代价很大。对只需要一个请求的攻击路径无效。