紧急警报:这个NGINX漏洞比Log4j更危险,而你可能正在使用
NGINX Rift:通过18年历史漏洞实现NGINX远程代码执行
摘要
DepthFirst的研究团队利用其自动化系统分析NGINX源代码,自主发现了4个远程内存损坏漏洞,其中包括一个2008年引入的关键堆缓冲区溢出漏洞(CVE-2026-42945)。研究人员进一步调查了该漏洞的可利用性,并开发了工作概念验证(PoC),展示了在关闭ASLR的情况下实现远程代码执行(RCE)。如果您的NGINX配置中使用了rewrite和set指令,您可能面临风险。
背景
NGINX是当今最流行的Web服务器,为全球近三分之一的网站提供服务。其高性能架构使其成为处理大规模Web流量的首选方案。从静态内容服务到作为关键反向代理,NGINX位于现代互联网的关键边缘位置。因此,这一核心基础设施中的单个漏洞可能使无数后端系统面临严重风险。
漏洞发现
研究团队使用DepthFirst的自主系统分析NGINX源代码。仅需单击一下即可导入代码库并触发分析。经过六小时的扫描,系统识别出5个安全问题,其中包括一个高严重性问题:在处理NGINX rewrite指令时的堆溢出问题。
研究团队通过GitHub安全公告向NGINX报告了这些问题。对于每个发现,都提供了详细的漏洞描述、根本原因分析和系统直接生成的概念验证。NGINX确认了其中4个问题:
确认的漏洞
-
CVE-2026-42945(严重,CVSS 9.2):
ngx_http_rewrite_module中的堆缓冲区溢出问题。在rewrite和set序列期间,未传播的is_args标志导致缓冲区分配不足。复制阶段将攻击者控制的转义URI数据写入堆边界之外,导致RCE。 -
CVE-2026-42946(高,CVSS 8.3):
ngx_http_scgi_module和ngx_http_uwsgi_module中的过度内存分配问题。不完整上游状态行读取后的状态不匹配导致跨缓冲区指针相减,产生约1TB的键长度,使工作进程崩溃。 -
CVE-2026-40701(中,CVSS 6.3):
ngx_http_ssl_module中的释放后使用问题。如果TLS连接在异步OCSP DNS解析完成前关闭,上下文池会在未取消解析器请求的情况下被销毁。DNS计时器稍后会解引用已释放的指针。 -
CVE-2026-42934(中,CVSS 6.3):
ngx_http_charset_module中的越界读取问题。处理代理缓冲区边界上的不完整UTF-8序列时的差一错误会损坏长度状态,计算出负的源偏移量,从分配的上游缓冲区前读取2个字节。
深入分析CVE-2026-42945
漏洞背景
这个漏洞需要rewrite和set指令来触发。这些指令在API网关配置中很常见:
- rewrite指令:允许根据正则表达式修改请求URI。当请求匹配指定模式时,NGINX会用新字符串替换URI。
- set指令:用于将值分配给自定义变量,通常用于在URI被重写前捕获原始请求路径。
NGINX使用脚本引擎优化这些操作。在配置解析时,脚本引擎将这些指令编译成操作序列。在运行时,它通过两阶段过程执行它们:
- 第一阶段:计算最终字符串的总长度,分配精确的内存量
- 第二阶段:执行复制操作,将实际数据写入新分配的缓冲区
根本原因
漏洞存在于src/http/ngx_http_script.c中。当rewrite指令的替换字符串包含问号时,会触发ngx_http_script_start_args_code函数,该函数永久设置e->is_args = 1标志。这个标志在脚本代码评估之间永远不会重置。
当后续的set指令引用正则表达式捕获组时,会触发ngx_http_script_complex_value_code函数。这里两阶段设计出现问题:
- 第一阶段(长度计算):使用完全清零的子引擎
le,其中le.is_args为0 - 第二阶段(数据复制):在主引擎上运行,其中
e->is_args仍为1
由于状态不一致,第一阶段计算的是原始未转义的长度,而第二阶段执行的是转义后的复制操作,导致缓冲区溢出。
漏洞利用
NGINX使用多进程架构,工作进程从单个主进程派生。这种设计使堆布局在不同工作进程中保持完全确定性。如果利用失败并导致工作进程崩溃,主进程会生成具有相同内存布局的新工作进程,允许安全地多次尝试直到成功。
攻击步骤
-
覆盖ngx_pool:目标是覆盖
ngx_pool_t结构中的cleanup指针(偏移64)。这个字段指向ngx_pool_cleanup_t结构的链表,其中包含函数指针和参数。 -
精确时机控制:使用跨请求堆风水技术控制堆布局和池的确切生命周期:
- 打开初始连接并发送部分头信息
- 打开第二个受害者连接,分配与第一个池相邻的受害者池
- 完成初始头信息,触发重写溢出
- 立即关闭受害者连接,调用
ngx_destroy_pool销毁受害者池
-
喷射伪造结构:通过POST请求体喷射堆,包含指向libc
system函数的伪造清理结构,后跟用户提供的命令字符串。 -
触发执行:关闭受害者套接字,触发
ngx_destroy_pool,执行所有注册的处理程序,包括注入的命令。
影响版本
- NGINX Open Source 0.6.27 到 1.30.0
- NGINX Plus R32 到 R36
- NGINX Instance Manager 2.16.0 到 2.21.1
- F5 WAF for NGINX 5.9.0 到 5.12.1
- NGINX App Protect WAF 4.9.0 到 4.16.0 和 5.1.0 到 5.8.0
- F5 DoS for NGINX 4.8.0
- NGINX App Protect DoS 4.3.0 到 4.7.0
- NGINX Gateway Fabric 1.3.0 到 1.6.2 和 2.0.0 到 2.5.1
- NGINX Ingress Controller 3.5.0 到 3.7.2, 4.0.0 到 4.0.1, 和 5.0.0 到 5.4.1
时间线
- 2026年4月18日:使用DepthFirst内部系统分析NGINX源代码,报告5个内存损坏问题
- 2026年4月21日:通过GitHub安全公告向NGINX报告所有5个问题
- 2026年4月24日:NGINX确认4个报告的问题
- 2026年4月28日:通知NGINX已开发出展示RCE的工作PoC
- 2026年5月5日:与NGINX共享RCE PoC并附上演示视频
- 2026年5月13日:F5发布NGINX安全公告
- 2026年5月13日:发布此博客文章
结论
这个漏洞展示了即使是最成熟、广泛使用的软件也可能存在长期未被发现的关键漏洞。CVE-2026-42945自2008年引入,直到2026年才被发现,影响了18年间的NGINX版本。它强调了持续安全审计和自动化代码分析的重要性,特别是在处理关键基础设施组件时。
概念验证代码可在GitHub仓库获取。系统管理员应立即检查其NGINX版本并应用相应的安全补丁。
更新提示
目前发现nginx官网已经有了新的版本,即1.30.1或者1.31.0,我们团队已经第一时间进行了更新。
大家也可以尽快更新,源码链接如下:
stable版本:https://nginx.org/download/nginx-1.30.1.tar.gz
mainline版本:https://nginx.org/download/nginx-1.31.0.tar.gz
文档信息
- 文章作者: 运维技术团队 - 辣个男人Devin
- 发布日期: 2026年05月14日
- 适用系统: ubuntu24.04.3
- 参考链接:
https://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability
https://my.f5.com/manage/s/article/K000160932