2026 年 10 月 21 日,PHP 官方安全团队与各大国际网络安全机构联合发布紧急公告,正式披露了代号为 “PHP2Shell” 的一组核心解释器超高危漏洞(CVE-2026-109618 与 CVE-2026-109619),CVSS v3.1 基础评分高达 9.2 (Critical)。
与以往频繁曝光的诸如 Laravel、WordPress 或 ThinkPHP 等应用层框架漏洞截然不同,PHP2Shell 直接扎根于 PHP 核心底层运行时(PHP Core Runtime & Zend Engine)。这意味着无论上层业务代码逻辑编写得多么严密,只要服务器部署了受影响的 PHP 解释环境,外部攻击者即可通过精心构造的非预期 HTTP 请求,利用内存越界与垃圾回收竞态,在无需任何身份认证的前提下实现远程任意代码执行(Unauthenticated RCE)。
一、 漏洞深度解构:PHP2Shell 是如何击穿底层运行时的?
1. 漏洞成因:OOM 异常分支下的半初始化对象清理漏洞
在 PHP 的设计理念中,每个 Web 请求都会经历完整的生命周期:请求初始化(RINIT)、脚本执行、请求清理(RSHUTDOWN)以及模块关闭(MSHUTDOWN)。为了防止单个恶意请求消耗过量资源,PHP 依靠 memory_limit 机制进行内存配额管控。
然而,本次曝光的 CVE-2026-109618 漏洞正是隐藏在内存耗尽(Out-of-Memory / OOM)的异常回滚处理流程中:
- 当外部攻击者通过 multipart/form-data 传输大量嵌套或畸形数据结构,在请求解析阶段精确触发 OOM 异常时,Zend 引擎会强制终止当前脚本并跳转进入
php_request_shutdown()阶段。 - 在清理尚未完成初始化的变量符号表与全局哈希表(
zend_hash)时,底层内存管理器错误地将某些处于“半初始化(Half-initialized)”状态的指针判定为有效结构体。 - 随后调用的销毁函数对这些悬空指针(Dangling Pointer)执行释放操作,瞬间引发了经典的 Use-After-Free (UAF) 与内存越界写(Out-of-Bounds Write),攻击者得以篡改 Zend VM 执行栈帧,劫持
execute_ex指针跳转并执行 Shellcode。
⚠️ 为什么常规安全手段失效?
传统 Web 应用程序防火墙(WAF)通常侧重于拦截 SQL 注入语句、系统命令调用(如 eval, system)或已知路径穿越特征。然而 PHP2Shell 的恶意载荷在语义层面完全是合规的 HTTP 协议头与多段表单数据,仅在底层 C 代码分配内存时才会引爆,绝大多数传统基于正则表达式匹配的 WAF 规则对此几乎完全失效。

---
二、 影响范围与排查指引
1. 广泛受波及的版本与运行模式
由于问题代码深埋于 PHP 核心垃圾回收与请求处理机制中,受影响的软件跨度长达十余年:
- PHP 5.4 至 8.5 结构性受波及:涵盖当前主流生产环境中大量运行的 PHP 8.1、8.2、8.3 及最新 8.4/8.5。
- 全架构覆盖:包括经典的
PHP-FPM + Nginx模式、Apachemod_php、php-cgi、FrankenPHP 以及 LiteSpeed 等所有将 PHP 暴露于 Web 流量的运行环境。
2. 服务器排查三步法(以 Linux / Ubuntu 为例)
第一步:查看当前 PHP-FPM 运行状态
systemctl status php8.3-fpm
# 或检查当前正在监听的 fastcgi 进程
ps aux | grep -iE 'php-fpm|php'
第二步:核对已安装软件包的构建版本
dpkg -l | grep -i php8.3
# 查看候选与已安装版本
apt-cache policy php8.3-fpm
以 Ubuntu 24.04 (Noble) 为例:
- ❌ 高危未修补版本:
8.3.6-0ubuntu0.24.04.10(构建日期早于 2026 年 10 月 19 日) - ✅ 安全修复版本:
8.3.6-0ubuntu0.24.04.13及更高版本
---
三、 应急处置与无缝加固方案
1. 官方安全更新安装(以 Ubuntu / Debian 为例)
各大主流 Linux 发行版(Ubuntu、Debian、RHEL、Alpine 等)以及 PHP 官方团队已于 10 月 21 日同步紧急推送了 Backport 修复版本。只需执行以下命令即可仅针对 PHP 模块进行精准升级,无需停机整个系统:
# 1. 刷新软件源列表
sudo apt-get update
# 2. 仅升级 PHP 8.3 核心及周边关联组件
sudo apt-get install --only-upgrade 'php8.3*'
2. 致命避坑点:升级后必须重启 FPM 服务!
🚨 运维实战关键警告:apt-get upgrade 仅更新了磁盘上的二进制文件(/usr/sbin/php-fpm8.3)。而在 Linux 运行机制中,已启动的 PHP-FPM Master 及 Worker 进程依然在内存中常驻旧版指令空间!如果仅执行包安装而不重启服务,服务器依然完全暴露在漏洞风险下!
升级完成后,必须显式重启服务:
# 平滑重启 PHP-FPM 释放旧版常驻内存
sudo systemctl restart php8.3-fpm
# 检查服务活跃度
sudo systemctl is-active php8.3-fpm
3. Docker / 容器化环境处置建议
如果业务运行在容器环境中,切忌直接在运行中的容器内执行 apt update。规范做法是:
- 拉取最新的官方基础镜像(例如
php:8.3-fpm-alpine或php:8.3-fpm-bookworm最新安全标签)。 - 重新构建业务镜像(
docker build --no-cache ...)。 - 进行灰度发布或滚动更新,确保所有旧 Pod 实例彻底注销。
---
四、 无法立即停机维护时的临时缓解策略
若处于极其严苛的生产环境无法即刻重启 PHP-FPM,可在前端接入层(Nginx / OpenResty / Cloudflare WAF)配置临时防御策略:
- 公网管理后台强制 IP 白名单: 如服务器上运行有 phpMyAdmin、Adminer 等数据库管理工具,必须立即在 Nginx 层对公网实施访问限制,仅允许受信任的内网或运维堡垒机 IP 访问。
限制畸形多段解析深度: 在 php.ini 中适度调高或优化配置,例如:
max_input_vars = 1000
max_input_nesting_level = 64
限制单请求最大 Header 与 Body 尺寸:
# 限制客户端上传体大小,遏制 OOM 触发条件
client_max_body_size 10m;
large_client_header_buffers 4 8k;
---
五、 总结与反思
PHP2Shell(CVE-2026-109618)的突发再次印证了底层基础软件安全治理的复杂性。即便是历经数十年检验的成熟运行时,在特定边界条件(如 OOM 与未完成初始化的析构清理)依然可能潜藏着足以颠覆系统安全的致命缺陷。
建议所有运维和架构工程师:第一时间自查线上集群的 PHP 构建版本,完成软件包更新并确认重启生效,将系统安全的主动权牢牢掌握在自己手中。