byezero/nginx-cve-2026-42945-check
GitHub: byezero/nginx-cve-2026-42945-check
针对 CVE-2026-42945(NGINX Rift)堆缓冲区溢出漏洞的本机只读检查工具,通过静态分析 Nginx/OpenResty/Tengine 的版本与生效配置,识别危险 rewrite 指令组合并给出风险判定。
Stars: 0 | Forks: 0
# NGINX CVE-2026-42945 本机检查脚本
语言:[中文](README.md) | [English](README.en.md)
本仓库提供两份单机检查脚本,用于在 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 或私有构建可能存在回补补丁或版本映射差异,脚本会尽量采集证据,但最终仍建议结合供应商公告人工确认。
## 检查目标
本工具不是漏洞利用验证工具,而是本机采集和静态配置检查工具。它重点识别以下组合:
1. `rewrite` 指令的替换字符串中使用未转义的 `$1`、`$2` 等未命名捕获变量。
2. 同一个 `rewrite` 替换字符串中包含未转义的 `?`,形如 `\?` 的字面问号不会作为风险条件。
3. 同一配置作用域内,后续存在 `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` | 中文说明 |
| `README.en.md` | English README |
## 能力范围
首版支持:
- 检查本机原生安装的 Nginx / OpenResty / Tengine。
- 采集主机信息、进程和服务信息、版本信息、编译参数、生效配置。
- 支持同一台服务器上多个 Nginx / OpenResty / Tengine 实例逐个检查。
- 识别 CVE-2026-42945 相关危险 `rewrite` 配置。
- 输出中文控制台结果、`summary.txt`、`summary.json` 和原始证据目录。
首版不包含:
- Docker / Kubernetes 检查。
- 远程 SSH / WinRM 扫描。
- 自动修复、自动升级、自动修改配置。
- 漏洞 PoC 或攻击请求。
## 运行前提
建议使用管理员权限运行:
- Linux:使用 `root` 或具备 `sudo` 权限的账号。
- Windows:使用“以管理员身份运行”的 PowerShell。
非管理员权限下脚本会尽力采集;如果无法导出完整 `nginx -T` 生效配置,结果会标记为 `需人工复核`。
## Linux 使用方法
将 `check_nginx_linux.sh` 上传到服务器后执行:
chmod +x check_nginx_linux.sh
sudo ./check_nginx_linux.sh
如果无法使用 `sudo`,也可以直接执行:
./check_nginx_linux.sh
## Windows 使用方法
将 `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/` | 原始命令输出和证据文件 |
| `raw/instances/instance_XX/` | 每个实例的独立版本、配置和风险证据 |
摘要中会记录:
| 字段 | 说明 |
|---|---|
| `实例数量` | 本机发现并逐个检查的 Nginx / OpenResty / Tengine 候选实例数量 |
| `配置大小` | `nginx -T` 导出的原始配置结果文件大小 |
| `扫描行数` | 脚本实际扫描的配置输出行数 |
| `危险配置命中数量` | 命中的危险 `rewrite` 规则数量 |
| `证据摘要` | 最高风险实例的证据预览,完整证据见对应实例目录 |
如果 Nginx 配置很多,脚本不会在控制台打印完整配置;完整生效配置保存在对应实例目录的 `nginx_config_dump.txt`。当配置导出文件超过 10 MB 时,脚本会继续自动扫描,并提示建议结合 `raw/` 结果进行人工抽查。
## 多实例处理
如果服务器发现多个 `nginx`、`openresty`、`tengine` 候选可执行文件,脚本会逐个检查并生成实例明细。
总摘要中的结论取最高风险实例。整体结论采用保守优先级:
1. `受影响有风险配置`
2. `需人工复核`
3. `受影响无风险配置`
4. `不受影响`
5. `未安装Nginx`
其中 `需人工复核` 高于 `受影响无风险配置`,表示存在未确认实例需要继续核实,并不等同于已确认存在危险配置。
## 检查结论
| 结论 | 含义 |
|---|---|
| `未安装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 | 可采集版本和配置,但版本影响关系默认需要人工复核 |
发行版可能存在“版本号较旧但已回补补丁”的情况。如能提供厂商补丁证明,可结合 `summary.txt` 和包版本信息进行人工确认。
## 处置建议
- 优先升级到官方或发行版供应商发布的修复版本。
- 对公网入口、反向代理入口、边界负载均衡实例优先复核。
- 检查所有 `location`、`server`、`if` 等上下文中的 `rewrite` / `if` / `set` 组合。
- 避免在包含 `?` 的 `rewrite` 替换字符串中继续使用 `$1`、`$2` 等未命名捕获变量。
- 可考虑改用命名捕获、提前保存变量、拆分处理逻辑,或移除不必要的 query string rewrite。
- 不要只依赖版本判断,配置是否包含触发序列同样关键。
## 限制
- 本工具是本机只读检查脚本,不等同于漏洞利用验证。
- 静态配置扫描可能存在误报,需要结合实际 NGINX 上下文人工复核。
- 如果 `nginx -T` 无法完整导出配置,脚本不会判定为安全。
- OpenResty / Tengine / 私有构建的版本影响关系默认需要人工复核。
- 扫描不到风险不代表绝对安全,仍建议升级到官方或发行版供应商确认的修复版本。
## 参考资料
- [NGINX Security Advisories](https://nginx.org/en/security_advisories.html)
- [NVD: CVE-2026-42945](https://nvd.nist.gov/vuln/detail/CVE-2026-42945)
- [F5 Advisory K000161019](https://my.f5.com/manage/s/article/K000161019)
- [depthfirst: NGINX Rift](https://depthfirst.com/nginx-rift)
标签:AI合规, CVE-2026-42945, Libemu, NGINX, NGINX Rift, ngx_http_rewrite_module, OpenResty, Tengine, 云安全监控, 堆缓冲区溢出, 安全合规, 安全检查脚本, 库, 应急响应, 应用安全, 无线安全, 本机安全检查, 漏洞排查, 网络代理, 网络安全, 网络安全审计, 隐私保护, 静态分析