文章总结: CVE-2026-42945是NGINXngxhttprewrite_module模块中的高危堆缓冲区溢出漏洞,源于脚本引擎两阶段处理机制状态不一致。当rewrite指令含?后接set指令引用捕获组时,长度计算与实际拷贝阶段对URL参数转义处理差异导致堆溢出,影响0.6.27至1.30.0版本,可造成拒绝服务或远程代码执行。修复方案包括升级至1.31.0以上版本、修改配置避免捕获组使用或启用ASLR缓解风险。 综合评分: 85 文章分类: 漏洞分析,WEB安全,应急响应,解决方案,安全工具
CVE-2026-42945-NGINX-ngx_http_rewrite_module-堆缓冲区溢出分析报告
md-bot md-bot
Sec打更人
2026年5月14日 22:11 广东
在小说阅读器读本章
去阅读
# CVE-2026-42945 漏洞分析报告
**CVE编号:** CVE-2026-42945
**标题:** CVE-2026-42945-NGINX-ngx_http_rewrite_module-堆缓冲区溢出
**创建时间:** 2026-05-14T11:29:18.758049+08:00
## 漏洞描述
该漏洞是存在于NGINX ngx\_http\_rewrite\_module模块中的一个高危堆缓冲区溢出漏洞,CVE编号为CVE-2026-42945,代号’NGINX Rift’。漏洞的根源在于NGINX脚本引擎处理rewrite和set指令时的两阶段处理机制存在状态不一致问题。 **根本原因分析:** NGINX的脚本引擎执行配置指令(如rewrite、set)时,采用两阶段处理: 1. **第一阶段(长度计算)**:计算最终字符串所需的内存大小,以分配缓冲区。 2. **第二阶段(数据拷贝)**:将实际数据写入第一阶段分配的缓冲区。 漏洞的关键在于ngx\_http\_script\_start\_args\_code函数。当rewrite指令的替换字符串包含?时,此函数会被调用,它会将主脚本引擎(e)的is\_args标志永久设置为1,表示后续内容属于URL参数字符串。关键问题是,该标志在后续指令执行时**不会被重置**。 当后续的set指令引用了一个捕获组(如$1)时,在处理其长度计算时,会创建一个**全新的子引擎**(le)并通过ngx\_memzero初始化为全零。这意味着子引擎的is\_args标志为0。因此,在长度计算阶段(ngx\_http\_script\_copy\_capture\_len\_code),由于le.is\_args为0,即使请求中存在需要转义的字符(如+号),代码也会进入else分支,直接返回捕获组的原始长度。 然而,在第二阶段实际拷贝数据时,使用的是**主引擎**(e)。此时主引擎的is\_args标志仍为1。因此,在实际拷贝函数(ngx\_http\_script\_copy\_capture\_code)中,由于e->is\_args为1并且请求URI中存在需转义字符,代码会进入if分支,调用ngx\_escape\_uri函数对捕获内容进行URL编码转义。这个过程会将单个字符(如+)扩展为%2B(3个字符)或%20等,导致实际写入的数据量(例如90字节)远远大于第一阶段计算并分配的缓冲区大小(例如30字节),从而造成堆缓冲区溢出。 **影响:** 成功利用此漏洞可能导致NGINX worker进程崩溃(拒绝服务)。在ASLR被禁用的系统上,攻击者可以进一步利用堆溢出来覆盖相邻内存(如ngx\_pool\_t结构中的cleanup指针),进而实现远程代码执行。该漏洞影响广泛,从2008年发布的NGINX 0.6.27版本开始即存在,直至被修复前已潜伏约18年。
# CVE-2026-42945-NGINX-ngx_http_rewrite_module-堆缓冲区溢出
**漏洞类型:** 堆缓冲区溢出 (Heap-based Buffer Overflow)
**影响应用:** F5 NGINX Open Source 和 NGINX Plus
**危害等级:** 高危 (CVSS 3.1评分8.1), 在特定条件下可导致远程代码执行。攻击复杂性高,需满足特定配置模式和绕过ASLR。
**影响版本:** NGINX Open Source 0.6.27 至 1.30.0;NGINX Plus R32 至 R36 (R36 P4和R32 P6已修复)。
**利用条件:** 1. NGINX配置中必须存在特定的指令序列:一个rewrite指令后紧跟另一个rewrite、if或set指令,并且使用了未命名的PCRE捕获组(如$1, $2)。2. 前一个rewrite指令的替换字符串必须包含问号?。3. 攻击者可以发送包含特殊可转义字符(如+, &, %XX)的HTTP请求URI。4. 受害系统关闭了ASLR(地址空间布局随机化)或已通过其他方式绕过ASLR,才能实现代码执行;否则仅能造成拒绝服务。
**POC 可用性:** 是
**投毒风险:** 5%
**项目地址:** rheodev/CVE-2026-42945
**漏洞详情:** NVD数据库
## 详情
该漏洞是存在于NGINX ngx\_http\_rewrite\_module模块中的一个高危堆缓冲区溢出漏洞,CVE编号为CVE-2026-42945,代号’NGINX Rift’。漏洞的根源在于NGINX脚本引擎处理rewrite和set指令时的两阶段处理机制存在状态不一致问题。
**根本原因分析:**
NGINX的脚本引擎执行配置指令(如rewrite、set)时,采用两阶段处理:
- **第一阶段(长度计算)**:计算最终字符串所需的内存大小,以分配缓冲区。
- **第二阶段(数据拷贝)**:将实际数据写入第一阶段分配的缓冲区。
漏洞的关键在于ngx\_http\_script\_start\_args\_code函数。当rewrite指令的替换字符串包含?时,此函数会被调用,它会将主脚本引擎(e)的is\_args标志永久设置为1,表示后续内容属于URL参数字符串。关键问题是,该标志在后续指令执行时**不会被重置**。
当后续的set指令引用了一个捕获组(如$1)时,在处理其长度计算时,会创建一个**全新的子引擎**(le)并通过ngx\_memzero初始化为全零。这意味着子引擎的is\_args标志为0。因此,在长度计算阶段(ngx\_http\_script\_copy\_capture\_len\_code),由于le.is\_args为0,即使请求中存在需要转义的字符(如+号),代码也会进入else分支,直接返回捕获组的原始长度。
然而,在第二阶段实际拷贝数据时,使用的是**主引擎**(e)。此时主引擎的is\_args标志仍为1。因此,在实际拷贝函数(ngx\_http\_script\_copy\_capture\_code)中,由于e->is\_args为1并且请求URI中存在需转义字符,代码会进入if分支,调用ngx\_escape\_uri函数对捕获内容进行URL编码转义。这个过程会将单个字符(如+)扩展为%2B(3个字符)或%20等,导致实际写入的数据量(例如90字节)远远大于第一阶段计算并分配的缓冲区大小(例如30字节),从而造成堆缓冲区溢出。
**影响:**
成功利用此漏洞可能导致NGINX worker进程崩溃(拒绝服务)。在ASLR被禁用的系统上,攻击者可以进一步利用堆溢出来覆盖相邻内存(如ngx\_pool\_t结构中的cleanup指针),进而实现远程代码执行。该漏洞影响广泛,从2008年发布的NGINX 0.6.27版本开始即存在,直至被修复前已潜伏约18年。
## 漏洞利用
提供的PoC代码清晰、详细且准确地复现了漏洞的根本原因和利用条件,是**有效**的安全研究和验证工具。代码通过构建一个包含特定指令序列的NGINX配置,并构造包含大量+号等可转义字符的URI来触发堆溢出。
**利用方式与攻击流程:**
- **环境准备**:使用提供的
Dockerfile和nginx.conf搭建一个存在漏洞的NGINX服务器。该配置模拟了关键的触发条件:location ~ ^/api/(.\*)$ { rewrite ^/api/(.\*)$ /internal?migrated=true; set $original\_endpoint $1; }。 - **触发漏洞(DoS)**:攻击者向服务器发送一个精心构造的HTTP请求,例如
GET /api/+++++++++++++++++++++++++++++++++++ HTTP/1.1。URI中包含大量+号。当NGINX处理此请求时,如前所述,set指令在处理$1捕获组时,长度计算与实际拷贝不一致,导致堆溢出,通常直接导致worker进程因SIGSEGV而崩溃。 - **远程代码执行(RCE)**:PoC中的
exploit\_diagram.txt详细描述了RCE的理论攻击链,但这需要更严格的前提条件(ASLR禁用或绕过)。其流程大致为:
- 堆布局控制:攻击者通过打开并部分发送HTTP请求头,在NGINX的内存池中创建并安排两个相邻的内存池(
pool_A和pool_B)。 - 堆喷射:通过发送包含恶意数据的POST请求体,在堆上喷射大量伪造的
ngx_pool_cleanup_s结构。这些结构包含一个指向system函数的handler字段和指向攻击者命令(如touch /pwned)的data字段。 - 溢出触发:发送触发溢出的请求(如上述包含大量
+号的请求),使pool_A的缓冲区溢出并覆盖相邻pool_B的cleanup链表指针,使其指向预先布置好的伪造cleanup结构。 - 触发执行:攻击者关闭连接B,导致NGINX调用
ngx_destroy_pool(pool_B)。该函数会遍历pool_B->cleanup链表,但此时已被覆盖,从而调用伪造结构中的handler(data),即执行`system(
## 修复建议
**1. 官方修复:**
F5官方已发布安全更新和补丁来解决此问题。受影响的用户应立即升级到以下修复版本:
- NGINX Open Source:升级到1.31.0或更高版本。
- NGINX Plus:升级到R37或更高版本;或者应用R36 P4、R32 P6补丁。
- 其他受影响产品:NGINX Instance Manager、F5 WAF for NGINX、NGINX App Protect WAF、NGINX Gateway Fabric和NGINX Ingress Controller的用户,应查阅F5官方安全公告(K000161019)并升级到相应修复版本。
**2. 临时缓解措施:**
如果无法立即升级,可以采取以下措施降低风险:
- 修改配置:避免在
rewrite、if或set指令链中使用未命名的PCRE捕获组。如果可能,将配置逻辑改为不使用这种特定的指令组合。 - 启用并加固ASLR:确保操作系统和NGINX worker进程的ASLR功能已启用且正常工作。这可以显著提高利用RCE的难度,使攻击效果降级为拒绝服务。
- 限制访问:通过防火墙、访问控制列表(ACL)或其他网络隔离措施,限制对受影响的NGINX服务器的非必要网络访问,特别是如果这些服务暴露在公网上。
- WAF规则:如果使用了Web应用防火墙(如F5 Advanced WAF/ASM),可以配置自定义签名或规则来检测和拦截包含大量编码字符(如
+、%XX)且可能匹配特定URI模式的请求。
**3. 长远的加固方法:**
- 及时更新:建立严格的补丁管理制度,密切关注NGINX及所有第三方组件的安全公告,并尽快应用安全更新。
- 最小化配置:遵循最小权限原则,只加载和运行必要的NGINX模块,避免使用复杂的重写规则,尤其是涉及正则表达式捕获和交叉引用的场景。
- 内存安全实践:在涉及如NGINX这样的C语言项目时,其安全高度依赖于代码实践。关注上游项目的代码审查和安全审计报告。
- 纵深防御:不要仅依赖单一安全措施。结合使用网络隔离、入侵检测/防御系统、WAF、最小权限和及时补丁等多层防护,可以大幅降低被成功利用的风险。
## 相关仓库
### 1. RyosukeDTomita/CVE-2026-42945
**URL:** https://github.com/RyosukeDTomita/CVE-2026-42945
**描述:** 仓库地址:https://github.com/RyosukeDTomita/CVE-2026-42945
### 2. DepthFirstDisclosures/Nginx-Rift
**URL:** https://github.com/DepthFirstDisclosures/Nginx-Rift
**描述:** exploit for CVE-2026-42945
### 3. p3Nt3st3r-sTAr/CVE-2026-42945-POC
**URL:** https://github.com/p3Nt3st3r-sTAr/CVE-2026-42945-POC
**描述:** 仓库地址:https://github.com/p3Nt3st3r-sTAr/CVE-2026-42945-POC
### 4. friparia/NGINX_RIFT_SCAN_CVE_2026_42945
**URL:** https://github.com/friparia/NGINX_RIFT_SCAN_CVE_2026_42945
**描述:** Scan Nginx Rift (CVE-2026-42945)
### 5. enclave-ai/nginx-rift-scanner
**URL:** https://github.com/enclave-ai/nginx-rift-scanner
**描述:** Scanner for CVE-2026-42945 — nginx heap overflow via rewrite+set is_args mismatch (affects nginx 0.6.27–1.30.0)
### 6. realityone/cve-2026-42945-scan
**URL:** https://github.com/realityone/cve-2026-42945-scan
**描述:** Scan your NGINX configuration to determine whether it is affected by CVE-2026-42945.
### 7. cipherspy/CVE-2026-42945-POC
**URL:** https://github.com/cipherspy/CVE-2026-42945-POC
**描述:** exploit for CVE-2026-42945
### 8. nanwinata/nginxrift-CVE-2026-42945
**URL:** https://github.com/nanwinata/nginxrift-CVE-2026-42945
**描述:** 仓库地址:https://github.com/nanwinata/nginxrift-CVE-2026-42945
### 9. rheodev/CVE-2026-42945
**URL:** https://github.com/rheodev/CVE-2026-42945
**描述:** NGINX Rift 漏洞分析与复现
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Sec打更人 md-bot md-bot《CVE-2026-42945-NGINX-ngxhttprewrite_module-堆缓冲区溢出分析报告》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论