必须通过 Web 请求(如 curl 访问 ver.php)确认实际运行版本为 8.5.12 / fpm-fcgi,同时验证 php-fpm 进程路径、CVE 补丁生效状态(如 pm.max_requests=1 测试崩溃)、关键配置兼容性(如 opcache.enable_cli=Off)及运行时监控指标。

确认 PHP 实际运行版本是否为 8.5.12
很多团队执行了 apt upgrade 或重装包,但线上真正跑的仍是旧版 php-fpm 进程。必须验证 Web 请求上下文中的实际版本,而非 CLI。
- 在 Web 根目录临时放一个
ver.php,内容为<?php echo PHP_VERSION . ' / ' . php_sapi_name(); ?> - 用
curl https://yoursite/ver.php访问,确认输出是8.5.12 / fpm-fcgi(或apache2handler) - 同时检查
ps aux | grep php-fpm的二进制路径,再对那个路径执行/path/to/php-fpm -v,避免 FPM 和 CLI 使用不同安装 - 如果用 Docker,别只看
Dockerfile FROM,要进容器执行php -v和cat /proc/1/cmdline确认主进程加载的是哪个 php-fpm
检查是否仍存在 CVE-2026-109618 / CVE-2026-109619 的触发条件
这两个漏洞依赖请求间状态复用,所以不能只靠版本号判断“已修复”,得验证关键内存管理逻辑是否生效。官方未提供检测脚本,但可通过行为观察缩小风险面。
- 在
php-fpm.conf中临时设置pm.max_requests = 1并重启,观察是否仍有异常崩溃或日志中出现zend_mm_heap corrupted、Use after free detected—— 若仍有,说明补丁未生效或被覆盖 - 检查错误日志是否还出现
Allowed memory size of XXX bytes exhausted后接Segmentation fault或child exited on signal 11:这是 CVE-2026-109618 的典型残留迹象 - 禁用
session.upload_progress(设session.upload_progress.enabled = Off),再用空文件名 multipart 请求(filename="")反复压测 —— 修复后不应导致 worker 持续异常或返回非预期响应体
验证 php.ini 中关键缓解配置是否与新版兼容
有些团队会加 disable_functions=exec,eval 或调低 memory_limit 来“防万一”,但这些操作在 8.5.12 中可能掩盖真实问题,甚至干扰补丁机制。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
memory_limit设得过低(如 16M)反而会放大 OOM 触发频率,增加 CVE-2026-109618 被利用的概率 —— 建议保持业务所需合理值(如 128M–512M),不要盲目压限 -
opcache.enable_cli=On在 8.5.12 中与某些 JIT 设置存在已知冲突,可能导致初始化阶段状态残留 —— 生产环境应确保opcache.enable_cli=Off - 若使用自定义
php.ini覆盖(如通过PHP_INI_SCAN_DIR),需确认没有旧版配置残留zend_extension或覆盖了extension_dir,导致核心模块加载异常
上线后持续监控的关键指标
补丁修复的是内存生命周期缺陷,这类问题往往在高并发、长连接、混合请求类型场景下才暴露。静态验证只是起点,真实安全状态取决于运行时表现。
立即学习“PHP免费学习笔记(深入)”;
- 监控
php-fpm的slowlog中是否新增含zend_mm_shutdown、zend_hash_destroy的堆栈 —— 这类调用出现在清理阶段,是状态残留的信号 - 用
tcpdump抓取异常请求的原始 payload,重点过滤Content-Type: multipart/form-data且含filename=""或超长 boundary 的包,比对修复前后响应头中X-Powered-By是否一致、响应体是否被截断 - 检查
systemctl status php-fpm的ActiveEnterTimestampMonotonic,若 worker 频繁重启(


















