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, 云安全监控, 堆缓冲区溢出, 安全合规, 安全检查脚本, 库, 应急响应, 应用安全, 无线安全, 本机安全检查, 漏洞排查, 网络代理, 网络安全, 网络安全审计, 隐私保护, 静态分析