· adswds-team · 安全  · 7 min read

PHP 内存耗尽可打成未授权 RCE:CVE-2026-109618,先升再谈缓解

PHP 官方 2026-10-21:CVE-2026-109618(CVSS 4.0 9.2)让 OOM 打断未完成的请求初始化,mod_php 上已演示未授权 RCE。修复版本 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35。

PHP 官方 2026-10-21:CVE-2026-109618(CVSS 4.0 9.2)让 OOM 打断未完成的请求初始化,mod_php 上已演示未授权 RCE。修复版本 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35。

据 PHP 官方安全公告(2026-10-21)与 GHSA-w8hw-w9fx-j79w,CVE-2026-109618 是 PHP 核心里的严重远程代码执行:内存耗尽(OOM)用 longjmp() 提前退出时,请求内存可能只初始化了一半,随后的请求清理会把这份无效状态当成有效数据。公告写明:风险覆盖对外提供 Web 请求的安装,包括 PHP-FPM、Apache mod_php、php-cgi、FrankenPHP 与 LiteSpeed;其中 mod_php 风险最高,已有演示——未授权请求能在任何应用代码运行之前触发。

一句话:落地页还没执行你的 PHP,运行时自己就可能先被打穿。

同日还有独立的 CVE-2026-109619(过期全局状态)。两枚都要修,配置缓解互不替代。


一、公告里已确认的事实

项内容
编号CVE-2026-109618 / GHSA-w8hw-w9fx-j79w
评级Critical,CVSS 4.0 为 9.2(AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H)
受影响8.2.35、8.3.36、8.4.27、8.5.12 之前的对应分支
修复版本8.2.35、8.3.36、8.4.27、8.5.12
已确认影响以 Web 工作进程账户执行的未授权 RCE
已验证场景默认输入与内存限制、常见 prefork、多 worker 的 mod_php,经 HTTP 完成 RCE
FPM源码分析认为仍可能受影响;尚未演示完整的 FPM 利用。请求启动失败时 FPM 会退出子进程,从而避免消费那份无效状态
FrankenPHP与 mod_php 类似会无条件做请求清理,公告认为很可能受与应用无关的攻击
LSAPI模型接近 FPM;与应用相关的利用「可能但未验证」

oss-security 邮件(Jakub Zelenka,PHP 安全团队)与 GitHub Advisory 一致:失败的分配不必和那块无效内存有关;多种 OOM 路径都能稳定走到这个条件。英国 NCSC 已呼吁立即处理 CVE-2026-109618 与 CVE-2026-109619。

官方还说明了若干能在「看起来没超过 post_max_size」时把内存打满的 multipart 路径(无可用 Content-Length、部件头数量、不计入 max_file_uploads 的空文件控件、嵌套字段名)。本文不复述构造步骤。对运维有用的结论是:只在反代上卡一个看起来很小的 body 上限,并不自动等于 PHP 内存上限也守住了。


二、版本怎么对

  • 在跑 8.5.0–8.5.11、8.4.0–8.4.26、8.3.0–8.3.35、8.2.0–8.2.34 的,升到本分支修复版。AWS 安全公告 2026-143 用的就是这组边界。
  • PHP 8.1 及更旧不再从 PHP 项目收常规更新。公告称安全团队为从源码构建、又拿不到发行版 LTS 的人提供了 7.4 / 8.0 / 8.1 的最小源码 backport;发行版是否带上,要问供应商。
  • 8.2 在 2026-12-31 结束生命(见 8.2.35 发布说明),这次补丁之后不会再有安全更新。
  • 依赖志愿者仓库 rpms.remirepo.net 的,公告当天明确说当天不会有包,建议改发行版包或自行从源码构建。

补丁本身的做法(Advisory):OOM 不再 longjmp() 冲出未记账的上下文,改为在下一个 VM 安全点做延迟的软 OOM,并在更高阈值用 _exit() 做硬 OOM。


三、暂时升不了时,官方怎么说

公告写明:只有升级才是完整修复。 下面只降低特定路径的暴露。

  • memory_limit=-1,用 FPM 池或 Apache 的 php_admin_value 锁死,确认没有池、目录或应用把有限值设回去。这去掉「可预期的 PHP 内存上限」这条已确认利用条件,底层 mmap() 失败仍可能走进原路径。
  • 不靠上传的应用:post_max_size = 8M;需要上传:post_max_size = 32M,且 upload_max_filesize 低于它。
  • 在 Web 服务器或反代上限制解码后的请求大小、字段数、multipart 部件数、头部数和嵌套深度;没有可用 Content-Length 的请求也要覆盖。
  • 容器可用 cgroup memory.max 当可用性边界,最好只杀掉出问题的 worker。不要用 RLIMIT_AS / RLIMIT_DATA,它们会在触顶时让分配失败,正好走到有漏洞的 longjmp()。
  • 同时做 CVE-2026-109619 的缓解,Advisory 明确要求两边一起看。

四、和落地页主机的关系

广告落地若在客户自己的 PHP 主机上出页,暴露面就是这台机器的 PHP,而不是页面 HTML 写得紧不紧。官方 PHP 包的常见档是 PHP 8.3,对应修复版本是 8.3.36。mod_php 上问题发生在应用代码之前,意味着「业务里没有危险函数」不能当成没风险。

FPM 尚未有完整利用演示,不等于池子可以留在 8.3.35。同一 worker 上还有另一枚已在 FPM 验证会话路径的 RCE,见同日那篇。

边缘判定把访客规则放在请求进业务之前,挡不住 PHP 运行时在解析请求体时自己出错。先把解释器升到修复版,再谈规则。


五、小结

CVE-2026-109618 是 2026-10-21 两枚严重 PHP RCE 里、mod_php 已完成未授权演示的那一枚。修复版本是 8.5.12、8.4.27、8.3.36、8.2.35。配置项只能收窄路径。落地页、跟踪跳转和后台若还在这些分支的旧小版本上,按主机而不是按站点排期升级。

相关阅读:过期全局状态 RCE、9 月 FPM IPv6 ACL。

来源:PHP 新闻归档、GHSA-w8hw-w9fx-j79w、oss-security、NCSC。

相关文章

查看全部 »

同标签更多