互联网上的任何人都能像浏览器一样与你的 PHP 站点通信,无需密码。在最后一个受影响的 PHP 版本上,他们可以发送一个精心构造的文件上传请求,使引擎在仍在读取请求时(也就是在你的应用程序启动之前)耗尽内存。PHP 随后会带着只构建了一半的请求跳出该工作。PHP Group 已表明,对这种半构建状态的清理可能演变为以 Web worker 身份执行的远程代码执行。本实验在 Apache mod_php 8.4.26 上验证了该内存耗尽跳转,并验证 8.4.27 能干净地完成同一请求。
类别: OOM longjmp / 请求启动中止 可达性: 远程
PHP 8.4.26(php:8.4.26-apache)对比已修补的 8.4.27 - php.net
Apache mod_php 始终会执行请求关闭,即使请求启动失败也是如此。CVE-2026-109618 是在 rfc1867 解析期间、当某个 HashTable 桶已经处于可被拆除的可见状态时,因 memory_limit 触发的 longjmp()。本实验是一个分块的 multipart/form-data POST,没有可用的 Content-Length,并在 memory_limit=8M 下带有约 3000 个额外的 part 头。8.4.26 返回 Fatal error: Allowed memory size ... in Unknown on line 0。8.4.27 返回存活标记并运行 index.php。触发后的 worker GET 在双方仍然返回 200。以 Apache worker 身份执行的 RCE 是根据 GHSA 推断的。
| ID | CVE-2026-109618 |
| 公告 | GHSA-w8hw-w9fx-j79w |
| 类别 | OOM longjmp / 请求启动中止(RCE 为公告推断) |
| 可达性 | 远程(未认证 HTTP) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | 严重:9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H(PHP Group) |
| 产品 | PHP |
| 受影响 | PHP 8.2 低于 8.2.35、8.3 低于 8.3.36、8.4 低于 8.4.27、8.5 低于 8.5.12(实验固定 8.4.26) |
| 已修复 | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12(2026 年 10 月 21 日) |
| 认证 | 无 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
同类问题:CVE-2026-109619 陈旧 worker 全局 UAF(PHP2Shell 配对)。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
未认证的 POST multipart/form-data,带 Transfer-Encoding: chunked、大量额外 part 头、有限的 memory_limit | rfc1867 解析 / php_request_startup 期间 zend_bailout longjmp | 可用性(实验已证): 在 8.4.26 上于 index.php 之前中止请求启动(Unknown on line 0)。完整性(推断): 关闭流程遍历半初始化的 $_POST/$_FILES;厂商展示了以 Apache worker 身份执行的 RCE(官方镜像中为 www-data)。侦察(推断): 残留请求堆信息泄露。 |
| 在 8.4.27 上触发相同条件 | 延迟的软 OOM | 已关闭(实验已证): HTTP 200 存活标记,files=1,worker 保持运行。 |
| 触发后的 GET | worker 仍然存活 | 实验已证: 此固定版本未发生 SIGSEGV,也未记录 zend_mm_heap corrupted。 |
登录、应用路由、自定义 .so、反向 shell | 不适用 | 已关闭。未尝试 RIP 控制。 |
实验已证 vs 推断: 8.4.26 与 8.4.27 的 OOM-longjmp 差异是实验已证的。worker 死亡 UAF 和 RCE 是根据 GHSA-w8hw-w9fx-j79w 推断的。FPM 通常在启动失败时退出子进程;厂商未针对此 CVE 展示完整的 FPM 利用。
要求: Apache apache2handler。有限的 memory_limit(不要设为 -1;那正是缓解措施)。启用 multipart 解析。官方 php:8.4.26-apache 对比 php:8.4.27-apache。
python3 php-oom-longjmp-Abraxas-Labs.py
或 cd lab && ./run.sh。回环地址 127.0.0.1:18220(8.4.26)对比 127.0.0.1:18221(8.4.27)。Compose 项目 cve-2026-109618。见证 CVE-2026-109618-OOM-WITNESS。最后一行:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
仅限授权实验室。它通过回环地址通信。
更新至 PHP 8.4.27(或 8.2.35 / 8.3.36 / 8.5.12)。该补丁将 OOM 的 longjmp() 替换为在下一个 VM 安全点延迟触发的软 OOM,并在超过更高阈值时执行硬 _exit()(31c0ea7)。在此之前:管理员设置 memory_limit=-1,且应用程序无法覆盖;保持 post_max_size 较低;限制 multipart 部件和标头数量。不要使用 RLIMIT_AS 或 RLIMIT_DATA。
Abraxas Labs [email protected]