CVE-2026-42945(代号NGINX Rift)是Nginx的ngx_http_rewrite_module模块中存在的一个高危堆缓冲区溢出漏洞,漏洞源于两阶段处理逻辑的状态不一致。该漏洞已存在长达18年,几乎影响了Nginx 0.6.27至1.30.0的所有版本,全球可能影响数百万台服务器。
漏洞是如何触发的?
要触发此漏洞,需要满足三个特定条件,如果配置同时符合以下几点,就处于高风险中:
条件一(存在rewrite/if/set指令链):在配置中,一个rewrite指令后面紧接着另一个rewrite、if或set指令。
条件二(使用了匿名捕获):正则表达式中使用了$1、$2等未命名捕获组。
条件三(替换字符串包含?):rewrite指令的替换字符串(replacement)中包含了问号(?)。
攻击者可以向满足上述条件的Nginx服务器发送一个精心构造的HTTP请求,触发漏洞,导致worker进程崩溃(拒绝服务),或在内存布局有利的条件下可能导致远程代码执行。
修复方式
方案一:升级Nginx版本
最彻底的修复方法是升级到一个已修复的版本,官方已发布修复,建议立即更新。
开源版 (Open Source):升级到 1.30.1 或更高版本(如1.31.0)。
商业版 (NGINX Plus):升级到 R32 P6 或 R36 P4 及以上版本。
方案二:配置层面的临时缓解
如果因为业务连续性要求无法立即升级,可以采用配置层面的临时缓解措施。
需要将所有使用了未命名捕获组$1, $2的rewrite指令修改为使用命名捕获组,从而阻断漏洞的触发条件。示例如下:
修复前
nginx
# 这种写法极有可能触发漏洞
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
修复后
nginx
# 使用命名捕获组,风险大大降低
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;
为了确保万无一失,请在正式修复前,对您的Nginx服务进行一次全面的安全扫描。