本仓库提供两份单机检查脚本,用于在 Linux / Windows 服务器本机排查 Nginx、OpenResty、Tengine 是否存在 CVE-2026-42945 相关风险。
脚本只做只读采集和本地判定,不执行漏洞 PoC,不发送攻击请求,不修改配置,不重启服务,不升级软件。
CVE-2026-42945 又被称为 NGINX Rift,公开资料将其描述为 ngx_http_rewrite_module 中的堆缓冲区溢出问题。根据 NVD 描述,当 rewrite 指令与后续 rewrite / if / set 指令形成特定组合,并涉及未命名 PCRE 捕获变量(例如 $1、$2)以及包含问号 ? 的替换字符串时,攻击者可能通过构造 HTTP 请求触发 NGINX worker 进程中的堆缓冲区溢出。该问题可能导致 worker 进程重启;在 ASLR 关闭等特定条件下,存在代码执行风险。
NGINX 官方安全公告将 CVE-2026-42945 标记为 ngx_http_rewrite_module 的 buffer overflow,并给出 NGINX Open Source 的修复边界:
| 状态 | NGINX Open Source 版本 |
|---|---|
| 已修复 | 1.31.0+ / 1.30.1+ |
| 疑似受影响 | 0.6.27-1.30.0 |
发行版、商业产品、OpenResty、Tengine 或私有构建可能存在回补补丁或版本映射差异,脚本会尽量采集证据,但最终仍建议结合供应商公告人工确认。
本工具不是漏洞利用验证工具,而是本机采集和静态配置检查工具。它重点识别以下组合:
rewrite 指令的替换字符串中使用未转义的 $1、$2 等未命名捕获变量。rewrite 替换字符串中包含未转义的 ?,形如 \? 的字面问号不会作为风险条件。rewrite、if 或 set 指令。示例风险模式:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?endpoint=$1 last;
set $flag 1;
}
风险不来自单独某一条 rewrite 或 set,而是版本、配置上下文和执行顺序共同形成的触发条件。命中后仍建议人工确认该配置是否为实际生效配置、是否可被外部请求触达、是否已由发行版回补修复。
| 文件 | 说明 |
|---|---|
check_nginx_linux.sh | Linux 本机检查脚本 |
check_nginx_windows.ps1 | Windows 本机检查脚本 |
README.md | 中文说明 |
首版支持:
rewrite 配置。summary.txt、summary.json 和原始证据目录。首版不包含:
建议使用管理员权限运行:
root 或具备 sudo 权限的账号。非管理员权限下脚本会尽力采集;如果无法导出完整 nginx -T 生效配置,结果会标记为 需人工复核。
将 check_nginx_linux.sh 上传到服务器后执行:
chmod +x check_nginx_linux.sh
sudo ./check_nginx_linux.sh
如果无法使用 sudo,也可以直接执行:
./check_nginx_linux.sh
将 check_nginx_windows.ps1 上传到服务器后,使用“以管理员身份运行”的 PowerShell 执行:
powershell -ExecutionPolicy Bypass -File .\check_nginx_windows.ps1
脚本会在脚本所在目录生成结果目录。目录名包含主机名、时间和脚本进程 ID,避免同一秒重复执行时混写证据。
nginx_check_<主机名>_<时间>_<进程ID>/
summary.txt
summary.json
raw/
host_info.txt
process_info.txt
service_info.txt
package_info.txt
nginx_paths.txt
instances/
instance_01/
nginx_invocation.txt
nginx_version.txt
nginx_build.txt
nginx_config_dump.txt
risky_config_matches.txt
instance_02/
...
| 文件或目录 | 说明 |
|---|---|
summary.txt | 中文摘要,适合人工查看和回传 |
summary.json | 结构化结果,便于后续批量汇总 |
raw/ | 原始命令输出和证据文件 |
摘要中会记录:
如果 Nginx 配置很多,脚本不会在控制台打印完整配置;完整生效配置保存在对应实例目录的 nginx_config_dump.txt。当配置导出文件超过 10 MB 时,脚本会继续自动扫描,并提示建议结合 raw/ 结果进行人工抽查。
如果服务器发现多个 nginx、openresty、tengine 候选可执行文件,脚本会逐个检查并生成实例明细。
总摘要中的结论取最高风险实例。整体结论采用保守优先级:
受影响有风险配置需人工复核受影响无风险配置不受影响未安装Nginx其中 需人工复核 高于 受影响无风险配置,表示存在未确认实例需要继续核实,并不等同于已确认存在危险配置。
发行版可能存在“版本号较旧但已回补补丁”的情况。如能提供厂商补丁证明,可结合 summary.txt 和包版本信息进行人工确认。
location、server、if 等上下文中的 rewrite / if / set 组合。? 的 rewrite 替换字符串中继续使用 $1、$2 等未命名捕获变量。nginx -T 无法完整导出配置,脚本不会判定为安全。README.en.md | English README |
raw/instances/instance_XX/ | 每个实例的独立版本、配置和风险证据 |
| 字段 | 说明 |
|---|
实例数量 | 本机发现并逐个检查的 Nginx / OpenResty / Tengine 候选实例数量 |
配置大小 | nginx -T 导出的原始配置结果文件大小 |
扫描行数 | 脚本实际扫描的配置输出行数 |
危险配置命中数量 | 命中的危险 rewrite 规则数量 |
证据摘要 | 最高风险实例的证据预览,完整证据见对应实例目录 |
| 结论 | 含义 |
|---|
未安装Nginx | 未发现 Nginx / OpenResty / Tengine 命令、进程或服务 |
不受影响 | 明确为修复版本,且未发现危险配置 |
受影响无风险配置 | 版本疑似受影响,但未发现危险 rewrite 配置 |
受影响有风险配置 | 版本疑似受影响或衍生版本需复核,且发现危险 rewrite 配置 |
需人工复核 | 版本未知、衍生版本、配置采集失败、权限不足或证据不足 |
| 产品 | 版本判断 |
|---|
NGINX 1.31.0+ | 已修复,脚本显示为 已修复(mainline) |
NGINX 1.30.1+ | 已修复,脚本显示为 已修复(stable) |
NGINX 0.6.27-1.30.0 | 疑似受影响 |
| OpenResty / Tengine | 可采集版本和配置,但版本影响关系默认需要人工复核 |