PHP、Node.js、nginx高危漏洞预警

概述

  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.js 26.x < 26.12.1
  • Node.js 24.x < 24.22.1
  • Node.js 22.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 及更早版本的用户建议跨版本升级
  • 更新 Node.js 至如下修复版本:26.12.1、24.22.1、22.23.4,并重新构建以 SEA 或 startup snapshot 打包的产物
  • 更新 nginx 至如下修复版本:1.31.7、1.30.6 或更高版本
  • 清点全部 PHP 运行时版本,包括容器基础镜像、共享主机与遗留系统,历史遗留版本是本次最大盲区
  • 排查 PHP worker 进程的异常内存转储与非预期子进程(CVE-2026-109619 可用于读取进程内存)
  • 关注 nginx 层异常的400、413响应突增与 worker 异常重启,此为内存破坏的弱信号

PHP相关漏洞临时缓解措施

以下措施仅可降低特定攻击路径的暴露,不能替代升级。PHP 官方已明确表示不存在完整的缓解措施

针对 CVE-2026-109618(内存耗尽路径):

  • 设置 memory_limit=-1,且需确保应用层无法覆盖,建议通过 FPM pool 的 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、FPM pool 或服务端配置下发,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 代码分析模型擅长的方向,也是历史遗留缺陷集中的区域。基础组件高危漏洞的发现节奏正在明显加快,未来同类高危漏洞的披露频率或将高于以往。

参考资料

Author

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *