CVE-2026-42945 深度解析:18 年的 NGINX Rewrite 漏洞(NGINX Rift)
有勇气的牛排
34
网络安全
2026-05-28 10:53:03
2026 年 5 月,NGINX 官方披露了一个高危漏洞:
CVE-2026-42945
又被业内称为:NGINX Rift
这是一个存在了 18 年 的漏洞,影响全球大量互联网服务、反向代理、Ingress 网关与 Kubernetes 集群。
更危险的是:
- 攻击者无需登录
- 仅需构造恶意 HTTP 请求
- 即可触发:
- Worker Crash(DoS)
- Heap Buffer Overflow(堆溢出)
- 某些条件下甚至 Remote Code Execution(RCE)
漏洞公开后,安全圈几乎全线预警。
一、漏洞基本信息
| 项目 |
内容 |
| CVE |
CVE-2026-42945 |
| 漏洞名称 |
NGINX Rift |
| 类型 |
Heap Buffer Overflow |
| 影响组件 |
ngx_http_rewrite_module |
| 影响版本 |
0.6.27 ~ 1.30.0 |
| 漏洞等级 |
High / Critical |
| CVSS v4 |
9.2 |
| 披露时间 |
2026-05-13 |
| 利用条件 |
特定 rewrite 配置 |
| 是否需要认证 |
不需要 |
| 是否可能 RCE |
是 |
二、漏洞根源是什么?
问题出现在:
ngx_http_rewrite_module
也就是:
rewrite
if
set
这些 NGINX URL 重写逻辑。
三、触发漏洞的核心条件
漏洞并不是“所有 NGINX 都会被打”。
必须满足:
条件 1:使用 rewrite 指令
例如:
rewrite ^/user/(.*)$ /profile?id=$1? last;
条件 2:使用匿名捕获组
即:
$1
$2
$3
这种 PCRE 捕获变量。
条件 3:replacement 中包含 ?
例如:
/profile?id=$1?
这里的:
?
就是关键触发点。
条件 4:后面继续跟 rewrite / if / set
例如:
rewrite ^/user/(.*)$ /profile?id=$1? last;
set $abc "test";
或者:
if ($http_user_agent ~* "curl") {
...
}
四、漏洞原理(技术分析)
NGINX 的 rewrite 模块内部有一套:
script engine
用于:
- 动态拼接 URI
- 解析
$1
- 处理 rewrite
- 执行 if/set
它采用“两阶段执行”:
第一阶段
计算:
需要分配多少内存
第二阶段
真正写入字符串。
但问题在于:
当:
- rewrite replacement 中有
?
- 同时使用
$1
- 后续还有 rewrite/if/set
时:
第一阶段
计算长度错误。
第二阶段
实际写入超出申请内存。
最终导致:
Heap Buffer Overflow
即:
堆缓冲区溢出
五、攻击效果
1、Worker Crash(最容易)
攻击者可发送特殊请求:
GET /user/AAAAAAA....
导致:
nginx worker process exited on signal 11
表现为:
- 服务间歇性 502
- worker 不断重启
- CPU 飙升
- 连接抖动
2、远程代码执行(RCE)
如果:
- ASLR 被关闭
- 堆布局可预测
- 存在可利用内存布局
理论上:
攻击者可实现:
Remote Code Execution
即:
远程执行代码
六、为什么这个漏洞这么危险?
因为:
1、NGINX 是互联网基础设施
全球大量:
- Web 服务
- API 网关
- Kubernetes Ingress
- CDN
- WAF
- Docker Gateway
都基于 NGINX。
2、漏洞存在了 18 年
官方披露:
该问题从:
2008 年
就已经存在。
3、很多人喜欢写 rewrite
尤其国内:
伪静态
SEO URL
PHP rewrite
使用极其广泛。
七、哪些系统可能受影响?
不仅是原生 NGINX。
还包括:
- Kubernetes ingress-nginx
- OpenResty
- Kong
- APISIX
- Tengine
- Nginx Proxy Manager
- 各类云 WAF
八、如何检查是否受影响?
查看版本
nginx -v
如果:
<= 1.30.0
则属于受影响范围。
九、危险配置排查
搜索 rewrite 中包含 ?
grep -R "rewrite.*\\?" /etc/nginx
搜索匿名捕获组
grep -R '\$[1-9]' /etc/nginx
重点检查:
是否存在:
rewrite ... $1? ...
后面继续:
rewrite
if
set
十、修复方案(官方推荐)
方案 1:升级 NGINX(强烈推荐)
官方修复版本:
| 分支 |
安全版本 |
| Open Source |
1.30.1 |
| Mainline |
1.31.0 |
| NGINX Plus |
R37 |
Ubuntu/Debian 升级
apt update
apt install nginx
CentOS/RHEL
dnf update nginx
Docker 用户
重新拉取镜像:
docker pull nginx:1.31
然后:
docker compose up -d
十一、临时缓解方案(无法升级时)
如果短时间无法升级:
不要使用匿名捕获组
危险写法:
rewrite ^/user/(.*)$ /profile?id=$1? last;
改成:
使用命名捕获组
安全写法:
rewrite ^/user/(?<uid>.*)$ /profile?id=$uid last;
这是官方建议的重要缓解措施。
十二、推荐的 rewrite 安全规范
建议以后统一:
不使用:
$1
$2
$3
统一使用:
(?<name>)
例如:
rewrite ^/post/(?<id>\d+)$ /article?id=$id last;
十三、如何检测攻击痕迹?
查看 error.log
tail -f /var/log/nginx/error.log
关注:
signal 11
segmentation fault
worker process exited
malloc corruption
查看异常请求
grep "?" access.log
查看 worker 重启
journalctl -u nginx
十四、Kubernetes 用户尤其危险
很多:
ingress-nginx
镜像仍然内置:
NGINX 1.27.x
可能长期脆弱。
尤其:
- 已归档项目
- 无人维护镜像
- 第三方 Helm Chart
风险极高。
十五、这次漏洞最值得警惕的地方
这次 CVE 最震撼行业的点:
不是漏洞本身。
而是:
它是 AI 自动发现的。
研究人员表示:
AI 在数小时内:
这意味着:
未来:
“沉睡十几年”的漏洞
可能会被 AI 批量挖掘。
对运维、安全、DevOps 来说:
快速升级能力将越来越重要。
十六、最终建议
如果你正在运行:
- NGINX
- OpenResty
- ingress-nginx
- Kong
- APISIX
建议立即:
必做
- 升级到:
- 检查 rewrite 配置
- 替换
$1/$2
- 重启 worker
推荐额外措施
- 开启 ASLR
- 配置 WAF
- 开启 Crash 监控
- 增加日志告警
- 建立镜像升级机制
<p>2026 年 5 月,NGINX 官方披露了一个高危漏洞:</p>
<blockquote>
<p>CVE-2026-42945<br />
又被业内称为:NGINX Rift</p>
</blockquote>
<p>这是一个存在了 <strong>18 年</strong> 的漏洞,影响全球大量互联网服务、反向代理、Ingress 网关与 Kubernetes 集群。</p>
<p>更危险的是:</p>
<ul>
<li>攻击者无需登录</li>
<li>仅需构造恶意 HTTP 请求</li>
<li>即可触发:
<ul>
<li>Worker Crash(DoS)</li>
<li>Heap Buffer Overflow(堆溢出)</li>
<li>某些条件下甚至 Remote Code Execution(RCE)</li>
</ul>
</li>
</ul>
<p>漏洞公开后,安全圈几乎全线预警。</p>
<hr />
<h1><a id="_20"></a>一、漏洞基本信息</h1>
<table>
<thead>
<tr>
<th>项目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>CVE</td>
<td>CVE-2026-42945</td>
</tr>
<tr>
<td>漏洞名称</td>
<td>NGINX Rift</td>
</tr>
<tr>
<td>类型</td>
<td>Heap Buffer Overflow</td>
</tr>
<tr>
<td>影响组件</td>
<td>ngx_http_rewrite_module</td>
</tr>
<tr>
<td>影响版本</td>
<td>0.6.27 ~ 1.30.0</td>
</tr>
<tr>
<td>漏洞等级</td>
<td>High / Critical</td>
</tr>
<tr>
<td>CVSS v4</td>
<td>9.2</td>
</tr>
<tr>
<td>披露时间</td>
<td>2026-05-13</td>
</tr>
<tr>
<td>利用条件</td>
<td>特定 rewrite 配置</td>
</tr>
<tr>
<td>是否需要认证</td>
<td>不需要</td>
</tr>
<tr>
<td>是否可能 RCE</td>
<td>是</td>
</tr>
</tbody>
</table>
<hr />
<h1><a id="_40"></a>二、漏洞根源是什么?</h1>
<p>问题出现在:</p>
<pre><code class="lang-">ngx_http_rewrite_module
</code></pre>
<p>也就是:</p>
<pre><code class="lang-">rewrite
if
set
</code></pre>
<p>这些 NGINX URL 重写逻辑。</p>
<hr />
<h1><a id="_60"></a>三、触发漏洞的核心条件</h1>
<p>漏洞并不是“所有 NGINX 都会被打”。</p>
<p>必须满足:</p>
<h2><a id="_1_rewrite__66"></a>条件 1:使用 rewrite 指令</h2>
<p>例如:</p>
<pre><code class="lang-">rewrite ^/user/(.*)$ /profile?id=$1? last;
</code></pre>
<hr />
<h2><a id="_2_76"></a>条件 2:使用匿名捕获组</h2>
<p>即:</p>
<pre><code class="lang-">$1
$2
$3
</code></pre>
<p>这种 PCRE 捕获变量。</p>
<hr />
<h2><a id="_3replacement___90"></a>条件 3:replacement 中包含 <code>?</code></h2>
<p>例如:</p>
<pre><code class="lang-">/profile?id=$1?
</code></pre>
<p>这里的:</p>
<pre><code class="lang-">?
</code></pre>
<p>就是关键触发点。</p>
<hr />
<h2><a id="_4_rewrite__if__set_108"></a>条件 4:后面继续跟 rewrite / if / set</h2>
<p>例如:</p>
<pre><code class="lang-">rewrite ^/user/(.*)$ /profile?id=$1? last;
set $abc "test";
</code></pre>
<p>或者:</p>
<pre><code class="lang-">if ($http_user_agent ~* "curl") {
...
}
</code></pre>
<hr />
<h1><a id="_128"></a>四、漏洞原理(技术分析)</h1>
<p>NGINX 的 rewrite 模块内部有一套:</p>
<pre><code class="lang-">script engine
</code></pre>
<p>用于:</p>
<ul>
<li>动态拼接 URI</li>
<li>解析 <code>$1</code></li>
<li>处理 rewrite</li>
<li>执行 if/set</li>
</ul>
<p>它采用“两阶段执行”:</p>
<h2><a id="_145"></a>第一阶段</h2>
<p>计算:</p>
<pre><code class="lang-">需要分配多少内存
</code></pre>
<h2><a id="_153"></a>第二阶段</h2>
<p>真正写入字符串。</p>
<hr />
<p>但问题在于:</p>
<p>当:</p>
<ul>
<li>rewrite replacement 中有 <code>?</code></li>
<li>同时使用 <code>$1</code></li>
<li>后续还有 rewrite/if/set</li>
</ul>
<p>时:</p>
<h2><a id="_169"></a>第一阶段</h2>
<p>计算长度错误。</p>
<h2><a id="_173"></a>第二阶段</h2>
<p>实际写入超出申请内存。</p>
<p>最终导致:</p>
<pre><code class="lang-">Heap Buffer Overflow
</code></pre>
<p>即:</p>
<pre><code class="lang-">堆缓冲区溢出
</code></pre>
<hr />
<h1><a id="_193"></a>五、攻击效果</h1>
<h2><a id="1Worker_Crash_195"></a>1、Worker Crash(最容易)</h2>
<p>攻击者可发送特殊请求:</p>
<pre><code class="lang-">GET /user/AAAAAAA....
</code></pre>
<p>导致:</p>
<pre><code class="lang-">nginx worker process exited on signal 11
</code></pre>
<p>表现为:</p>
<ul>
<li>服务间歇性 502</li>
<li>worker 不断重启</li>
<li>CPU 飙升</li>
<li>连接抖动</li>
</ul>
<hr />
<h2><a id="2RCE_218"></a>2、远程代码执行(RCE)</h2>
<p>如果:</p>
<ul>
<li>ASLR 被关闭</li>
<li>堆布局可预测</li>
<li>存在可利用内存布局</li>
</ul>
<p>理论上:</p>
<p>攻击者可实现:</p>
<pre><code class="lang-">Remote Code Execution
</code></pre>
<p>即:</p>
<pre><code class="lang-">远程执行代码
</code></pre>
<hr />
<h1><a id="_244"></a>六、为什么这个漏洞这么危险?</h1>
<p>因为:</p>
<h2><a id="1NGINX__248"></a>1、NGINX 是互联网基础设施</h2>
<p>全球大量:</p>
<ul>
<li>Web 服务</li>
<li>API 网关</li>
<li>Kubernetes Ingress</li>
<li>CDN</li>
<li>WAF</li>
<li>Docker Gateway</li>
</ul>
<p>都基于 NGINX。</p>
<hr />
<h2><a id="2_18__263"></a>2、漏洞存在了 18 年</h2>
<p>官方披露:</p>
<p>该问题从:</p>
<pre><code class="lang-">2008 年
</code></pre>
<p>就已经存在。</p>
<hr />
<h2><a id="3_rewrite_279"></a>3、很多人喜欢写 rewrite</h2>
<p>尤其国内:</p>
<pre><code class="lang-">伪静态
SEO URL
PHP rewrite
</code></pre>
<p>使用极其广泛。</p>
<hr />
<h1><a id="_293"></a>七、哪些系统可能受影响?</h1>
<p>不仅是原生 NGINX。</p>
<p>还包括:</p>
<ul>
<li>Kubernetes ingress-nginx</li>
<li>OpenResty</li>
<li>Kong</li>
<li>APISIX</li>
<li>Tengine</li>
<li>Nginx Proxy Manager</li>
<li>各类云 WAF</li>
</ul>
<hr />
<h1><a id="_311"></a>八、如何检查是否受影响?</h1>
<h2><a id="_313"></a>查看版本</h2>
<pre><code class="lang-">nginx -v
</code></pre>
<p>如果:</p>
<pre><code class="lang-"><= 1.30.0
</code></pre>
<p>则属于受影响范围。</p>
<hr />
<h1><a id="_329"></a>九、危险配置排查</h1>
<h2><a id="_rewrite___331"></a>搜索 rewrite 中包含 <code>?</code></h2>
<pre><code class="lang-">grep -R "rewrite.*\\?" /etc/nginx
</code></pre>
<hr />
<h2><a id="_339"></a>搜索匿名捕获组</h2>
<pre><code class="lang-">grep -R '\$[1-9]' /etc/nginx
</code></pre>
<hr />
<h2><a id="_347"></a>重点检查:</h2>
<p>是否存在:</p>
<pre><code class="lang-">rewrite ... $1? ...
</code></pre>
<p>后面继续:</p>
<pre><code class="lang-">rewrite
if
set
</code></pre>
<hr />
<h1><a id="_365"></a>十、修复方案(官方推荐)</h1>
<h2><a id="_1_NGINX_367"></a>方案 1:升级 NGINX(强烈推荐)</h2>
<p>官方修复版本:</p>
<table>
<thead>
<tr>
<th>分支</th>
<th>安全版本</th>
</tr>
</thead>
<tbody>
<tr>
<td>Open Source</td>
<td>1.30.1</td>
</tr>
<tr>
<td>Mainline</td>
<td>1.31.0</td>
</tr>
<tr>
<td>NGINX Plus</td>
<td>R37</td>
</tr>
</tbody>
</table>
<hr />
<h2><a id="UbuntuDebian__381"></a>Ubuntu/Debian 升级</h2>
<pre><code class="lang-">apt update
apt install nginx
</code></pre>
<hr />
<h2><a id="CentOSRHEL_390"></a>CentOS/RHEL</h2>
<pre><code class="lang-">dnf update nginx
</code></pre>
<hr />
<h2><a id="Docker__398"></a>Docker 用户</h2>
<p>重新拉取镜像:</p>
<pre><code class="lang-">docker pull nginx:1.31
</code></pre>
<p>然后:</p>
<pre><code class="lang-">docker compose up -d
</code></pre>
<hr />
<h1><a id="_414"></a>十一、临时缓解方案(无法升级时)</h1>
<p>如果短时间无法升级:</p>
<h2><a id="_418"></a>不要使用匿名捕获组</h2>
<p>危险写法:</p>
<pre><code class="lang-">rewrite ^/user/(.*)$ /profile?id=$1? last;
</code></pre>
<hr />
<p>改成:</p>
<h2><a id="_430"></a>使用命名捕获组</h2>
<p>安全写法:</p>
<pre><code class="lang-">rewrite ^/user/(?<uid>.*)$ /profile?id=$uid last;
</code></pre>
<p>这是官方建议的重要缓解措施。</p>
<hr />
<h1><a id="_rewrite__442"></a>十二、推荐的 rewrite 安全规范</h1>
<p>建议以后统一:</p>
<h2><a id="_446"></a>不使用:</h2>
<pre><code class="lang-">$1
$2
$3
</code></pre>
<hr />
<h2><a id="_456"></a>统一使用:</h2>
<pre><code class="lang-">(?<name>)
</code></pre>
<p>例如:</p>
<pre><code class="lang-">rewrite ^/post/(?<id>\d+)$ /article?id=$id last;
</code></pre>
<hr />
<h1><a id="_470"></a>十三、如何检测攻击痕迹?</h1>
<h2><a id="_errorlog_472"></a>查看 error.log</h2>
<pre><code class="lang-">tail -f /var/log/nginx/error.log
</code></pre>
<p>关注:</p>
<pre><code class="lang-">signal 11
segmentation fault
worker process exited
malloc corruption
</code></pre>
<hr />
<h2><a id="_489"></a>查看异常请求</h2>
<pre><code class="lang-">grep "?" access.log
</code></pre>
<hr />
<h2><a id="_worker__497"></a>查看 worker 重启</h2>
<pre><code class="lang-">journalctl -u nginx
</code></pre>
<hr />
<h1><a id="Kubernetes__505"></a>十四、Kubernetes 用户尤其危险</h1>
<p>很多:</p>
<pre><code class="lang-">ingress-nginx
</code></pre>
<p>镜像仍然内置:</p>
<pre><code class="lang-">NGINX 1.27.x
</code></pre>
<p>可能长期脆弱。</p>
<p>尤其:</p>
<ul>
<li>已归档项目</li>
<li>无人维护镜像</li>
<li>第三方 Helm Chart</li>
</ul>
<p>风险极高。</p>
<hr />
<h1><a id="_531"></a>十五、这次漏洞最值得警惕的地方</h1>
<p>这次 CVE 最震撼行业的点:</p>
<p>不是漏洞本身。</p>
<p>而是:</p>
<blockquote>
<p>它是 AI 自动发现的。</p>
</blockquote>
<p>研究人员表示:</p>
<p>AI 在数小时内:</p>
<ul>
<li>自动分析代码</li>
<li>自动找到漏洞</li>
<li>自动定位可利用点</li>
</ul>
<p>这意味着:</p>
<p>未来:</p>
<pre><code class="lang-">“沉睡十几年”的漏洞
</code></pre>
<p>可能会被 AI 批量挖掘。</p>
<p>对运维、安全、DevOps 来说:</p>
<p>快速升级能力将越来越重要。</p>
<hr />
<h1><a id="_567"></a>十六、最终建议</h1>
<p>如果你正在运行:</p>
<ul>
<li>NGINX</li>
<li>OpenResty</li>
<li>ingress-nginx</li>
<li>Kong</li>
<li>APISIX</li>
</ul>
<p>建议立即:</p>
<h2><a id="_579"></a>必做</h2>
<ul>
<li>升级到:
<ul>
<li>1.30.1+</li>
<li>1.31.0+</li>
</ul>
</li>
<li>检查 rewrite 配置</li>
<li>替换 <code>$1/$2</code></li>
<li>重启 worker</li>
</ul>
<hr />
<h2><a id="_590"></a>推荐额外措施</h2>
<ul>
<li>开启 ASLR</li>
<li>配置 WAF</li>
<li>开启 Crash 监控</li>
<li>增加日志告警</li>
<li>建立镜像升级机制</li>
</ul>
评论区