理解 NGINX Rift:一个导致 RCE 的长达十年的堆缓冲区溢出漏洞
A 个名为 "NGINX Rift" (CVE-2026-42945) 的严重安全漏洞最近被曝光,它揭示了 NGINX Web 服务器 ngx_http_rewrite_module 中的一个堆缓冲区溢出漏洞。令这一发现尤为令人震惊的是其存在时间之长:据报道,该漏洞自 0.6.27 版本以来就一直存在,可以追溯到 2008 年。
该漏洞允许未经身份验证的远程代码执行 (RCE),对任何利用 NGINX 进行 URL 重写的架构都构成了重大风险。这一发现是使用 DepthFirst 的自动化安全分析工具做出的,展示了 AI 辅助漏洞研究在发现遗留代码库中深层缺陷方面日益增长的能力。
技术根本原因
该漏洞源于一个经典的 "two-pass" 脚本引擎漏洞。在 ngx_http_rewrite_module 中,NGINX 在第一轮处理中进行长度计算,然后在第二轮处理中使用 ngx_escape_uri 执行实际的复制操作。
这两轮处理之间存在差异——具体来说,当 rewrite 指令的替换字符串中包含问号 (?) 且其后紧跟着 set、if 或另一个 rewrite 指令时——会导致堆缓冲区溢出。当引擎无法正确计算转义 URI 的最终大小,从而导致其写入超出分配的内存边界时,就会发生这种情况。
利用链
虽然堆溢出只是一个起点,但要将其转化为可靠的 RCE,需要一个复杂的利用链。公开的 Proof of Concept (PoC) 通过以下几种高级技术展示了这一点:
- Cross-Request Heap Feng Shui: 利用多次请求操纵堆布局,将目标对象放置在可预测的位置。
- Pool Cleanup Pointer Corruption: 通过破坏 NGINX 内存池清理机制中的指针,攻击者可以劫持应用程序的控制流。
- ASLR Considerations: 需要注意的是,当前的公开 PoC 假设地址空间布局随机化 (ASLR) 已禁用。然而,安全专家警告说,这并不意味着启用 ASLR 的系统就是安全的。
"ASLR 是一种深度防御技术,旨在增加利用难度。在几乎所有情况下,包含 ASLR bypass 的也只是时间问题和技术问题... 说 '如果你启用了 ASLR,你就不会面临来自此漏洞的风险' 是完全错误的。"
缓解与修复
立即打补丁
F5 已为受影响的版本发布了补丁。用户应更新到 1.31.0 或 1.30.1 (针对开源版本) 并为 NGINX Plus 应用最新的更新。OpenResty 也为 1.27 和 1.29 版本提供了补丁。
配置规避方案
如果无法立即打补丁,存在一种关键的配置级缓解措施。该漏洞是由在 rewrite 定义中使用未命名捕获组 (例如 $1、$2) 触发的。
修复方法: 将未命名捕获替换为 命名捕获。例如,不要使用 $1 和 $2,而是定义并使用 $user_id 和 $section。
评估您的风险
如果您的 NGINX 配置包含以下内容,您可能面临风险:
- 一个
rewrite指令,其替换字符串中包含?。 - 使用了未命名捕获组 (例如
$1)。 - 后续的
set、if或rewrite指令引用了这些捕获组。
如果您不使用 ngx_http_rewrite_module 或这些特定的模式,您的系统很可能不受影响。
对基础设施的更广泛影响
"NGINX Rift" 漏洞引发了关于依赖遗留 C 语言软件来构建关键互联网基础设施的更广泛讨论。一个漏洞能在全球使用最广泛的 Web 服务器之一中存在近二十年之久,这一事实突出了了内存不安全语言的脆弱性。
这一事件强调了 "defense-in-depth" (深度防御) 策略的必要性。仅仅依赖 ASLR 这样的单一缓解措施是不够的;根本原因——内存损坏——必须通过打补丁来解决。随着自动化分析工具在发现这些 "needle in a haystack" (大海捞针) 式的漏洞方面变得越来越强大,发现与武器化之间的窗口期正在缩小,使得快速补丁管理变得比以往任何时候都更加关键。