概述
2026年10月中下旬,PHP、Node.js、nginx 三个 Web 基础组件先后发布版本更新,累计修复17个安全漏洞。
PHP 的两个漏洞(CVE-2026-109618、CVE-2026-109619,统称 PHP2Shell)源于 PHP 核心的内存管理缺陷,受影响的 PHP 版本范围从 5.4 一直延伸到 8.5,覆盖了过去十多年间发布的所有主流版本。漏洞危害表现为未经身份验证的远程攻击者可利用其实现全自动化的远程代码执行,无需账号密码即可直接获取服务器控制权;其 CVSS 评分 9.2,影响约七成的网站,目前已观测到在野利用。
Node.js 修复10个漏洞(4项高危、3项中危、3项低危),其中最严重的是 Brotli 解码器越界写缺陷(CVE-2026-111497),可导致远程代码执行;另有三个主机名校验绕过类高危漏洞(CVE-2026-105483、CVE-2026-106069、CVE-2026-105482),攻击者利用全角数字书写的 IP 地址、松散解析的主机名或含 NUL 字符的域名,可绕过 TLS 证书主机名校验或 dns.resolve 解析,实施中间人攻击或将流量引导至错误主机;同时本次更新移除了对私钥已沦陷的 eMudhra 中间 CA 的信任。
nginx 修复5个漏洞:3个为 worker 进程内存破坏缺陷,分别位于 alias 路径映射(CVE-2026-15176)、含变量的字符串表达式求值(CVE-2026-93479)、AIO 与 SSI 组合场景(CVE-2026-97205),其触发依赖特定服务端配置,攻击者无法直接控制条件,更可能的后果是 worker 崩溃与服务中断,不宜按通用型远程代码执行处置;CVE-2026-95101 为 HTTP/3 下未知帧被当作请求体处理,可绕过 client_max_body_size 限制或向后端请求注入数据;CVE-2026-97629 为 TLS 会话票据密钥轮换时其中一个密钥未初始化,可用于伪造会话,该漏洞不依赖内存破坏,在启用票据轮换的部署中应视为高风险项。
受影响的软件版本
PHP
- 5.4 <=
PHP< 8.5.12(含 8.4.x、8.3.x、8.2.x 各分支中低于修复版本的版本) - 修复版本:
PHP 8.5.12、8.4.27、8.3.36、8.2.35
Node.js
Node.js26.x < 26.12.1Node.js24.x < 24.22.1Node.js22.x < 22.23.4- 修复版本:
Node.js 26.12.1、24.22.1、22.23.4;已停止维护的版本不提供修复
nginx
- 0.1.29 <=
nginx< 1.31.7(CVE-2026-15176) - 0.8.11 <=
nginx< 1.31.7(CVE-2026-97205) - 1.31.2 <=
nginx< 1.31.7(CVE-2026-93479) - 1.30.0 <=
nginx< 1.30.6:稳定分支,同日发布修复版本,此区间同样需要升级 - 启用
HTTP/3的版本需核查(CVE-2026-95101);启用TLS会话票据密钥轮换的版本需核查(CVE-2026-97629) - 修复版本:
nginx 1.31.7、1.30.6
漏洞基本信息
| 组件 | 漏洞编号 | 影响 | 严重等级 | 漏洞说明 |
|---|---|---|---|---|
| PHP | CVE-2026-109618 | 远程代码执行无需身份验证、敏感数据泄露 | 严重 | 通过 OOM(内存溢出)损坏漏洞实现远程代码执行:内存溢出处理机制可能会在 PHP 的内部请求数据仅完成部分初始化时中断其运行。随后,请求清理程序可能会将这些无效数据误视为有效数据进行处理。 |
| PHP | CVE-2026-109619 | 远程代码执行无需身份验证、敏感数据泄露 | 严重 | 通过陈旧全局状态实现远程代码执行:请求所拥有的内部状态在其后备内存被释放后仍然可能存留。随后,由同一个工作进程处理的后续请求在进行正常初始化重置之前,可能会直接使用该陈旧状态。 |
| Node.js | CVE-2026-111497 | 远程代码执行 | 高危 | Brotli 解码器的越界写缺陷可导致远程代码执行,影响 26.x、24.x、22.x |
| Node.js | CVE-2026-105483 | 身份伪造 | 高危 | 全角数字导致的 IP 规范化缺陷:该漏洞的起因是 Node.js 内部在对 IP 地址进行规范化处理时存在回归缺陷。当输入的 IP 地址中包含全角数字时,TLS 模块在验证证书主机名时未能对其进行正确拦截或降级处理,导致验证逻辑被绕过;影响 26.x、24.x |
| Node.js | CVE-2026-106069 | 身份伪造 | 高危 | 宽松的 IP 解析导致验证绕过:该漏洞存在于 Node.js 的 TLS 模块中。当应用程序在建立 TLS/HTTPS 连接时,由于对不常见或非规范格式的 IP 地址解析过于宽松,未能进行严格审查,导致证书主机名校验被绕过;影响 26.x、24.x、22.x |
| Node.js | CVE-2026-105482 | 域名/请求劫持、安全绕过 | 高危 | 空字节截断缺陷:漏洞存在于 Node.js 的 dns.resolve 及其相关解析核心函数中。当应用程序将包含 NUL 字节(即 \x00 或空字符)的恶意域名/主机名输入传给 dns.resolve 时,底层解析机制未能安全拦截,导致域名在 NUL 字符处被强行截断,解析请求被导向攻击者指定的主机;影响 26.x、24.x、22.x |
| Node.js | CVE-2026-105481 | 响应错配 | 中危 | 长连接响应提前处理缺陷:漏洞发生在 HTTP 的 Keep-alive(长连接)套接字复用机制中。由于内部逻辑漏洞,当一个连接处于活跃状态时,客户端套接字可能会意外地去处理一个“在对应请求尚未正式发送出去之前就已经写入”的响应数据,造成响应与请求错配;影响 26.x、24.x、22.x |
| Node.js | CVE-2026-106072 | 身份伪造 | 中危 | 不规范 IPv4 主机名的证书验证缺陷:该漏洞存在于 Node.js 的 TLS 模块中。当 Node.js 客户端连接到使用非规范格式的 IPv4 主机名时,其内部的证书校验机制存在不严谨的问题;影响 26.x、24.x、22.x |
| Node.js | CVE-2026-106074 | 会话劫持、凭据碰撞、越权访问 | 中危 | 启动快照中的随机数缓存残留:内部函数 crypto.randomUUID() 和 crypto.randomInt() 在生成随机数时使用了底层的熵缓存机制。漏洞导致这些随机数缓存数据被错误地一起保存到了快照或 SEA 镜像中,当该快照被用来启动多个不同的 Node.js 进程实例(如分布式微服务或高并发扩容容器)时,每一个新启动的进程都会重复生成一模一样的随机数序列(UUID 或随机整数);影响 26.x、24.x、22.x |
| Node.js | CVE-2026-106070 | 信息泄露 | 低危 | ZipFile 在 ZIP 头部校验失败后仍返回攻击者可控的前缀字节,影响 26.x |
| Node.js | CVE-2026-106071 | 权限过授 | 低危 | 权限模型通配符基数查找缺陷:内部在处理通配符匹配的基数查找逻辑时处理不严谨,导致匹配越界,实际授予的访问范围超出配置预期;影响 26.x |
| Node.js | CVE-2026-106073 | 权限绕过 | 低危 | 权限模型绕过缺陷:在 Node.js 中,权限模型用于限制代码对特定文件系统路径的访问。当应用程序或可信度较低的第三方模块调用 fs.realpathSync(用于获取规范化绝对路径的同步函数)时,由于底层权限校验机制未能在该函数执行中完成完整的权限模型合规性检查,导致校验失效,受限路径可被继续访问;影响 26.x、24.x、22.x |
| nginx | CVE-2026-15176 | 拒绝服务、远程代码执行(依赖配置) | 高危 | alias 指令在请求 URI 经 rewrite 改写后映射到文件路径时,worker 进程存在缓冲区溢出 |
| nginx | CVE-2026-93479 | 拒绝服务、远程代码执行(依赖配置) | 高危 | 求值含变量的字符串表达式时 worker 进程存在缓冲区溢出,影响 http 与 stream 模块的 document root 计算与请求日志 |
| nginx | CVE-2026-97205 | 拒绝服务、远程代码执行(依赖配置) | 高危 | 启用异步文件 I/O(AIO)且 SSI 页面含 include virtual 时,特定配置下存在 use-after-free |
| nginx | CVE-2026-95101 | 安全绕过、请求注入 | 高危 | HTTP/3 下未知帧的一部分被当作请求体处理,可绕过 client_max_body_size 限制或向后端请求注入数据 |
| nginx | CVE-2026-97629 | 身份伪造 | 高危 | TLS 会话票据密钥轮换时其中一个密钥未被初始化,可伪造会话;会话伪造即认证绕过,启用轮换的场景应视为高风险项 |
利用情况
PHP2Shell漏洞在披露前一日已在公开论坛泄露,且有厂商提前发布含补丁的二进制版本,攻击者可通过代码差异比对反推漏洞细节。Cloudflare在披露日提前约九小时启用防护规则,随后观测到攻击者持续修改载荷以规避规则;watchTowr的蜜罐网络已观测到实际利用行为Node.js与nginx的漏洞未见公开的在野利用信息
防范建议
- 尽快更新
PHP至如下修复版本:8.5.12、8.4.27、8.3.36、8.2.35。仍在使用PHP 8.1及更早版本的用户建议跨版本升级PHP 8.1及更早版本已停止维护;PHP 8.2的安全支持将于2026年12月31日结束。官方仅针对PHP 8.1、PHP 8.0和PHP 7.4发布了可供用户自行编译的代码分支PHP 8.1:https://github.com/php/php-src/tree/PHP-8.1-CVE-2026-109618-109619PHP 8.0:https://github.com/php/php-src/tree/PHP-8.0-CVE-2026-109618-109619PHP 7.4:https://github.com/php/php-src/tree/PHP-7.4-CVE-2026-109618-109619
- 更新
Node.js至如下修复版本:26.12.1、24.22.1、22.23.4,并重新构建以SEA或startup snapshot打包的产物 - 更新
nginx至如下修复版本:1.31.7、1.30.6或更高版本 - 清点全部
PHP运行时版本,包括容器基础镜像、共享主机与遗留系统,历史遗留版本是本次最大盲区 - 排查
PHPworker进程的异常内存转储与非预期子进程(CVE-2026-109619可用于读取进程内存) - 关注
nginx层异常的400、413响应突增与worker异常重启,此为内存破坏的弱信号
PHP相关漏洞临时缓解措施
以下措施仅可降低特定攻击路径的暴露,不能替代升级。PHP 官方已明确表示不存在完整的缓解措施
针对 CVE-2026-109618(内存耗尽路径):
- 设置
memory_limit=-1,且需确保应用层无法覆盖,建议通过FPMpool 的php_admin_value或Apache配置下发,并逐一核查无任何 pool、目录或应用设置重新施加有限值 - 设置较低的
post_max_size:无上传需求设为8M,有上传需求设为32M,并确保upload_max_filesize小于该值 - 在
Web服务器或代理层限制解码后的请求体积、输入字段数、multipart分片数、请求头数量与嵌套深度,且须覆盖无有效Content-Length的请求 - 以容器或
cgroup内存上限作为可用性边界,策略应只终止受影响的worker。不要使用RLIMIT_AS或RLIMIT_DATA,二者会主动诱发该分配失败路径
针对 CVE-2026-109619(陈旧状态路径):
- 设置
session.upload_progress.enabled=0并重启所有worker,须通过php.ini、FPMpool 或服务端配置下发,ini_set()与.user.ini在此场景下不生效。该措施仅封堵已确认的session路径,不覆盖其他变体 PHP 8.5环境下另需设置fatal_error_backtraces=0并重启所有worker,该措施仅封堵已确认的fatal backtrace路径- 清理按请求生效、且在初始化前就会产生诊断输出的无效或废弃配置项。通过
error_reporting、display_errors或@隐藏诊断输出无法规避该路径 - 修复所有攻击者可触达的
fatal error与执行超时
总结
PHP2Shell 的发现过程有人工智能模型参与,并已由相关方公开确认:Wiz Research 结合 Wiz Atlas、Gemini 4 Argon 与 GPT-5.6 Sol 组合独立发现这两个漏洞;OpenAI 内部安全研究团队 Calif 使用 GPT-5.6 Sol 独立发现其中一个漏洞,漏洞的协调披露工作由 OpenAI 的 Patch the Planet 计划牵头推进。Wiz 表示,一名研究员依托 AI 模型,仅用一周就完成了以往专家团队需要数月才能完成的漏洞挖掘工作。从发展趋势来看,过去需要顶尖安全团队耗时数月开展的底层代码审计,如今少量研究人员配合大模型即可在数天内完成,还能并行对多个开源项目开展审计。漏洞挖掘的目标也逐步向底层基座收敛:编程语言运行时、核心依赖库、协议实现这类全社会广泛依赖、但长期审计投入不足的代码,既是 AI 代码分析模型擅长的方向,也是历史遗留缺陷集中的区域。基础组件高危漏洞的发现节奏正在明显加快,未来同类高危漏洞的披露频率或将高于以往。