欢迎光临
我们一直在努力

【运维安全】CVE-2026-42945:Nginx “Rift“ 漏洞深度解析与紧急修复指南

CVE-2026-42945:Nginx “Rift” 漏洞深度解析与紧急修复指南

💡 摘要: 2026年5月,安全研究机构 depthfirst 披露了潜伏18年的 Nginx 高危漏洞 CVE-2026-42945(别名 NGINX Rift),CVSS 评分高达 9.2。该堆缓冲区溢出漏洞影响 Nginx 0.6.27 至 1.30.0 全系列版本,全球约 570 万台服务器面临威胁,中国受影响网站超 254 万。本文深度剖析漏洞原理、攻击链路、影响范围,提供完整的修复方案、临时缓解措施和生产环境最佳实践,帮助运维团队快速应对这场全网级安全危机。

🎯 背景与痛点

AI 挖出 18 年漏洞,全球震动

【P0 级告警】检测到针对 Nginx CVE-2026-42945 的攻击尝试
时间: 2026-05-18 14:23:15
源 IP: 198.51.100.42 (境外)
目标: /api/users?id=1%2B%2B%2B…
状态: Nginx worker 进程崩溃并重启
影响: 服务短暂中断,可能已触发 RCE

作为安全负责人,你收到这条告警时心头一紧——攻击者正在利用这个潜伏 18 年的漏洞发起攻击!

三个真实场景

场景 1: 电商平台服务中断

某大型电商平台的 Nginx 反向代理遭遇特制 HTTP 请求攻击:

GET /products?category=electronics%2B%2B%2B%2B%2B HTTP/1.1
Host: shop.example.com
User-Agent: Mozilla/5.0

Nginx rewrite 模块处理 URI 时触发堆缓冲区溢出,worker 进程崩溃。虽然主进程自动重启了新 worker,但导致:

  • ⚠️ 服务短暂中断(3-5 秒)
  • ⚠️ 用户请求失败率飙升
  • ⚠️ 订单流失损失约 50 万元/小时

场景 2: 云服务商大规模故障

某云服务提供商的 10 万+ Nginx 实例同时遭受自动化扫描攻击:

#mermaid-svg-EE3d9jQ0Uelb7wuF{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EE3d9jQ0Uelb7wuF .error-icon{fill:#552222;}#mermaid-svg-EE3d9jQ0Uelb7wuF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EE3d9jQ0Uelb7wuF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .marker.cross{stroke:#333333;}#mermaid-svg-EE3d9jQ0Uelb7wuF svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EE3d9jQ0Uelb7wuF p{margin:0;}#mermaid-svg-EE3d9jQ0Uelb7wuF .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .cluster-label text{fill:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .cluster-label span{color:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .cluster-label span p{background-color:transparent;}#mermaid-svg-EE3d9jQ0Uelb7wuF .label text,#mermaid-svg-EE3d9jQ0Uelb7wuF span{fill:#333;color:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .node rect,#mermaid-svg-EE3d9jQ0Uelb7wuF .node circle,#mermaid-svg-EE3d9jQ0Uelb7wuF .node ellipse,#mermaid-svg-EE3d9jQ0Uelb7wuF .node polygon,#mermaid-svg-EE3d9jQ0Uelb7wuF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .rough-node .label text,#mermaid-svg-EE3d9jQ0Uelb7wuF .node .label text,#mermaid-svg-EE3d9jQ0Uelb7wuF .image-shape .label,#mermaid-svg-EE3d9jQ0Uelb7wuF .icon-shape .label{text-anchor:middle;}#mermaid-svg-EE3d9jQ0Uelb7wuF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .rough-node .label,#mermaid-svg-EE3d9jQ0Uelb7wuF .node .label,#mermaid-svg-EE3d9jQ0Uelb7wuF .image-shape .label,#mermaid-svg-EE3d9jQ0Uelb7wuF .icon-shape .label{text-align:center;}#mermaid-svg-EE3d9jQ0Uelb7wuF .node.clickable{cursor:pointer;}#mermaid-svg-EE3d9jQ0Uelb7wuF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .arrowheadPath{fill:#333333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EE3d9jQ0Uelb7wuF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EE3d9jQ0Uelb7wuF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EE3d9jQ0Uelb7wuF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EE3d9jQ0Uelb7wuF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .cluster text{fill:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF .cluster span{color:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EE3d9jQ0Uelb7wuF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EE3d9jQ0Uelb7wuF rect.text{fill:none;stroke-width:0;}#mermaid-svg-EE3d9jQ0Uelb7wuF .icon-shape,#mermaid-svg-EE3d9jQ0Uelb7wuF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EE3d9jQ0Uelb7wuF .icon-shape p,#mermaid-svg-EE3d9jQ0Uelb7wuF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EE3d9jQ0Uelb7wuF .icon-shape .label rect,#mermaid-svg-EE3d9jQ0Uelb7wuF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EE3d9jQ0Uelb7wuF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EE3d9jQ0Uelb7wuF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EE3d9jQ0Uelb7wuF :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

发送特制请求

攻击者

Nginx 集群10万+实例

Worker 进程批量崩溃

主进程重启 Worker

服务抖动

客户投诉激增

  • ⚠️ 数千个客户业务受影响
  • ⚠️ SLA 违约赔偿数百万
  • ⚠️ 品牌声誉严重受损

