PHP2Shell 漏洞深度解析:OOM 与陈旧状态如何酿成 9.2 分 RCE 危机

举报
yd_238727864 发表于 2026/10/22 13:00:51 2026/10/22
【摘要】 PHP2Shell 漏洞深度解析:OOM 与陈旧状态如何酿成 9.2 分 RCE 危机

PHP2Shell 漏洞深度解析:OOM 与陈旧状态如何酿成 9.2 分 RCE 危机

2026 年 10 月,PHP 生态遭遇了一场近年来最严重的安全地震。两个被统称为 PHP2Shell 的远程代码执行漏洞(CVE-2026-109618、CVE-2026-109619)被公开,CVSS 评分高达 9.2,影响范围覆盖 PHP 5.4 以来的几乎所有版本。更令人警觉的是,攻击者无需任何身份认证,仅凭一个精心构造的 HTTP 请求,就能在服务器上执行任意代码,且触发点位于业务代码运行之前。

本文将拆解这两个漏洞的底层原理,并给出切实可行的修复与排查建议。


一、漏洞全景:两个 CVE,同一种威胁

PHP 官方于 2026 年 10 月 21 日发布紧急安全更新,修复了以下两个漏洞:

CVE 编号 漏洞类型 核心机制 CVSS
CVE-2026-109618 内存损坏(OOM 路径) 内存耗尽时清理未初始化数据 9.2
CVE-2026-109619 释放后使用(UAF) 全局状态跨请求残留 9.2

修复版本为:PHP 8.5.12、8.4.27、8.3.36、8.2.35。PHP 8.1 及更早版本已停止官方支持,但安全团队为 7.4、8.0、8.1 提供了最小化源码补丁,需自行编译。

所有处理 Web 请求的部署形态均受影响:PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed。其中 mod_php 风险最高,因为攻击可在应用代码运行前触发,且已有稳定复现的利用链。


二、CVE-2026-109618:当“内存耗尽”变成攻击入口

正常情况下的 OOM 处理

PHP 在运行时会设置 memory_limit 作为安全阀。当脚本申请的内存超过该限制时,PHP 通过 longjmp() 直接跳出当前执行上下文,终止请求处理。这本是保护机制,但在特定时序下,它成了漏洞的起点。

漏洞的触发逻辑

关键在于时序错位。当 OOM 发生在请求内部数据结构尚未完全初始化的“窗口期”时,longjmp() 跳转后的清理流程会误将未初始化或部分初始化的数据当作有效数据处理。攻击者可以通过构造特殊的 multipart/form-data POST 请求——例如包含大量畸形请求头、嵌套字段名或空文件控件——在不超过 post_max_size 限制的前提下,精准触发 memory_limit 耗尽,从而制造内存损坏。

一旦内存损坏发生在 PHP 引擎的核心数据结构上,攻击者便可能劫持控制流,实现远程代码执行。PHP 官方公告确认,在 mod_php 默认配置下,未认证的远程代码执行已被完整演示。

为什么 mod_php 最危险

mod_php 将 PHP 解释器直接嵌入 Apache 进程。Apache 在请求关闭阶段会无条件执行 PHP 的清理流程,即使请求本身并未正常初始化。这意味着攻击者不需要“命中”任何应用逻辑,只需让 Apache 接收一个精心构造的请求,就能在 PHP 引擎层面触发漏洞。


三、CVE-2026-109619:跨请求的“幽灵状态”

工作进程复用的隐患

PHP-FPM 和 mod_php 都采用工作进程池模型。一个 worker 处理完请求后,不会销毁,而是重置状态、复用给下一个请求。这种设计提升了性能,但也要求所有请求相关的全局状态被彻底清理。

问题在于,某些全局状态(如错误处理、会话、对象和扩展状态)在内存释放后,指针并未被完全重置。当致命错误在错误的时间点发生时,这些“陈旧指针”仍然指向已被释放的内存区域。

两个请求完成利用

攻击者需要让两个请求先后落到同一个 worker上:

  1. 第一个请求:触发特定致命错误,使 worker 的全局状态残留指向已释放内存的指针。
  2. 第二个请求:在正常初始化流程重置状态之前,某段逻辑访问了该陈旧指针,造成释放后使用(Use-After-Free)。

官方确认,session.upload_progress 是其中一条可利用路径。攻击者可以通过操纵会话上传进度相关的请求,引导 PHP 在错误的时间点读取陈旧状态,最终实现信息泄露或代码执行。PHP 基金会公告指出,报告者已针对运行 mod_php 的真实应用演示了 RCE。


四、修复与排查:现在该做什么

立即升级(唯一彻底方案)

PHP 安全团队明确表示:不存在完全有效的缓解措施,升级是唯一安全的选择。

# 检查当前版本
php -v

# 目标版本
# PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。