php2shell:PHP 自身的两个 RCEKris Gale

Report

This page runs in an isolated sandbox because it contains scripts.

Text version

php2shell:PHP 自身的两个 RCE

PHP 核心 · 2026.10.21

PHP 自身,被攻破了

两个 RCE,CVSS 9.2。登录之前,代码先跑。

漏洞不在应用,

在语言本身。

两个 CVE · CVSS v4.0

9.2

同一评分。10 月 21 日,PHP 紧急发布修复版。

共同模式

失败时,清理被跳过了

分配失败,longjmp 直接跳出

请求结束,残缺状态没人收拾

下一个使用者,把它当成有效数据

请求的一生

洞,在应用代码之前

解析 multipart 与请求初始化,都发生在脚本运行之前。

内存耗尽,

善后做了一半。

CVE-2026-109618 · OOM → RCE

从崩溃到执行

撑破内存超大字段名进入 $_POST 哈希表

跳过初始化longjmp 逃出,桶只写了一半

shutdown 收尸把残缺桶当成正常数组销毁

伪造析构堆排布让 pDestructor 指向 system()

CVE-2026-109618 · 触发器

绕过 post_max_size

单个 part 的头数量没有上限

空文件字段不占 max_file_uploads

只检查声明的 Content-Length,chunked 可绕过

CVE-2026-109618

0行

mod_php 在脚本启动前已 shutdown;业务代码未执行。

CVE-2026-109619

上一个请求的尸体,

被下一个请求踩到

worker 的全局指针仍指向已释放的请求内存。

CVE-2026-109619 · 跨请求

幽灵如何活过一次请求

错误发生致命错误或 OOM,跳过重置

请求释放内存释放,指针悬空

下个请求同一 worker 在 RINIT 前读取

无脚本入口session.upload_progress 无需 session_start()

谁最危险

mod_php 风险最高

mod_php总会 shutdown;已演示未认证 RCE

PHP-FPM失败即回收;upload_progress 可利用

影响范围

5.4起

多份分析称直到 8.5.11。修复版:8.2.35、8.3.36、8.4.27、8.5.12。

一个弄脏这次,

一个毒害下次。

补丁做了什么

换一种失败方式

软失败OOM 延迟到 VM 安全点

硬退出仍不安全就直接 _exit()

不再返回longjmp 不带着残缺状态继续

在打补丁之前

先关掉两条路径

session.upload_progress.enabled = 0

PHP 8.5:fatal_error_backtraces = 0

重启所有 worker;补丁才是彻底修复

记住

别让失败,

留下可用残骸。

升级 PHP,然后重启每一个 worker。