场景 3: 政府网站被植入后门

在某关闭 ASLR 保护的老旧服务器上,攻击者成功实现远程代码执行:

# 攻击者获取 shell 权限
$ whoami
www-data

# 植入 Webshell
$ echo '<?php system($_GET["cmd"]); ?>' > /var/www/html/shell.php

  • ⚠️ 敏感数据泄露
  • ⚠️ 服务器被控制
  • ⚠️ 面临合规处罚

为什么这个漏洞如此危险?

维度说明
潜伏时间 18 年(2008-2026),代码库中埋藏极深
影响范围 Nginx 0.6.27 – 1.30.0,全球 570 万台服务器
严重程度 CVSS 9.2(高危),可导致 RCE
利用难度 DoS 极易,RCE 需特定条件但仍可行
野外利用 已确认遭主动攻击,VulnCheck 蜜罐捕获
PoC 公开 depthfirst 已发布完整利用代码

📖 漏洞原理深度剖析

CVE-2026-42945 基本信息

属性值
CVE 编号 CVE-2026-42945
漏洞名称 NGINX Rift
CVSS v4.0 9.2 (Critical)
影响版本 Nginx 0.6.27 – 1.30.0, Nginx Plus R32-R36
修复版本 Nginx 1.30.1+, 1.31.0+
漏洞类型 堆缓冲区溢出 (Heap Buffer Overflow)
漏洞组件 ngx_http_rewrite_module
攻击向量 网络远程,无需认证
发现者 depthfirst AI 安全系统
披露日期 2026-05-13

技术根因分析

1. Rewrite 模块的两阶段处理缺陷

Nginx rewrite 模块在处理 URI 时采用两阶段机制:

// 简化伪代码 – ngx_http_rewrite_module.c

// 第一阶段:计算所需缓冲区大小
size_t calculated_size = calculate_uri_length(original_uri);

// 分配缓冲区
u_char *buffer = ngx_palloc(pool, calculated_size);

// 第二阶段:实际写入数据(URI 转义处理)
ngx_escape_uri(buffer, original_uri, ...);

关键缺陷:

内存分配器

Rewrite 模块

Nginx Worker

客户端

内存分配器

Rewrite 模块

Nginx Worker

客户端

#mermaid-svg-vS2WtMidISrxs1GK{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vS2WtMidISrxs1GK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vS2WtMidISrxs1GK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vS2WtMidISrxs1GK .error-icon{fill:#552222;}#mermaid-svg-vS2WtMidISrxs1GK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vS2WtMidISrxs1GK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vS2WtMidISrxs1GK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vS2WtMidISrxs1GK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vS2WtMidISrxs1GK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vS2WtMidISrxs1GK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vS2WtMidISrxs1GK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vS2WtMidISrxs1GK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vS2WtMidISrxs1GK .marker.cross{stroke:#333333;}#mermaid-svg-vS2WtMidISrxs1GK svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vS2WtMidISrxs1GK p{margin:0;}#mermaid-svg-vS2WtMidISrxs1GK .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-vS2WtMidISrxs1GK text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-vS2WtMidISrxs1GK .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-vS2WtMidISrxs1GK .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-vS2WtMidISrxs1GK .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-vS2WtMidISrxs1GK .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-vS2WtMidISrxs1GK #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-vS2WtMidISrxs1GK .sequenceNumber{fill:white;}#mermaid-svg-vS2WtMidISrxs1GK #sequencenumber{fill:#333;}#mermaid-svg-vS2WtMidISrxs1GK #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-vS2WtMidISrxs1GK .messageText{fill:#333;stroke:none;}#mermaid-svg-vS2WtMidISrxs1GK .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-vS2WtMidISrxs1GK .labelText,#mermaid-svg-vS2WtMidISrxs1GK .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-vS2WtMidISrxs1GK .loopText,#mermaid-svg-vS2WtMidISrxs1GK .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-vS2WtMidISrxs1GK .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-vS2WtMidISrxs1GK .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-vS2WtMidISrxs1GK .noteText,#mermaid-svg-vS2WtMidISrxs1GK .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-vS2WtMidISrxs1GK .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-vS2WtMidISrxs1GK .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-vS2WtMidISrxs1GK .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-vS2WtMidISrxs1GK .actorPopupMenu{position:absolute;}#mermaid-svg-vS2WtMidISrxs1GK .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-vS2WtMidISrxs1GK .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-vS2WtMidISrxs1GK .actor-man circle,#mermaid-svg-vS2WtMidISrxs1GK line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-vS2WtMidISrxs1GK :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

按原始长度计算

未考虑转义膨胀

特殊字符从1字节

膨胀到3字节

GET /path?a=%2B%2B%2B

处理 rewrite 规则

计算缓冲区大小

返回小尺寸 buffer

写入转义后数据

⚠️ 堆缓冲区溢出!

❌ Worker 崩溃

