CVE-2026-42945 是 NGINX 服务器中的一个严重堆缓冲区溢出漏洞,被称为 "NGINX Rift"。该漏洞存在于 NGINX 的 rewrite 和 set 指令处理逻辑中,当特定配置条件满足时,攻击者可以通过构造恶意请求触发堆溢出,导致拒绝服务(DoS)甚至潜在的远程代码执行(RCE)。
漏洞类型:堆缓冲区溢出 风险等级:高危 CVE ID:CVE-2026-42945
建议立即升级到以下版本之一:
漏洞触发需要同时满足以下两个条件:
配置条件:NGINX 配置中同时使用:
rewrite 指令(替换字符串中包含 ? 字符)set 指令(引用 rewrite 的正则捕获组,如 $1, $2)请求条件:请求 URI 中包含可转义字符(如 +, &, % 等)
原理说明:
rewrite 指令设置 e->is_args = 1(永不重置)set 指令的长度计算阶段使用全零子引擎(le.is_args = 0)%25 为 %,但 ngx_escape_uri 重新编码为 %25(3字节)%25 字符从 1 字节扩展为 3 字节,导致写入超出缓冲区边界# 使用项目中的测试脚本
python3 CVE-2026-42945/CVE-2026-42945-test.py --host cve.test.com --port 80
%25 字符的请求进行小规模测试%25 字符(如 2000 个)触发缓冲区溢出在单层 NGINX 配置中测试结果会触发漏洞:
崩溃日志分析:
ngx_http_script_flush_no_cacheable_variables 函数ngx_http_core_rewrite_phase在双层 NGINX(layer1 转发 + layer2 业务)配置中测试结果如下:
| 配置场景 | layer1 结果 | layer2 结果 | 原因分析 |
|---|---|---|---|
rewrite 无 break + proxy_pass | ❌ 触发漏洞(404) | ❌ 无请求到达 | rewrite 后继续执行 set 触发堆溢出,worker 崩溃 |
rewrite 有 break + proxy_pass | ✅ 正常(200) | ⚠️ 可能触发漏洞 | break 终止 set 执行,请求正常转发到后端 |
| 文件 | 说明 |
|---|---|
CVE-2026-42945/CVE-2026-42945-test.py | 漏洞测试 PoC 脚本,用于验证目标是否存在漏洞 |
single_layer_test/single_layer_nginx.conf | 单层架构易受攻击的 NGINX 配置示例 |
single_layer_test/image.png | 漏洞原理示意图 |
single_layer_test/test.log | 测试日志文件 |
double_layer_test/layer1_nginx.conf | 双层架构第一层(转发层)NGINX 配置 |
double_layer_test/layer2_nginx.conf | 双层架构第二层(业务层)NGINX 配置 |
本项目仅供安全研究和教育目的使用。使用者必须遵守所在国家和地区的法律法规。作者不对任何未经授权的滥用行为负责。
禁止用于非法攻击!
Last Updated: 2026-05-19