NGINX 漏洞预警:18 年老洞可 RCE,PoC 已公开

· 2026-05-14 19:37 · 0 阅读

猎户攻防实验室 2026-05-14 19:37 北京

NGINX 18年漏洞已公开

5月13日,安全研究机构 DepthFirst 的自动化漏洞扫描系统一次性发现了 NGINX 的 4 个安全漏洞。其中最严重的 CVE-2026-42945(NGINX Rift) 影响范围横跨 0.6.27 到 1.30.0,存在了将近 18 年,官方 PoC 已公开。

漏洞清单

CVE

严重度

模块

影响

CVE-2026-42945

🔴 Critical 9.2

ngx_http_rewrite_module

堆溢出 → RCE/DoS

CVE-2026-42946

🟠 High 8.3

ngx_http_scgi_module / uwsgi_module

~1TB 内存分配 → worker 崩溃(DoS)

CVE-2026-40701

🟡 Medium 6.3

ngx_http_ssl_module

TLS 关闭后 OCSP DNS use-after-free

CVE-2026-42934

🟡 Medium 6.3

ngx_http_charset_module

UTF-8 跨缓冲区越界读(off-by-one)

修复版本:1.30.1+(稳定分支)/ 1.31.0+(主线)

重点分析

CVE-2026-42945(NGINX Rift)—— 堆溢出可RCE

这是本次最严重的漏洞。当配置中 rewrite 的替换串包含 ?,且后续通过 set/if/rewrite 引用了正则捕获组(如 $1$2)时,攻击者发送特制 URI 即可触发堆溢出。可导致 worker 进程崩溃,在绕过 ASLR 的条件下可实现远程代码执行。

受影响配置示例:

rewrite ^/old/(.*)$ /new?param=$1;    # 替换串含 ? 且引用了 $1
set$my_var$1;                        # 引用捕获组

CVE-2026-42946 —— SCGI/uwsgi 内存耗尽

触发后可导致约 1TB 的内存分配,直接打挂 worker 进程。所有使用 SCGI 或 uWSGI 后端的部署均受影响。

PoC / 利用脚本

CVE-2026-42945 的 PoC 已公开:

关于 PoC 的实际利用能力说明: 该 PoC 主要在 ASLR 关闭的环境(如 DepthFirst 提供的 Docker 测试环境)下能稳定实现 RCE。在真实生产环境(默认开启 ASLR 的 Linux 系统)上,大概率只能实现可靠的 DoS 崩溃,完整 RCE 需要额外技巧。请仅在自己可控的测试环境中使用,严禁用于任何未经授权的服务器,否则属于违法行为。

排查方法

第 1 步:资产清点 — 确认 NGINX 版本

# 本地最准确检查
nginx -v
nginx -V
# 远程通过 Header 检查
curl -sI https://your-domain.com/ 2>/dev/null | grep -i "^Server:"
# 批量扫描(推荐)
whileread host; do
echo -n "$host | "
  curl -skI --max-time 5 "https://$host" 2>/dev/null | grep -i "^Server:" || echo"无法访问或 Server 头已隐藏"
done < host_list.txt

判定标准:

  • • 版本在 0.6.27 ~ 1.30.0 之间(含 NGINX Plus R32~R36)→ 受影响,立即升级

  • • 版本 ≥ 1.30.1 或 ≥ 1.31.0 → 已修复

第 2 步:模块与编译选项检查

# 查看已编译模块
nginx -V 2>&1 | tr' ''\n' | grep --color=never -E 'module|http_rewrite|http_scgi|http_uwsgi|http_charset|http_ssl'

第 3 步:配置触发条件检查(最核心!)

# 查找含 ? 的 rewrite + 匿名捕获组
grep -rnE 'rewrite\s+.*\?.*\$[0-9]' /etc/nginx/ --include="*.conf"
# 查找所有匿名捕获组使用
grep -rnE '\$([1-9][0-9]?)' /etc/nginx/ --include="*.conf"
# 检查 SCGI/uWSGI(CVE-2026-42946)
grep -rnE 'scgi_pass|uwsgi_pass' /etc/nginx/ --include="*.conf"

第 4 步:日志异常检查

# worker 崩溃记录
grep -E "exited on signal|segfault|signal 11|worker process" /var/log/nginx/error.log | tail -30
# 可疑 URI 请求
grep -E "(\+|%26|%25)" /var/log/nginx/access.log | tail -50

修复建议

首选:立即升级 NGINX

# CentOS / RHEL
yum update nginx
# Ubuntu / Debian
apt update && apt install nginx
# Docker
docker pull nginx:1.31.0
# 验证
nginx -v   # 确保 >= 1.30.1

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

针对 CVE-2026-42945,最有效的办法是把匿名捕获组改成 named captures

# 推荐写法
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$sectionlast;

参考链接:

跳转微信打开