核心问题:

  • 长度计算不一致: 第一阶段按原始 URI 长度计算缓冲区大小
  • 转义膨胀未考虑: 特殊字符(+、%、&等)在转义时从 1 字节膨胀到 3 字节
  • 边界检查缺失: 写入时未验证是否超出分配的缓冲区
  • 18 年历史: 该缺陷最早可追溯至 2008 年的代码提交
  • 2. 攻击链路演示

    #mermaid-svg-lbN9rl66sVXsExUF{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lbN9rl66sVXsExUF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lbN9rl66sVXsExUF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lbN9rl66sVXsExUF .error-icon{fill:#552222;}#mermaid-svg-lbN9rl66sVXsExUF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lbN9rl66sVXsExUF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lbN9rl66sVXsExUF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lbN9rl66sVXsExUF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lbN9rl66sVXsExUF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lbN9rl66sVXsExUF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lbN9rl66sVXsExUF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lbN9rl66sVXsExUF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lbN9rl66sVXsExUF .marker.cross{stroke:#333333;}#mermaid-svg-lbN9rl66sVXsExUF svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lbN9rl66sVXsExUF p{margin:0;}#mermaid-svg-lbN9rl66sVXsExUF .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-lbN9rl66sVXsExUF .cluster-label text{fill:#333;}#mermaid-svg-lbN9rl66sVXsExUF .cluster-label span{color:#333;}#mermaid-svg-lbN9rl66sVXsExUF .cluster-label span p{background-color:transparent;}#mermaid-svg-lbN9rl66sVXsExUF .label text,#mermaid-svg-lbN9rl66sVXsExUF span{fill:#333;color:#333;}#mermaid-svg-lbN9rl66sVXsExUF .node rect,#mermaid-svg-lbN9rl66sVXsExUF .node circle,#mermaid-svg-lbN9rl66sVXsExUF .node ellipse,#mermaid-svg-lbN9rl66sVXsExUF .node polygon,#mermaid-svg-lbN9rl66sVXsExUF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lbN9rl66sVXsExUF .rough-node .label text,#mermaid-svg-lbN9rl66sVXsExUF .node .label text,#mermaid-svg-lbN9rl66sVXsExUF .image-shape .label,#mermaid-svg-lbN9rl66sVXsExUF .icon-shape .label{text-anchor:middle;}#mermaid-svg-lbN9rl66sVXsExUF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lbN9rl66sVXsExUF .rough-node .label,#mermaid-svg-lbN9rl66sVXsExUF .node .label,#mermaid-svg-lbN9rl66sVXsExUF .image-shape .label,#mermaid-svg-lbN9rl66sVXsExUF .icon-shape .label{text-align:center;}#mermaid-svg-lbN9rl66sVXsExUF .node.clickable{cursor:pointer;}#mermaid-svg-lbN9rl66sVXsExUF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lbN9rl66sVXsExUF .arrowheadPath{fill:#333333;}#mermaid-svg-lbN9rl66sVXsExUF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lbN9rl66sVXsExUF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lbN9rl66sVXsExUF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lbN9rl66sVXsExUF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lbN9rl66sVXsExUF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lbN9rl66sVXsExUF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lbN9rl66sVXsExUF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lbN9rl66sVXsExUF .cluster text{fill:#333;}#mermaid-svg-lbN9rl66sVXsExUF .cluster span{color:#333;}#mermaid-svg-lbN9rl66sVXsExUF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lbN9rl66sVXsExUF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lbN9rl66sVXsExUF rect.text{fill:none;stroke-width:0;}#mermaid-svg-lbN9rl66sVXsExUF .icon-shape,#mermaid-svg-lbN9rl66sVXsExUF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lbN9rl66sVXsExUF .icon-shape p,#mermaid-svg-lbN9rl66sVXsExUF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lbN9rl66sVXsExUF .icon-shape .label rect,#mermaid-svg-lbN9rl66sVXsExUF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lbN9rl66sVXsExUF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lbN9rl66sVXsExUF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lbN9rl66sVXsExUF :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    已启用

    已禁用

    构造恶意 URI

    触发 rewrite 规则

    长度计算错误

    缓冲区过小

    转义后数据溢出

    ASLR 状态

    DoS: Worker 崩溃

    RCE: 任意代码执行

    攻击步骤:

  • 构造恶意 URI: 包含大量特殊字符(如 %2B 表示 +)
  • 触发 rewrite 规则: 需要特定的 Nginx 配置(使用 $1、$2 等 PCRE 捕获变量)
  • 长度计算错误: rewrite 模块低估了转义后的实际长度
  • 缓冲区溢出: 转义后的数据超出分配的堆内存
  • 利用结果:
    • ASLR 启用 → Worker 崩溃(DoS)
    • ASLR 禁用 + 特定配置 → 远程代码执行(RCE)
  • 3. RCE 利用条件

    要实现远程代码执行,需满足以下苛刻条件:

    ✅ 必要条件:

    1. **特定 Nginx 配置**
    ```nginx
    location /api {
    rewrite ^/api/(.*)$ /backend/$1 last; # 使用 $1 捕获变量
    set $custom_var $arg_id; # 使用 set 指令
    if ($custom_var ~* "^admin") { # 使用 if 条件
    proxy_pass http://backend;
    }
    }

  • ASLR 已禁用

    # 检查 ASLR 状态
    cat /proc/sys/kernel/randomize_va_space
    # 返回 0 表示禁用,2 表示完全启用

    # 大多数现代 Linux 发行版默认启用 ASLR

  • 攻击者知晓配置细节

    • 需要了解具体的 rewrite 规则
    • 需要知道 PCRE 捕获变量的使用方式
  • 专家观点:

    安全研究员 Kevin Beaumont: “要实现 RCE,不仅需要特定配置,攻击者还需知晓该配置细节。若系统启用 ASLR(所有受支持的 AlmaLinux 版本默认开启),则难以实现稳定的漏洞利用。”

    AlmaLinux 维护团队: “虽然完整利用存在难度,但导致工作进程崩溃的拒绝服务攻击已具备足够威胁性,建议用户紧急处理。”

    影响范围评估

    直接受影响版本
    产品线受影响版本安全版本
    Nginx Open Source 0.6.27 – 1.30.0 ≥ 1.30.1 或 ≥ 1.31.0
    Nginx Plus R32 – R36 R37+
    Nginx Gateway Fabric 所有版本 等待官方补丁
    Nginx WAF 模块 所有版本 等待官方补丁
    环境风险评估

    高风险场景:

    • ✅ 使用 rewrite 规则且包含 PCRE 捕获变量($1、$2)
    • ✅ 关闭 ASLR 保护的老旧系统
    • ✅ 公网暴露的 Nginx 实例
    • ✅ 处理用户可控的 URI 参数

    低风险场景:

    • ✅ 未使用 rewrite 模块
    • ✅ 仅使用简单重定向(无捕获变量)
    • ✅ 内网隔离环境
    • ✅ 已升级到安全版本
    全球影响统计

    #mermaid-svg-ryhUx5aPWqBcIXvj{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ryhUx5aPWqBcIXvj .error-icon{fill:#552222;}#mermaid-svg-ryhUx5aPWqBcIXvj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ryhUx5aPWqBcIXvj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ryhUx5aPWqBcIXvj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ryhUx5aPWqBcIXvj .marker.cross{stroke:#333333;}#mermaid-svg-ryhUx5aPWqBcIXvj svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ryhUx5aPWqBcIXvj p{margin:0;}#mermaid-svg-ryhUx5aPWqBcIXvj .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-ryhUx5aPWqBcIXvj .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-ryhUx5aPWqBcIXvj .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-ryhUx5aPWqBcIXvj .slice{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-ryhUx5aPWqBcIXvj .legend text{fill:#000000;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-ryhUx5aPWqBcIXvj :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    45%

    32%

    17%

    7%

    CVE-2026-42945 全球影响分布

    中国

    美国

    欧洲

    其他地区

    • 全球受影响服务器: 约 570 万台
    • 中国受影响网站: 超 254 万个
    • 野外攻击尝试: VulnCheck 蜜罐已捕获多次攻击

    🔧 修复方案总览

    方案对比矩阵

    方案难度效果停机时间适用场景推荐度
    升级 Nginx ⭐⭐ ⭐⭐⭐⭐⭐ 5-10 分钟 所有环境 🏆 首选
    WAF 拦截 ⭐⭐⭐⭐ 有 WAF 基础设施 ⭐⭐⭐⭐
    修改配置 ⭐⭐ ⭐⭐⭐ 无法立即升级 ⭐⭐⭐
    启用 ASLR ⭐⭐⭐ 重启生效 Linux 系统 ⭐⭐⭐⭐
    限制访问 ⭐⭐ 临时应急 ⭐⭐

    决策树

    #mermaid-svg-D0AjdotdBjZX2KRQ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-D0AjdotdBjZX2KRQ .error-icon{fill:#552222;}#mermaid-svg-D0AjdotdBjZX2KRQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-D0AjdotdBjZX2KRQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-D0AjdotdBjZX2KRQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-D0AjdotdBjZX2KRQ .marker.cross{stroke:#333333;}#mermaid-svg-D0AjdotdBjZX2KRQ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-D0AjdotdBjZX2KRQ p{margin:0;}#mermaid-svg-D0AjdotdBjZX2KRQ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ .cluster-label text{fill:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ .cluster-label span{color:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ .cluster-label span p{background-color:transparent;}#mermaid-svg-D0AjdotdBjZX2KRQ .label text,#mermaid-svg-D0AjdotdBjZX2KRQ span{fill:#333;color:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ .node rect,#mermaid-svg-D0AjdotdBjZX2KRQ .node circle,#mermaid-svg-D0AjdotdBjZX2KRQ .node ellipse,#mermaid-svg-D0AjdotdBjZX2KRQ .node polygon,#mermaid-svg-D0AjdotdBjZX2KRQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-D0AjdotdBjZX2KRQ .rough-node .label text,#mermaid-svg-D0AjdotdBjZX2KRQ .node .label text,#mermaid-svg-D0AjdotdBjZX2KRQ .image-shape .label,#mermaid-svg-D0AjdotdBjZX2KRQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-D0AjdotdBjZX2KRQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-D0AjdotdBjZX2KRQ .rough-node .label,#mermaid-svg-D0AjdotdBjZX2KRQ .node .label,#mermaid-svg-D0AjdotdBjZX2KRQ .image-shape .label,#mermaid-svg-D0AjdotdBjZX2KRQ .icon-shape .label{text-align:center;}#mermaid-svg-D0AjdotdBjZX2KRQ .node.clickable{cursor:pointer;}#mermaid-svg-D0AjdotdBjZX2KRQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-D0AjdotdBjZX2KRQ .arrowheadPath{fill:#333333;}#mermaid-svg-D0AjdotdBjZX2KRQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-D0AjdotdBjZX2KRQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-D0AjdotdBjZX2KRQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D0AjdotdBjZX2KRQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-D0AjdotdBjZX2KRQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D0AjdotdBjZX2KRQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-D0AjdotdBjZX2KRQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-D0AjdotdBjZX2KRQ .cluster text{fill:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ .cluster span{color:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-D0AjdotdBjZX2KRQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-D0AjdotdBjZX2KRQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-D0AjdotdBjZX2KRQ .icon-shape,#mermaid-svg-D0AjdotdBjZX2KRQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D0AjdotdBjZX2KRQ .icon-shape p,#mermaid-svg-D0AjdotdBjZX2KRQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-D0AjdotdBjZX2KRQ .icon-shape .label rect,#mermaid-svg-D0AjdotdBjZX2KRQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D0AjdotdBjZX2KRQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-D0AjdotdBjZX2KRQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-D0AjdotdBjZX2KRQ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    发现漏洞

    能否立即升级?

    升级到安全版本

    是否有 WAF?

    WAF 添加防护规则

    是否使用 rewrite?

    修改 rewrite 配置

    风险较低,计划升级

    验证修复效果

    启用 ASLR + 监控告警


    🔧 方案一:升级 Nginx(强烈推荐)

    步骤 1:确认当前版本

    # 查看 Nginx 版本
    nginx -v

    # 输出示例:
    # nginx version: nginx/1.28.0 # ⚠️ 低于安全版本 1.30.1

    步骤 2:备份配置

    # 备份配置文件
    sudo cp -r /etc/nginx /etc/nginx.backup.$(date +%Y%m%d)

    # 备份自定义模块
    sudo cp /usr/sbin/nginx /usr/sbin/nginx.backup.$(date +%Y%m%d)

    # 记录当前配置
    nginx -T > /tmp/nginx-config-backup.txt

    步骤 3:升级到安全版本

    Ubuntu/Debian

    # 添加 Nginx 官方仓库
    sudo apt-get install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

    curl https://nginx.org/keys/nginx_signing.key | gpg –dearmor \\
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\
    http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx"
    \\
    | sudo tee /etc/apt/sources.list.d/nginx.list

    # 更新并安装
    sudo apt-get update
    sudo apt-get install nginx=1.30.1-1~$(lsb_release -cs)

    # 验证版本
    nginx -v
    # 应输出: nginx version: nginx/1.30.1

    CentOS/RHEL

    # 创建仓库文件
    sudo vi /etc/yum.repos.d/nginx.repo

    # 添加以下内容:
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    # 安装
    sudo yum makecache
    sudo yum install nginx-1.30.1

    # 验证版本
    nginx -v

    源码编译安装

    # 下载源码
    wget https://nginx.org/download/nginx-1.30.1.tar.gz
    tar -zxvf nginx-1.30.1.tar.gz
    cd nginx-1.30.1

    # 配置(保留原有编译选项)
    ./configure –prefix=/etc/nginx \\
    –sbin-path=/usr/sbin/nginx \\
    –modules-path=/usr/lib64/nginx/modules \\
    –conf-path=/etc/nginx/nginx.conf \\
    –error-log-path=/var/log/nginx/error.log \\
    –http-log-path=/var/log/nginx/access.log \\
    –pid-path=/var/run/nginx.pid \\
    –with-http_ssl_module \\
    –with-http_v2_module \\
    # … 其他原有选项

    # 编译安装
    make -j$(nproc)
    sudo make install

    # 验证
    nginx -v

    步骤 4:平滑重启

    # 测试配置语法
    sudo nginx -t

    # 平滑重启(不中断服务)
    sudo nginx -s reload

    # 或使用 systemd
    sudo systemctl reload nginx

    步骤 5:验证修复效果

    # 1. 确认版本
    nginx -v
    # 应显示: nginx/1.30.1 或更高

    # 2. 检查服务状态
    sudo systemctl status nginx

    # 3. 测试业务功能
    curl -I https://your-domain.com

    # 4. 监控日志
    tail -f /var/log/nginx/error.log

    ⚠️ 常见问题

    问题 1:升级后配置不兼容

    # 错误信息:
    # nginx: [emerg] unknown directive "xxx" in /etc/nginx/conf.d/xxx.conf:10

    解决方案:

    # 回滚到备份版本
    sudo cp /etc/nginx.backup.*/nginx.conf /etc/nginx/nginx.conf
    sudo systemctl restart nginx

    # 逐步迁移配置,排查不兼容项

    问题 2:模块丢失

    # 错误信息:
    # nginx: [emerg] module "xxx_module" is not loaded

    解决方案:

    # 重新编译时包含原有模块
    ./configure –with-xxx-module ...

    # 或安装对应模块包
    sudo apt-get install libnginx-mod-xxx

    问题 3:依赖冲突

    # 错误信息:
    # Depends: libssl1.1 but it is not installable

    解决方案:

    # 更新系统依赖
    sudo apt-get update
    sudo apt-get upgrade

    # 或使用 Nginx 官方仓库(已解决依赖)


    🔧 方案二:WAF 防护规则(临时缓解)

    如果无法立即升级,可以在 WAF 层面拦截恶意请求。

    Cloudflare WAF 规则

    规则名称: Block_Nginx_Rift_CVE_2026_42945
    匹配条件:
    URI Query String 包含正则: (%2B){3,} # 连续 3 个以上 %2B
    URI Query String 包含正则: (%25){3,} # 连续 3 个以上 %25
    URI 长度 > 2048 且包含大量转义字符
    动作: Block
    日志: 记录完整请求
    优先级: High

    ModSecurity 规则

    # /etc/modsecurity/rules/nginx-rift.conf

    # 检测 URI 中的异常转义序列
    SecRule ARGS "@rx (%2B|%25|%26){3,}" \\
    "id:1000001,\\
    phase:2,\\
    deny,\\
    status:403,\\
    log,\\
    msg:'CVE-2026-42945: Suspicious URI encoding detected',\\
    tag:'CVE-2026-42945',\\
    severity:CRITICAL"

    # 检测超长 URI
    SecRule REQUEST_URI "@gt 2048" \\
    "id:1000002,\\
    phase:1,\\
    deny,\\
    status:403,\\
    log,\\
    msg:'CVE-2026-42945: URI too long',\\
    tag:'CVE-2026-42945',\\
    severity:WARNING"

    Nginx Lua 防护脚本

    — /etc/nginx/lua/cve_2026_42945.lua

    local function check_uri_safety(uri)
    — 检测连续的转义字符
    local _, count = string.gsub(uri, "%%2[BbEeFf]", "")
    if count >= 3 then
    return false, "Suspicious URI encoding"
    end

    — 检测 URI 长度
    if #uri > 2048 then
    return false, "URI too long"
    end

    — 检测异常字符比例
    local special_chars = { "%+", "%-", "%.", "%~", "%*" }
    local special_count = 0
    for _, char in ipairs(special_chars) do
    local _, c = string.gsub(uri, char, "")
    special_count = special_count + c
    end

    if special_count / #uri > 0.5 then
    return false, "Too many special characters"
    end

    return true, "OK"
    end

    local safe, msg = check_uri_safety(ngx.var.request_uri)
    if not safe then
    ngx.log(ngx.WARN, "Blocked CVE-2026-42945 attempt: ", msg, " from ", ngx.var.remote_addr)
    ngx.exit(403)
    end

    # nginx.conf
    location / {
    access_by_lua_file /etc/nginx/lua/cve_2026_42945.lua;
    # … 其他配置
    }

    验证 WAF 规则

    # 发送恶意请求测试
    curl -i "https://your-domain.com/api/test?id=%2B%2B%2B%2B%2B"

    # 预期响应: 403 Forbidden (WAF 拦截)

    # 发送正常请求测试
    curl -i "https://your-domain.com/api/test?id=123"

    # 预期响应: 200 OK (正常通过)


    🔧 方案三:修改 Nginx 配置(降低风险)

    如果无法升级且无 WAF,可以调整配置降低被利用风险。

    策略 1:避免使用 PCRE 捕获变量

    # ❌ 危险配置(使用 $1 捕获变量)
    location /api {
    rewrite ^/api/(.*)$ /backend/$1 last;
    }

    # ✅ 安全配置(使用 proxy_pass 直接转发)
    location /api/ {
    proxy_pass http://backend/;
    }

    策略 2:限制 URI 长度

    http {
    # 限制请求行最大长度
    large_client_header_buffers 4 8k;

    # 限制 URI 最大长度
    client_header_buffer_size 8k;
    }

    策略 3:禁用不必要的 rewrite 规则

    # 审查所有 rewrite 规则
    # 注释掉非必要的规则

    # server {
    # # rewrite ^/old-path(.*)$ /new-path$1 permanent; # 暂时禁用
    # }

    策略 4:启用 ASLR(如果尚未启用)

    # 检查 ASLR 状态
    cat /proc/sys/kernel/randomize_va_space

    # 返回值:
    # 0 = 禁用
    # 1 = 保守随机化
    # 2 = 完全随机化(推荐)

    # 启用 ASLR
    echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

    # 永久生效
    echo "kernel.randomize_va_space = 2" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p


    📊 方案对比与选型建议

    综合对比表

    维度升级 NginxWAF 防护修改配置启用 ASLR
    防护效果 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐
    实施难度 ⭐⭐ ⭐⭐
    停机时间 5-10 分钟 重启生效
    维护成本
    误报风险
    长期价值

    推荐组合策略

    小型项目(个人博客、展示网站):

    • ✅ 立即升级到 Nginx 1.30.1+
    • ✅ 启用 ASLR

    中型项目(企业官网、电商平台):

    • ✅ 短期:WAF 添加防护规则
    • ✅ 中期:升级到安全版本 + 回归测试
    • ✅ 长期:启用 ASLR + 定期安全扫描

    大型项目(金融、医疗、政府系统):

    • ✅ 短期:WAF + Lua 脚本双重防护
    • ✅ 中期:灰度升级 Nginx + 全面测试
    • ✅ 长期:建立 DevSecOps 流程,自动化漏洞检测
    • ✅ 持续:启用 ASLR + 监控告警 + 定期渗透测试

    ⚠️ 其他相关漏洞提醒

    本次 Nginx 安全公告还修复了多个相关漏洞,建议一并处理:

    CVE-2026-42946:内存分配漏洞

    影响: ngx_http_scgi_module 和 ngx_http_uwsgi_module 中的内存分配问题,可导致约 1TB 的异常内存分配,使 worker 进程崩溃

    CVSS: 8.3 (High)

    修复: 升级到相同安全版本即可

    CVE-2026-40701:释放后使用漏洞

    影响: ngx_http_ssl_module 中,当 TLS 连接在异步 OCSP DNS 解析完成前关闭时触发

    CVSS: 6.3 (Medium)

    修复: 升级到相同安全版本即可

    CVE-2026-42934:越界读取漏洞

    影响: ngx_http_charset_module 中,处理不完整 UTF-8 序列时计算负偏移量

    CVSS: 6.3 (Medium)

    修复: 升级到相同安全版本即可

    建议: 一次性升级到最新安全版本,避免多次升级带来的回归测试成本。


    🛡️ 生产环境最佳实践

    1. 建立漏洞监控机制

    订阅安全公告

    ✅ 必须订阅:

    1. **Nginx 官方安全公告**
    – RSS: https://nginx.org/en/security_advisories.html
    – 邮件列表: nginx-announce@nginx.org

    2. **CVE 数据库**
    – NVD: https://nvd.nist.gov/vuln/search/results?form_type=Advanced&results_type=overview&query=nginx
    – CNNVD: https://www.cnnvd.org.cn/

    3. **第三方安全平台**
    – VulnCheck: https://vulncheck.com/
    – Snyk: https://snyk.io/vuln/nginx

    自动化漏洞扫描

    # .github/workflows/nginx-security-scan.yml
    name: Nginx Security Scan

    on:
    schedule:
    cron: '0 2 * * 1' # 每周一凌晨 2 点
    push:
    branches: [main]

    jobs:
    nginx-version-check:
    runs-on: ubuntulatest
    steps:
    uses: actions/checkout@v3

    name: Check Nginx Version
    run: |
    NGINX_VERSION=$(ssh user@server "nginx -v 2>&1 | cut -d'/' -f2")
    echo "Current Nginx version: $NGINX_VERSION"

    # 检查是否为安全版本
    if [[ "$NGINX_VERSION" < "1.30.1" ]]; then
    echo "::error::Nginx version $NGINX_VERSION is vulnerable to CVE202642945"
    exit 1
    fi

    name: Run Trivy Scan
    uses: aquasecurity/trivyaction@master
    with:
    image-ref: 'nginx:latest'
    format: 'table'
    exit-code: '1'
    severity: 'CRITICAL,HIGH'

    2. 实施纵深防御

    #mermaid-svg-XRZ7u7JRQETZW7Sa{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XRZ7u7JRQETZW7Sa .error-icon{fill:#552222;}#mermaid-svg-XRZ7u7JRQETZW7Sa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XRZ7u7JRQETZW7Sa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .marker.cross{stroke:#333333;}#mermaid-svg-XRZ7u7JRQETZW7Sa svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XRZ7u7JRQETZW7Sa p{margin:0;}#mermaid-svg-XRZ7u7JRQETZW7Sa .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .cluster-label text{fill:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .cluster-label span{color:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .cluster-label span p{background-color:transparent;}#mermaid-svg-XRZ7u7JRQETZW7Sa .label text,#mermaid-svg-XRZ7u7JRQETZW7Sa span{fill:#333;color:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .node rect,#mermaid-svg-XRZ7u7JRQETZW7Sa .node circle,#mermaid-svg-XRZ7u7JRQETZW7Sa .node ellipse,#mermaid-svg-XRZ7u7JRQETZW7Sa .node polygon,#mermaid-svg-XRZ7u7JRQETZW7Sa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .rough-node .label text,#mermaid-svg-XRZ7u7JRQETZW7Sa .node .label text,#mermaid-svg-XRZ7u7JRQETZW7Sa .image-shape .label,#mermaid-svg-XRZ7u7JRQETZW7Sa .icon-shape .label{text-anchor:middle;}#mermaid-svg-XRZ7u7JRQETZW7Sa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .rough-node .label,#mermaid-svg-XRZ7u7JRQETZW7Sa .node .label,#mermaid-svg-XRZ7u7JRQETZW7Sa .image-shape .label,#mermaid-svg-XRZ7u7JRQETZW7Sa .icon-shape .label{text-align:center;}#mermaid-svg-XRZ7u7JRQETZW7Sa .node.clickable{cursor:pointer;}#mermaid-svg-XRZ7u7JRQETZW7Sa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .arrowheadPath{fill:#333333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XRZ7u7JRQETZW7Sa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XRZ7u7JRQETZW7Sa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XRZ7u7JRQETZW7Sa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XRZ7u7JRQETZW7Sa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .cluster text{fill:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa .cluster span{color:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XRZ7u7JRQETZW7Sa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XRZ7u7JRQETZW7Sa rect.text{fill:none;stroke-width:0;}#mermaid-svg-XRZ7u7JRQETZW7Sa .icon-shape,#mermaid-svg-XRZ7u7JRQETZW7Sa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XRZ7u7JRQETZW7Sa .icon-shape p,#mermaid-svg-XRZ7u7JRQETZW7Sa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XRZ7u7JRQETZW7Sa .icon-shape .label rect,#mermaid-svg-XRZ7u7JRQETZW7Sa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XRZ7u7JRQETZW7Sa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XRZ7u7JRQETZW7Sa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XRZ7u7JRQETZW7Sa :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    第五层: 监控告警

    第四层: 运行时

    第三层: 应用层

    第二层: 反向代理

    第一层: 网络边界

    WAF/防火墙

    DDoS 防护

    Nginx + Lua 防护

    速率限制

    URI 过滤

    后端应用

    输入验证

    异常处理

    ASLR 启用

    进程沙箱

    资源限制

    日志审计

    异常检测

    自动响应

    3. 日志审计与告警

    # nginx.conf – 增强日志记录

    log_format security '$remote_addr – $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    'request_time=$request_time '
    'upstream_response_time=$upstream_response_time';

    access_log /var/log/nginx/security.log security;

    # 检测异常请求
    map $request_uri $suspicious_request {
    default 0;
    "~*(%2B|%25|%26){3,}" 1; # 连续转义字符
    "~*.{2048,}" 1; # 超长 URI
    }

    server {
    if ($suspicious_request) {
    access_log /var/log/nginx/suspicious.log security;
    }
    }

    # monitor_suspicious.py – 实时监控脚本
    import subprocess
    import time
    import smtplib
    from email.mime.text import MIMEText

    def check_suspicious_logs():
    """检查可疑日志"""
    result = subprocess.run(
    ['tail', '-n', '100', '/var/log/nginx/suspicious.log'],
    capture_output=True,
    text=True
    )

    if result.stdout:
    # 发送告警邮件
    send_alert(result.stdout)

    def send_alert(log_content):
    """发送告警邮件"""
    msg = MIMEText(f"检测到可疑请求:\\n\\n{log_content}")
    msg['Subject'] = '[ALERT] Nginx Suspicious Request Detected'
    msg['From'] = 'security@example.com'
    msg['To'] = 'ops-team@example.com'

    with smtplib.SMTP('smtp.example.com') as server:
    server.send_message(msg)

    if __name__ == '__main__':
    while True:
    check_suspicious_logs()
    time.sleep(60) # 每分钟检查一次

    4. 应急响应预案

    ## CVE-2026-42945 应急响应流程

    ### Phase 1: 检测与评估(0-1 小时)

    – [ ] 确认 Nginx 版本是否受影响
    – [ ] 检查日志是否有攻击痕迹
    – [ ] 评估业务影响范围

    ### Phase 2: 临时缓解(1-4 小时)

    – [ ] WAF 添加防护规则
    – [ ] 启用 ASLR(如果未启用)
    – [ ] 限制可疑 IP 访问

    ### Phase 3: 永久修复(4-24 小时)

    – [ ] 备份配置文件
    – [ ] 升级到安全版本
    – [ ] 灰度发布验证
    – [ ] 全量上线

    ### Phase 4: 验证与复盘(24-48 小时)

    – [ ] 验证修复效果
    – [ ] 监控服务稳定性
    – [ ] 编写事故报告
    – [ ] 更新应急预案


    📝 总结与下一步行动

    核心收获

  • CVE-2026-42945 是潜伏 18 年的高危漏洞,影响 Nginx 0.6.27-1.30.0,全球 570 万台服务器面临威胁
  • 漏洞根因在于 rewrite 模块的长度计算缺陷,特殊字符转义时从 1 字节膨胀到 3 字节,导致堆缓冲区溢出
  • 最彻底的修复方案是升级 Nginx 到 1.30.1+ 或 1.31.0+
  • 临时缓解措施包括 WAF 防护、配置调整、启用 ASLR,可作为升级前的过渡方案
  • 纵深防御是关键,结合网络层、应用层、运行时多层防护,建立持续监控机制
  • 立即行动清单

    □ **今天完成**:
    – [ ] 检查当前 Nginx 版本 (`nginx -v`)
    – [ ] 如果在受影响范围,立即制定升级计划
    – [ ] 如果无法升级,配置 WAF 或 Lua 脚本临时拦截
    – [ ] 检查 ASLR 状态,如未启用则立即启用

    □ **本周完成**:
    – [ ] 完成 Nginx 升级并验证
    – [ ] 启用自动化漏洞扫描
    – [ ] 订阅 Nginx 安全公告
    – [ ] 审查其他相关漏洞(CVE-2026-42946 等)

    □ **本月完成**:
    – [ ] 实施纵深防御策略(WAF + Nginx + ASLR)
    – [ ] 建立安全日志审计和告警机制
    – [ ] 进行一次渗透测试或安全评估
    – [ ] 制定应急响应预案

    □ **持续进行**:
    – [ ] 每月运行一次依赖漏洞扫描
    – [ ] 每季度进行一次安全培训
    – [ ] 每年进行一次全面安全审计

    延伸学习

    • 📖 Nginx 官方安全公告
    • 📖 depthfirst 技术分析报告
    • 📖 OWASP Nginx 安全配置指南
    • 📖 Linux ASLR 最佳实践

    👍 如果本文对你有帮助,欢迎点赞、收藏、转发! 💬 如果你在修复过程中遇到问题,请在评论区留言,我会逐一回复! 🔔 关注我,获取更多 Web 安全实战干货! ✍️ 行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激!

    赞(0)
    未经允许不得转载:171主机测评 » 【运维安全】CVE-2026-42945:Nginx “Rift“ 漏洞深度解析与紧急修复指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址