PHP 8.5.11 存在未修复的原生内存破坏漏洞(如CVE-2026-109618),触发于php_request_startup阶段、无需unserialize()调用,而业务反序列化漏洞需显式调用unserialize()且输入为可控PHP序列化字符串。

PHP 8.5.11 本身不包含已知原生反序列化漏洞。根据官方修复记录,PHP 8.5.12 是首个修复 CVE-2026-109618/109619 等内核级 UAF 漏洞的版本,因此 8.5.11 属于“存在风险但尚未修复”的临界版本——它有原生漏洞,但不是“被公开利用的已知原生反序列化漏洞”,而是更底层的内存破坏类漏洞(如 upload-progress unserializer UAF),不通过 unserialize() 函数触发,也不依赖用户传入序列化字符串。
看触发位置:是否绕过应用代码
原生漏洞(如 CVE-2026-109618)在 php_request_startup() 阶段、用户 PHP 代码执行前 就已触发。典型路径是:恶意 multipart 请求 → Apache/mod_php 早期解析 RFC1867 → upload_progress 初始化时调用全局反序列化器 → longjmp() 导致堆销毁但状态残留 → 下一请求复用脏内存。整个过程无需你写 unserialize(),也无需任何业务类定义。
业务反序列化漏洞则一定出现在你自己的代码里,比如:
$data = $_COOKIE['prefs']; $obj = unserialize($data);$input = file_get_contents('cache/user.obj'); $cfg = unserialize($input);- 第三方库中未校验的
unserialize(file_get_contents(...))
看输入来源:是否可控且未经解析
原生漏洞的输入是原始 HTTP 请求体(尤其是 multipart boundary 和 payload 结构),攻击者直接构造二进制/非法字段长度/超大 chunk 触发 OOM 和状态错乱;它不关心内容是不是合法 PHP 序列化字符串,甚至根本不是字符串。
立即学习“PHP免费学习笔记(深入)”;
业务漏洞的输入必须是符合 PHP 序列化格式的字符串(如 O:4:"User":1:{s:4:"name";s:5:"admin";}),且该字符串来自外部可控源(Cookie、POST、Redis 缓存、文件导入等),并在业务逻辑中被显式传递给 unserialize()。
看检测方式:日志与崩溃特征不同
原生漏洞常表现为:无 PHP 错误日志、Apache 子进程突然 segfault、同一 worker 连续请求出现不可预测的内存读写错误、dmesg 显示 “php-fpm killed by SIGSEGV”。它不抛出 Notice 或 Fatal error,因为崩溃发生在 Zend 引擎底层。
业务漏洞更容易观测:unserialize() 失败时会报 Warning("Erroneous data format for unserializing")、触发 __wakeup/__destruct 魔术方法、或在后续使用对象属性时产生 Notice/Undefined property。配合日志监控 unserialize 调用点和输入源,能快速定位。
看修复路径:补丁层级完全不同
原生漏洞只能靠升级 PHP 版本解决(如升到 8.5.12),无法用代码补丁绕过。即使你删掉所有 unserialize(),只要运行在 8.5.11 + mod_php + 默认配置下,就仍可能被利用。
业务漏洞可立即缓解:停用 unserialize()、改用 json_decode() + 严格 Schema 校验、加 allowed_classes=[](仅作临时缓冲)、剥离不可信输入源头。这类修复不依赖 PHP 版本,且效果立竿见影。



















