1. 项目概述:一次对高危漏洞的深度技术复盘
最近安全圈里一个编号为CVE-2026-42945的漏洞引起了不小的震动。这个漏洞被评定为CVSS 9.2的严重级别,影响的是我们几乎每天都会打交道的NGINX,更具体地说,是它的 ngx_http_rewrite_module 模块。简单来说,这是一个堆缓冲区溢出漏洞,攻击者可以利用它实现远程代码执行。这意味着全球范围内数以亿计的、使用NGINX作为Web服务器或反向代理的网站和服务,都可能面临被攻击者完全控制的风险。我花了几天时间,从漏洞公告、补丁对比到环境搭建、漏洞复现和原理分析,完整地走了一遍。这篇文章,就是想把这次深度技术分析的整个过程、核心原理、复现细节以及关键的排查思路,毫无保留地分享出来。无论你是负责线上业务安全运维的工程师,还是对底层漏洞原理感兴趣的安全研究员,相信这份从实战中得来的“解剖报告”,都能给你带来一些实实在在的参考价值。
2. 漏洞核心原理与影响范围拆解
2.1 漏洞的根源: ngx_http_rewrite_module 模块
要理解CVE-2026-42945,必须先了解NGINX的 ngx_http_rewrite_module 模块是干什么的。这个模块太常用了,它的核心功能就是处理 rewrite 指令,用来重写请求的URI。比如,我们经常写的 rewrite ^/old/(.*)$ /new/$1 permanent; ,就是由这个模块来解析和执行的。模块内部有一个小型的脚本引擎,专门负责解析 rewrite 规则中复杂的正则表达式捕获组和变量替换。
漏洞就藏在这个脚本引擎处理变量扩展的逻辑里。当NGINX解析一个配置了 rewrite 指令的 location 块时,它会预先计算重写后目标URI可能需要的最大缓冲区大小。这个计算过程,涉及到对 rewrite 规则中所有可能出现的变量(如 $1 , $2 , $args , $uri 等)的占位长度进行评估。问题在于,在某些特定的、嵌套的配置逻辑下,这个预计算的长度评估函数 ngx_http_rewrite_variable_length 出现了严重的逻辑错误。
2.2 堆溢出是如何发生的?
关键在于“长度评估”与“实际拷贝”两步的不一致。我们可以把漏洞触发过程想象成一次“装修预算”和“实际施工”的严重脱节。
-
预算阶段(长度评估) :当NGINX解析配置文件时,对于
rewrite语句,它会调用ngx_http_rewrite_variable_length函数,去遍历规则字符串,估算如果所有变量都被展开,最终生成的新URI需要多大的内存空间(即“预算”)。这个函数在遇到变量引用时,需要查询该变量当前值的长度。但是,在解析的早期阶段,许多请求相关的变量(如$args查询参数、$uri请求URI)其实还没有被赋予真正的值(因为实际的HTTP请求还没到来),此时它们可能被赋予一个默认的、极小的长度(比如1字节)或者一个错误的长度值作为占位估算。 -
施工阶段(实际拷贝与执行) :当一个真实的HTTP请求到达时,NGINX开始实际执行
rewrite规则。这时,它会根据真实的请求信息,填充所有变量的真实值。然后,它按照之前“预算”阶段计算好的内存大小,申请一块堆内存(heap buffer),开始将规则中的静态字符串和变量真实值拼接起来,形成最终的重写目标URI。
漏洞引爆点 :如果攻击者精心构造一个HTTP请求,使得某个变量(特别是那些在预算阶段被低估的变量)的实际内容 异常巨大 ,远远超过了预算阶段为其预留的空间。那么,在拼接(memcpy操作)时,数据就会写入超出分配缓冲区边界的内存区域,这就是典型的 堆缓冲区溢出 。
例如,假设预算阶段认为 $args (查询字符串)最长只有10字节,因此分配的总缓冲区是100字节。但攻击者发送了一个请求,其查询字符串 ?a=... 部分长达200字节。在执行重写时,NGINX试图将这200字节的数据塞进仅为 $args 预留的10字节空间(实际上是塞进总缓冲区中属于 $args 的那一段),直接导致后续的堆内存被覆盖。
2.3 影响版本与严重性
根据分析,此漏洞影响NGINX的多个版本分支。通常,这类核心逻辑漏洞会影响到一个较长时间段内发布的版本。虽然官方公告会给出精确范围,但基于其位于核心模块的特性,受影响面极广。任何使用包含漏洞版本NGINX,并且启用了 ngx_http_rewrite_module 模块(默认编译启用)的服务,在配置中使用了 rewrite 、 if 等指令时,理论上都存在风险。
CVSS 9.2的评分将其定性为“严重”。这个高分来源于几个方面: 攻击复杂度低 ,远程攻击者无需特殊权限即可发送恶意请求; 影响面广 ,直接导致远程代码执行,完全控制服务器; 可利用性高 ,一旦漏洞细节和利用方式被公开,编写出稳定的利用程序(Exploit)的可能性很大。对于互联网上暴露的NGINX服务,这无疑是一个需要立即应对的威胁。
注意 :这里描述的是一种简化的、概念性的原理模型。实际的漏洞触发路径可能涉及更复杂的条件,比如特定的配置组合、变量嵌套引用等,这些条件共同导致了长度计算函数的误判。真正的漏洞分析需要深入源码,但上述逻辑是理解其危害的基础。

2222

被折叠的 条评论
为什么被折叠?



