CVE-2026-109618 / CVE-2026-109619 audit: session poisoning to command execution reproduced; BGCTX OOM precondition reproduced; claimed progress-array UAF not reproduced on stock builds.
对“php2shell”主张的审计,外加一个可用的本地 PoC。
English · PHP 8.5.4 · 仅限 lab
MITRE:
CVE_RECORD_DNE· NVD:无记录 · php.net:仅预告。 本仓库只审计技术主张,不认定编号。
| 问题 | 答案 |
|---|---|
| 能拿到 shell 吗? | ✅ 能(本地),前提是有 unserialize() 入口 + __destruct gadget |
| 这是 CVE 本体吗? | ⚠️ 大概率不是——CVE 更像 BG 上下文孤儿(08) |
| 预认证吗? | ❌ 预认证那条在我们测试里只到 ARM / 崩溃 |
| 泄露稿讲对了吗? | ❌ post_bytes_processed UAF 复现不出来 |
multipart POST ──► php_hash_environment() ← 早于 RINIT
│
├─ serialize 编码 ──► OOM ──► BG(serialize) 孤儿(64B)
└─ unserialize 解码 ──► OOM ──► BG(unserialize) 孤儿(8208B)
│
▼
SAPI 是否存活? ── 是 ──► 下一请求复用已释放上下文
│ │
否 ├─ Bug S:崩溃 / 泄漏
▼ └─ Bug U:RCE 类
只能 DoS
我们 PoC 用的另一条 bug:
var_destroy() ──► 释放 back-ref 块 ──► 遍历 dtor(无 serialize_lock)
└─ __destruct ──► 重入 unserialize ──► R:N 读已释放块
└─ 伪造 closure ──► zif_system(cmd)
php exploit/var_destroy_uaf_rce.php "id > /tmp/proof"
cat /tmp/proof # uid=... gid=...
需要:有漏洞的 PHP(8.5.4 已验证)· 目标对攻击者数据调用 unserialize() ·
存在 __destruct 类 · Linux /proc/self/mem · 按构建用 nm 取偏移。
| 主张 | 结果 |
|---|---|
泄露稿:post_bytes_processed UAF | ❌ 未复现(Z_TRY_ADDREF) |
Bug S —— BG(serialize) 孤儿 | ⚠️ ASAN 下 UAF 3/3 · ARM 已复现 · 无 RCE |
Bug U —— BG(unserialize) 孤儿 | ⚠️ ARM 已复现 · kill / system 未复现 |
| var_destroy UAF → RCE | ✅ 可用,10/10,自定位 |
Session 投毒 → include | ✅ 已复现(既有技术) |
Handler mismatch → __destruct | ✅ 已复现(需 gadget 类) |
| 演示工具二进制偏移 | ✅ 与 8.5.4-0ubuntu1.3 吻合(delta 0xbe3f0) |
| 路径 | 内容 |
|---|---|
exploit/var_destroy_uaf_rce.php | 自定位 UAF → RCE PoC |
analysis/01-05 | 生命周期 · 消融 · 版本 · 泄露包 · 可达性 |
analysis/06 | BG(serialize) 路径 + ASAN 收据 |
analysis/07 | session 投毒 → 命令执行 |
analysis/08 | BG 上下文孤儿(reup 包) |
analysis/09 | var_destroy UAF → RCE(偏移、自定位) |
evidence/ | ASAN 栈 · OOM 日志 · 二进制偏移 · 运行记录 |
lab/ | 构建脚本 · 触发器 · 矩阵 · 消融 |
PROVENANCE.md | 材料 URL · 时间 · 哈希 |
本地构建、本地 Apache / php-fpm / Docker lab,以及点名的 Ubuntu 包。 PoC 以 PHP 进程用户执行;gadget 前置条件真实存在。