PHP 8.5.12修复CVE-2026-109618和CVE-2026-109619两个内核级远程代码执行漏洞,源于OOM状态残留与全局状态重置缺陷,不涉及反序列化漏洞;后者需代码层主动防御。

PHP 8.5.12 并不修复反序列化漏洞。它修复的是两个内核级远程代码执行漏洞(CVE-2026-109618 和 CVE-2026-109619),与 unserialize() 无关。反序列化漏洞是应用层问题,不是 PHP 版本升级能“顺带解决”的。
为什么有人误以为 8.5.12 修复了反序列化漏洞
混淆主要来自三方面:
- 时间巧合:安全公告和大量反序列化文章在同时间段密集发布,容易被混为一谈
- 关键词重叠:“RCE”“远程代码执行”让人本能联想到反序列化利用结果
- 传播失真:部分非技术渠道将“PHP 修复 RCE 漏洞”简化为“PHP 修复所有 RCE 类型”,忽略了漏洞根因差异
PHP 8.5.12 实际修复的是什么
它解决的是 PHP 运行时内核中两类内存生命周期缺陷:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
CVE-2026-109618:OOM(内存耗尽)中断导致请求状态半初始化,清理阶段误读无效内存 -
CVE-2026-109619:全局状态未正确重置,同一 worker 进程处理后续请求时发生 Use-After-Free - 两者都发生在
unserialize()调用之前——甚至在任何 PHP 应用代码运行前就可能触发 - 影响所有运行模式:
mod_php、php-fpm、php-cgi、FrankenPHP
反序列化漏洞该怎么真正防御
必须在代码和架构层面主动控制,不能依赖 PHP 版本更新:
立即学习“PHP免费学习笔记(深入)”;
- 禁用
unserialize()处理外部输入:把unserialize($_GET['data'])改成json_decode($_GET['data'], true)(前提是数据源可控且格式可改) - 启用白名单机制:PHP 7.4+ 支持
unserialize($data, ['allowed_classes' => ['SafeClass']]),传入空数组可完全禁止对象反序列化 - 避免敏感魔术方法暴露:检查
__wakeup()、__destruct()、__toString()是否调用system()、file_get_contents()等危险函数 - 会话/缓存场景特别小心:如果把用户可控数据写入
$_SESSION或 Redis,再通过unserialize()读取,就是高危路径
真正麻烦的点在于:反序列化漏洞往往藏在老系统第三方库或自定义序列化逻辑里,比如某些 CMS 的插件配置、旧版 Session 处理器、或自研的缓存反序列化解析器。这些地方不会因为升级到 8.5.12 就自动变安全——得一行行代码审计,而不是等版本号跳变。


















