PHP2Shell:一次内存错误,怎样变成远程执行?Kris Gale

Report

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

Text version

PHP2Shell:一次内存错误,怎样变成远程执行?

SECURITY EXPLAINED01 / 16

PHP2Shell

一次内存错误

怎样变成远程执行?

PHPREQUEST ENGINE

9.2CVSS v4.0 · 严重

2026.10.21 公开修复

CVE-2026-109618

CVE-2026-109619

来源:PHP 官方安全公告 ↗

01 / THE REQUEST02 / 16

业务代码之前,

PHP 已经在工作

HTTP 请求来自网络

↓PHP 请求启动输入解析 · 内部状态

↓业务脚本你的应用逻辑

↓请求清理释放本次请求的内存

来源:PHP 官方安全公告 ↗

02 / THE MEMORY MODEL03 / 16

请求结束了,

工作进程还活着

WORKER · 持续存活

请求 A→请求 B

全局状态 G↘请求内存

先清引用→再释放

长寿命的引用,

不能指着已结束的请求。

来源:CVE-2026-109619 官方技术公告 ↗

03 / CVE-2026-10961804 / 16

初始化做了一半,

突然跳出去

REQUEST STATE

已初始化已初始化未完成未完成

OOM内存分配失败

继续初始化longjmp() ↘进入清理路径

结构已可访问,初始化却被打断。

来源:CVE-2026-109618 官方技术公告 ↗

04 / WHY LIMITS ARE NOT ENOUGH05 / 16

传输的大小,

不等于内存开销

HTTP 数据

传输体积

⇣

结构数组字符串元数据索引状态

解析会展开数据。

示意图不表示固定的放大倍数。

来源:CVE-2026-109618 官方技术公告 ↗

05 / CLEANUP IS CODE TOO06 / 16

出错后的清理,

仍然会读内存

半初始化状态本来不该被当成有效对象

↓清理逻辑读取它读取 · 分支 · 释放

↓内存损坏严重时可演变为代码执行

影响取决于构建、扩展与内存布局。

来源:CVE-2026-109618 官方技术公告 ↗

06 / CVE-2026-10961907 / 16

内存已经释放,

引用却留了下来

请求 A留下内部状态

结束内存释放 · 引用残留

请求 B初始化前读取旧状态

USE AFTER FREE同一个工作进程跨请求复用

来源:CVE-2026-109619 官方技术公告 ↗

07 / TWO CONFIRMED PATHS08 / 16

哪些状态,

可能留到下一次?

ERROR STATE致命错误回溯

PHP 8.5 的

请求级回溯状态

SESSION STATE上传进度

早于常规初始化的

会话处理

每条路径仍有各自的触发条件。

来源:CVE-2026-109619 官方技术公告 ↗

08 / FROM STALE TO DANGEROUS09 / 16

同一个位置,

已经换了内容

旧引用 G ─────────┐

原来的请求对象已释放

同一内存区域新的数据

仍被当成旧对象读取 ↗

信息泄露内存损坏 / RCE

房卡是原理类比,不是利用步骤。

来源:Wiz 原始研究 ↗

09 / TWO FAILURE WINDOWS10 / 16

两种错误,

两段危险时间

01还没准备好109618 · OOM 状态损坏初始化 ━ ✕ ━ 清理

02早已不再有效109619 · 遗留全局状态释放 ━ ✕ ━ 下次使用

来源:PHP 官方安全公告 ↗

10 / EXPOSURE ≠ SAME EXPLOIT11 / 16

运行方式不同,

风险路径也不同

Apache mod_php已验证存在业务代码执行前的路径

PHP-FPM有条件会话路径已验证;依赖应用操作

其他 Web 运行方式按官方与供应商公告评估

“路径不同”不等于“无需更新”。

来源:CVE-2026-109619 官方技术公告 ↗

11 / WHAT THE PATCH CHANGES12 / 16

把安全边界,

放回生命周期里

A安全地退出

软 OOM → VM 安全点

硬 OOM → 立即结束进程

B彻底清理引用

请求结束时重置状态

不把失效指针留给下一次

来源:CVE-2026-109618 官方技术公告 ↗

12 / FIXED RELEASES13 / 16

更新的是 PHP,

不只是网站应用

PHP 8.28.2.35

PHP 8.38.3.36

PHP 8.48.4.27

PHP 8.58.5.12

或对应分支更新版本 / 厂商已回移补丁的包。

容器、主机、托管平台

都要确认实际 PHP 运行时。

来源:PHP 官方发布与下载 ↗

13 / TEMPORARY MITIGATIONS14 / 16

缓解措施,

都有覆盖边界

收紧暴露面入口访问控制 · 请求资源限制

阻断部分已知路径上传进度 · 8.5 致命错误回溯

仍需完整补丁隐藏错误信息不会清除失效状态

具体配置与重启要求,以官方公告为准。

来源:PHP 官方安全公告 ↗

14 / VERIFY THE RUNNING SYSTEM15 / 16

包更新了,

还要验证进程

01盘点主机 · 容器 · Web SAPI

02更新并重启确保旧 worker 退出

03验证与排查实际运行版本 · 错误与崩溃

验证线上服务,不能只看 php -v。

来源:PHP 官方安全公告 ↗

15 / TAKEAWAY & SOURCES16 / 16

异常结束,

也必须安全。

安全退出 · 清除失效状态

更新 → 重启 → 验证

01PHP 官方安全公告↗02CVE-2026-109618 官方技术公告↗03CVE-2026-109619 官方技术公告↗04Wiz 原始研究↗05PHP 官方发布与下载↗

核验日期:2026.10.22

图示为原理模型 · 以官方最新公告为准

来源:PHP 官方安全公告 ↗