无第三方依赖的 Python 3 扫描器,用于检测 CVE-2026-42945("NGINX Rift")——
ngx_http_rewrite_module 中一个 CVSS v4.0 9.2 严重(CRITICAL) 的基于堆的缓冲区溢出(CWE-122)。
每次调用都会执行两项独立的检查:
| 检查项 | 方式 |
|---|---|
| 版本 | nginx -V、dpkg/rpm/apk、Dockerfile/compose 镜像标签 |
| 配置模式 | 对 nginx.conf 及所有 include 文件进行支持大括号感知的解析 |
关于 1.30.1 的说明:已打补丁的 1.30.1 稳定版与易受攻击版本的版本字符串相同, 因此扫描器将所有 1.30.1 归类为
POTENTIALLY_VULNERABLE(退出码 1,采取保守策略)。 请通过软件包变更日志 / 官方公告的回移(backport)信息来确认补丁已应用。
当 以下三个条件同时成立 时,相应作用域块会被标记:
rewrite、if 或 set 指令使用了 未命名的 PCRE 捕获组 引用
($1–$9,包括花括号形式 ${1}–${9})。? 字符
(对于 rewrite/set,正则模式的参数被排除在外——那里的 ? 是 PCRE 量词;
if 条件则采用保守方式扫描)。rewrite/if/set 指令
(include 文件会被拼接到包含它的作用域中,因此跨 边界的配对也能被检测到)。# 克隆并运行
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# 扫描本地 nginx(nginx 二进制在 PATH 中,配置位于 /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# 自定义路径
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# JSON 输出(CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# 使用内置测试样例进行验证
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
退出码:0 = 安全,1 = 版本或配置模式被标记为 VULNERABLE / POTENTIALLY_VULNERABLE。
升级(推荐):
临时规避 — 将每个同时包含 ? 的 rewrite/if/set 指令中的未命名捕获组替换为命名捕获组:
# 易受攻击
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# 安全
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
配置检测结果属于 启发式 判断。被标记的指令并不能保证一定可利用——? 可能不在 URI 构造路径中,
或者捕获组引用可能不会与发生溢出的内存分配产生交互。在优先进行修复之前,每一条结果都应经过人工审查。
nginx 二进制文件(可选——缺失时跳过版本检查)| 文件 | 预期结果 |
|---|---|
fixtures/vulnerable.nginx.conf | 3 条配置检测结果,退出码 1 |
fixtures/safe.nginx.conf | 0 条配置检测结果,退出码 0 |
python3 -m unittest discover -s tests -v
| 版本类型 |
|---|
| 受影响 |
|---|
| 已修复 |
|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+(或已打补丁的 1.30.1) |
| NGINX Plus | R32P6 之前的 R32 | R32P6+ |
| NGINX Plus | R36P4 之前的 R36 | R36P4+ |
| NGINX Plus | R37+ | 不受影响 |
include| 标志 | 默认值 | 说明 |
|---|
--nginx-binary PATH | nginx | nginx 可执行文件路径 |
--config PATH | /etc/nginx/nginx.conf | 要扫描的根 nginx 配置文件 |
--prefix PATH | --config 所在目录 | nginx 配置前缀,用于解析相对路径的 include(nginx 会以前缀为基准解析,而不是包含该 include 的文件所在目录) |
--scan-dir PATH | . | 用于搜索 Dockerfile/compose 文件的目录 |
--json | — | 向 stdout 输出 JSON 报告 |