cve-2026-109619是跨请求use-after-free漏洞,因oom导致请求清理跳过,使session等全局状态残留悬垂指针;后续请求复用该状态,访问已释放内存,实现无需认证的远程代码执行。

CVE-2026-109619 所指的“跨请求 UAF”(Use-After-Free),核心是 PHP 工作进程在处理完一个请求后,本该释放或重置的内存和全局状态,却因异常中断而残留下来;下一个正常请求进来时,PHP 内部逻辑错误地复用了这些已失效的指针,导致读写已被释放的内存区域。
为什么叫“跨请求”?
PHP 通常以多进程/多线程方式运行(如 Apache mod_php、PHP-FPM)。每个工作进程会连续处理多个 HTTP 请求。按设计,每个请求结束时,所有临时资源(包括 session 全局变量、上传进度结构体、堆内存块等)都应被彻底清理。但 CVE-2026-109619 的触发前提是:上一个请求在解析 multipart 表单过程中发生 OOM 致命错误,导致清理流程被跳过。此时,进程仍在运行,但部分关键结构(如 PS(http_session_vars) 和 PS(id))仍指向一块已被释放的请求堆内存。
攻击者紧接着发送第二个请求(无需登录、无需文件上传,只需携带相同的 Session ID 和 PHP_SESSION_UPLOAD_PROGRESS 字段),PHP 就会在清理路径中尝试“析构”那个早已不存在的内存块——这就是典型的跨请求 UAF。
关键依赖点:session.upload_progress 功能
这个漏洞不是通用内存泄漏,而是绑定在特定机制上的:
- 该功能默认开启(
session.upload_progress.enabled = On) - 它会在请求解析阶段就提前初始化 session 全局状态,早于常规模块激活流程
- OOM 发生时,
request_shutdown钩子不执行,但进程未退出,悬垂指针持续存在 - 后续请求触发相同清理路径,就会访问非法地址
实际影响不是“偶尔崩溃”,而是可控利用
攻击者通过精心构造两个请求的时间差与内存布局,可稳定实现:
- 远程读取进程内存中的敏感数据(如数据库密码、JWT 密钥、API token)
- 覆盖关键函数指针或 zval 类型字段,最终达成任意代码执行
- 整个过程不需要用户登录、不依赖业务代码缺陷、不经过任何应用层过滤
为什么老版本无法修复?
该问题根植于 PHP 引擎对“请求生命周期”与“全局状态管理”的耦合设计。补丁需重构错误处理路径中的资源释放顺序与状态重置逻辑。PHP 官方只对仍在维护的版本(8.2.35+、8.3.36+、8.4.27+、8.5.12+)提供了安全更新;PHP 5.x、7.x 及 8.0/8.1 等已 EOL 版本无官方补丁,只能靠缓解措施隔离风险。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











