NGINX Rift:揭露一项已有18年历史的堆溢出漏洞

在全球最广泛使用的 Web 服务器之一中发现了一项关键安全漏洞,代号为 “NGINX Rift”(CVE-2026-42945)。该缺陷是一种堆溢出,已潜伏 18 年未被发现,涉及 0.6.27 至 1.30.0 版本。

此发现凸显了即使是最成熟的软件项目也需要持续进行安全审计的重要性。即使在高度稳定的代码库中,遗留的代码路径——尤其是涉及 rewriteset 指令的路径——也可能隐藏关键漏洞近二十年。

漏洞的技术本质

该漏洞是一种堆溢出。从技术角度来看,堆溢出指程序向堆分配的内存块写入的数据超过了该块的容量,从而使攻击者能够覆盖相邻的内存。

根据 DepthFirst 的发现团队,漏洞在 NGINX 配置中使用 rewriteset 指令的特定组合时被触发。虽然并非所有 NGINX 部署都会受到影响,但在 1.30.0 之前使用这些指令进行复杂路由或变量赋值的实例存在风险。

利用方式与 ASLR 的作用

该漏洞最关键的方面之一是它能够绕过诸如地址空间布局随机化(ASLR)等现代安全缓解措施。

虽然 F5(NGINX 的所有者)表示代码执行主要在 ASLR 被禁用的系统上可行,但发现该缺陷的研究人员基于 NGINX 的架构提出了相反的观点。

NGINX 采用多进程架构,工作进程由单一主进程 fork 出来。由于此设计,每个子工作进程的内存空间完全复制,这在不同工作进程之间形成了确定性的堆布局。

"如果我们的利用失败并导致工作进程崩溃,主进程会直接生成一个具有完全相同内存布局的新进程。这使我们能够安全地多次尝试,直至成功,而无需担心工作进程崩溃导致内存布局改变。"

这种确定性特征使攻击者能够通过逐字节覆盖指针来潜在泄露 ASLR 偏移量,理论上即使在启用 ASLR 的系统上也能利用该漏洞。

影响与缓解措施

CVE-2026-42945 的发现严峻提醒我们,软件项目成熟度的表面稳定性并不等同于安全保障。

如何缓解

如果您使用的 NGINX 版本介于 0.6.27 与 1.30.0 之间,建议采取以下措施:

  1. 更新 NGINX: 首要建议是升级到 NGINX/F5 提供的最新补丁版本。
  2. 审查配置: 如果无法立即更新,请检查配置文件中 rewriteset 指令的使用情况。如果可以替换这些指令或实现替代的路由逻辑,可能会降低风险。

正如社区成员所指出的,使用 rewriteset 的模式在通过 NGINX 部署的传统 PHP 应用中很常见,这使得这些遗留部署尤为脆弱。

Sources