CVE-2026-109618 (PHP2Shell) 漏洞深度复现与修复验证
字数 1723
更新时间 2026-10-25 20:23:34

CVE-2026-109618 (PHP2Shell) 漏洞深度复现与修复验证

一句话结论:PHP 内核在内存耗尽(OOM)异常清理路径上把未完全初始化的内部请求数据误判为有效数据,导致堆内存破坏,远程未认证攻击者可借恶意 multipart/form-data 请求实现 RCE(CVSS 9.2);防御要点是升级到修复版本、临时关闭上传进度监控、并围绕段错误与异常子进程建立检测。

排版说明:本文基于先知社区公开复现报告整理,已移除可直接照抄的利用实现细节(专用 PoC 脚本、堆地址与函数偏移、四阶段利用链操作参数),仅保留漏洞成因、影响面、修复与检测建议,供防御与排查使用。

漏洞概况

  • 编号 CVE-2026-109618,社区命名 PHP2Shell,CVSS 9.2。
  • 影响 PHP 5.4 至 8.5.11 全系列版本,覆盖面极广。
  • 触发无需任何权限,仅需构造恶意 multipart/form-data 格式的 HTTP 请求,属于纯 HTTP 流量攻击,无文件上传、无高危端口联动,行为隐蔽。
  • 利用链最终可绕过 ASLR 达成远程代码执行,以 Web 服务运行用户(如 www-data)身份执行命令;社区已出现批量扫描与利用。

成因链解析

  1. 前提条件:PHP 进程进入内存耗尽(OOM)异常场景。配置中 memory_limit 被压得较低时更容易触发,这也是复现环境将内存上限设为极小值的原因——生产环境正常配置下触发概率显著降低。
  2. 内核缺陷:OOM 异常发生后的清理阶段,内核将「未完全初始化」的内部请求数据误判为「有效」数据继续处理。这是典型的异常路径边界处理不完整:正常路径有合法性校验,清理路径没有对齐同一套校验。
  3. 后果:误判数据进入后续处理造成堆内存破坏。攻击者通过精心构造的请求配合堆喷射影响堆布局,把破坏转化为可控的代码执行。
  4. 本质归类:异常处理逻辑缺陷引发的内存破坏(CWE 层面接近未初始化内存使用与释放后使用的混合形态),而非某个解析器的输入校验遗漏。

修复版本与验证结论

  • 官方修复版本:8.4.27、8.3.36、8.2.51 及以上稳定版。
  • 复现报告的补丁验证结论:对升级后的环境以同样请求复测,利用在最初的堆内存泄露环节即失败,说明补丁从底层修正了内存初始化判断,整条利用链被截断——修复点位于成因处而非某一步利用手法处,属于根治型补丁。

临时缓解(无法立即升级时)

在 php.ini 中关闭上传进度监控功能,阻断触发入口:

session.upload_progress.enabled = Off

修改后重启 PHP-FPM 或 Apache 使配置生效。该开关对应的请求处理路径正是漏洞入口,关闭后可显著降低暴露面,但不能替代版本升级。

检测与监控建议

  • 进程层:监控 PHP 服务进程的 SIGSEGV 段错误与异常崩溃重启——该漏洞的触发前提是制造 OOM 与内存破坏,崩溃是其最显眼的外部特征。
  • 行为层:审计 Web 进程派生的子进程,非预期出现的 sh、bash 等命令行子进程是 RCE 成功的高置信度信号。
  • 流量层:关注异常构造的 multipart/form-data 请求——超大分段、畸形边界、高频重试且每次都恰好触发 worker 崩溃的组合值得告警。
  • 配置层:排查线上所有 PHP 实例的实际版本与 memory_limit 取值,禁止生产环境配置极小内存上限,减少 OOM 触发概率;版本排查应覆盖容器镜像,避免「宿主机已升级、镜像仍是旧版」的漂移。

复现环境的通用教训(防御视角)

原报告总结了几个复现失败原因,对安全测试与补丁验证同样适用:

  • 偏移量与编译版本强绑定:同一漏洞在不同小版本的内存布局不同,任何针对特定版本的测试结论不能直接外推到相邻版本,验证必须锁定精确版本号。
  • 时序敏感:依赖堆布局的攻击对毫秒级延迟敏感,代理抓包等中间环节会改变结果,测试环境与观测环境应当分离。
  • 环境残留:反复更换镜像与端口后,旧容器状态会干扰新环境,验证前应彻底销毁重建,避免把环境问题误判成修复有效或无效。

参考对象

  • PHP 官方安全公告及 8.4.27 / 8.3.36 / 8.2.51 变更记录
  • 先知社区原始复现报告(news/93027)
相似文章
相似文章
小程序二维码
 全屏