CVE-2026-9256 — "nginx-poolslip" 堆缓冲区溢出漏洞
距 "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 模块在处理特定正则表达式模式时,存在堆内存指针管理缺陷:
- rewrite 指令使用包含多个重叠/嵌套 PCRE 捕获组的正则表达式
- 例如:
^/((.*))$— 外层$1和内层$2捕获的范围重叠
- 例如:
- 替换字符串中同时引用多个未命名捕获(如
$1$2) - NGINX 在计算 URI 转义后输出长度时低估了实际长度
- 写入操作超出缓冲区边界,导致指针"滑移"(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
方案三:配置缓解(无法立即升级时)
全面替换未命名捕获为命名捕获
# ❌ 有漏洞模式 rewrite ^/((.*))/((.*))$ /page?id=$1§ion=$2 last; # ✅ 安全模式 rewrite ^/(?<id>.*?)/(?<section>.*)$ /page?id=$id§ion=$section last;避免在 rewrite 中使用重叠/嵌套的捕获组
检查所有配置中的 rewrite 指令
# 快速排查可能受影响的配置 grep -rn "rewrite.*\$[0-9].*\$[0-9]" /etc/nginx/ grep -rn "rewrite.*\$\d.*?" /etc/nginx/ | grep -v "(?<"确认 ASLR 已启用
cat /proc/sys/kernel/randomize_va_space # 应为 2监控 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。
参考资料
💬 评论