距 "NGINX Rift" 仅 9 天后披露的第二个 NGINX rewrite 模块远程利用漏洞,补丁未完全覆盖的攻击面。


漏洞概述

项目 内容
CVE 编号 CVE-2026-9256
漏洞名称 nginx-poolslip
CWE 分类 CWE-122 — 堆缓冲区溢出(Heap-based Buffer Overflow)
CVSS v4.0 9.2(Critical)
CVSS v3.1 8.1(High) AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
发现者 Mufeed VH(Winfunc Research / Nebula Security / Vexera AI)
公开时间 2026 年 5 月 22 日
关联漏洞 CVE-2026-42945 — NGINX Rift

与 CVE-2026-42945(NGINX Rift)的关键区别

对比维度 NGINX Rift (CVE-2026-42945) nginx-poolslip (CVE-2026-9256)
根因 缓冲区大小计算错误(length/copy 两遍不匹配) 指针在内存池相邻结构中"滑移"
触发方式 rewrite 含 ? + 未命名捕获 $1 重叠/嵌套的 PCRE 捕获组 + 多捕获引用
影响范围 v0.6.27 ~ v1.30.0 v0.1.17 ~ v1.30.1, v1.31.0(更广)
Rift 补丁能否防护 不能 — 独立代码路径
修复版本 1.30.1 / 1.31.0 1.30.2 / 1.31.1

⚠️ 关键警示: CVE-2026-42945 的补丁没有修复底层内存池的攻击面,导致 patch 后的 NGINX 1.30.1 / 1.31.0 仍然受此漏洞影响。


影响范围

NGINX Open Source

状态 版本范围
受影响 v0.1.17 ~ v1.30.1, v1.31.0
已修复 v1.30.2(稳定版)、v1.31.1(主线版)
永不再修复 0.x 分支(已 EOL)

NGINX Plus

版本线 修复版本
R32 R32 P7
R36 R36 P5
37.0.0 37.0.1.1

关联产品

产品 受影响版本 修复状态
NGINX Instance Manager 2.17.0 ~ 2.22.0 ⏳ 待修复
NGINX App Protect WAF 4.10.0 ~ 4.16.0 / 5.2.0 ~ 5.8.0 ⏳ 待修复
NGINX Gateway Fabric 1.3.0 ~ 2.6.1 ⏳ 待修复
NGINX Ingress Controller 3.5.0 ~ 5.4.2 ⏳ 待修复
kubernetes/ingress-nginx 内置 NGINX 1.27.1 上游不修复

⚠️ kubernetes/ingress-nginx 仓库内置 NGINX 1.27.1,属于受影响范围且不会收到上游修复,需关注其独立发布。


漏洞原理

根因:PCRE 重叠捕获导致指针滑移

NGINX rewrite 模块在处理特定正则表达式模式时,存在堆内存指针管理缺陷:

  1. rewrite 指令使用包含多个重叠/嵌套 PCRE 捕获组的正则表达式
    • 例如:^/((.*))$ — 外层 $1 和内层 $2 捕获的范围重叠
  2. 替换字符串中同时引用多个未命名捕获(如 $1$2
  3. NGINX 在计算 URI 转义后输出长度时低估了实际长度
  4. 写入操作超出缓冲区边界,导致指针"滑移"(slip)到内存池中相邻的链表结构

与 CVE-2026-42945 不同,此处不是长度传递阶段的标志位遗漏,而是指针在内存池分配器中的偏移计算错误——一种独立的底层缺陷。

触发条件

# ❌ 有漏洞的配置模式
server {
    location ~ ^/users/((.*))/profile/((.*))$ {
        # 嵌套/重叠捕获组 + 多个未命名捕获引用
        rewrite ^/users/((.*))/profile/((.*))$ /profile?uid=$1&tab=$2 last;
    }
}

安全配置替代方案

# ✅ 使用命名捕获
server {
    location ~ ^/users/(?<uid>.*?)/profile/(?<tab>.*)$ {
        rewrite ^/users/(?<uid>.*?)/profile/(?<tab>.*)$ /profile?uid=$uid&tab=$tab last;
    }
}

# ✅ 或者使用独立的非捕获组
server {
    location ~ ^/users/(?:[^/]+)/profile/(?:[^/]+)$ {
        # 使用 proxy_pass 传递参数
        proxy_pass http://backend;
    }
}

漏洞影响

影响 说明
拒绝服务(DoS) ✅ 工作进程崩溃重启循环,攻击效果可靠
远程代码执行(RCE) ⚠️ ASLR 禁用时可达成;结合其他原语可绕过 ASLR
攻击方式 单次 HTTP 请求,无需认证
在野利用 ✅ 确认 — PoC 已在安全社区传播

修复与缓解措施

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

# Ubuntu/Debian
sudo apt update
sudo apt install -y nginx=1.30.2-*

# 或使用主线版
# sudo apt install -y nginx=1.31.1-*

# CentOS/RHEL
sudo dnf update nginx

# 验证版本
nginx -v
# 应输出 ≥ 1.30.2(稳定版)或 ≥ 1.31.1(主线版)

方案二:Docker 容器

docker pull nginx:1.30.2
# 或主线版
docker pull nginx:1.31

# 重建容器
docker compose up -d --build

方案三:配置缓解(无法立即升级时)

  1. 全面替换未命名捕获为命名捕获

    # ❌ 有漏洞模式
    rewrite ^/((.*))/((.*))$ /page?id=$1&section=$2 last;
    
    # ✅ 安全模式
    rewrite ^/(?<id>.*?)/(?<section>.*)$ /page?id=$id&section=$section last;
    
  2. 避免在 rewrite 中使用重叠/嵌套的捕获组

  3. 检查所有配置中的 rewrite 指令

    # 快速排查可能受影响的配置
    grep -rn "rewrite.*\$[0-9].*\$[0-9]" /etc/nginx/
    grep -rn "rewrite.*\$\d.*?" /etc/nginx/ | grep -v "(?<"
    
  4. 确认 ASLR 已启用

    cat /proc/sys/kernel/randomize_va_space
    # 应为 2
    
  5. 监控 NGINX 工作进程异常重启

    # 查看 worker 进程重启日志
    grep "worker process.*exited" /var/log/nginx/error.log
    

检测方法

检测 NGINX 版本是否受影响

# 检查当前版本
nginx -v

# 对比受影响范围
# ❌ 受影响:v0.1.17 ~ v1.30.1, v1.31.0
# ✅ 已修复:v1.30.2+, v1.31.1+

检测配置中是否存在风险模式

# 查找可能触发漏洞的 rewrite 模式
# 条件:包含数字捕获引用 + ? 或嵌套捕获
grep -rn "rewrite" /etc/nginx/ | grep -E '\$[0-9]+.*\?'
grep -rn "rewrite" /etc/nginx/ | grep -E '\(\(.*\)\)'

检测是否已遭利用

# 查看错误日志中是否有异常崩溃记录
grep -i "abort\|signal\|segfault\|core dumped" /var/log/nginx/error.log

# 查看系统日志中 NGINX 相关异常
journalctl -u nginx --no-pager | grep -i "segfault\|signal"

时间线

日期 事件
2026 年 5 月 13 日 CVE-2026-42945 补丁发布
2026 年 5 月 22 日 CVE-2026-9256 公开披露(距 Rift 补丁仅 9 天)
2026 年 5 月下旬 PoC 开始在安全社区传播
2026 年 5 月 F5 发布相应版本修复

与 Rift 漏洞的关系总结

CVE-2026-42945 (Rift) 修复 ──→ NGINX 1.30.1 / 1.31.0
        │
        ├── ❌ 未修复底层内存池攻击面
        │
        └──→ CVE-2026-9256 (poolslip) 仍可利用 ←── 需升级到 1.30.2+

两个漏洞是独立的代码路径,但攻击面重叠。仅安装 Rift 补丁(1.30.1)不足以防御 poolslip,必须升级到 1.30.2 / 1.31.1


参考资料