潜伏 18 年的 NGINX rewrite 漏洞:AI 如何揪出影响全球三分之一网站的 RCE

2026-05-15 14 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:11 分钟

2026 年 5 月 13 日,一个自 2008 年就藏在 NGINX rewrite 模块里的远程代码执行漏洞被正式编号为 CVE-2026-42945。发现者不是某支资深安全团队,而是初创公司 depthfirst 的 AI 安全分析系统——一次"点击即分析"的操作就锁定了这个影响全球近三分之一网站的高危缺陷。18 年、数十亿次请求、无数安全审计,这个漏洞始终安静地躺在所有人眼皮底下,直到 AI 用不同的方式去看代码。

漏洞根因:rewrite 模块里的致命路径

NGINX 的 rewrite 模块是日常配置中使用频率最高的功能之一——rewriteifreturnbreak 这些指令几乎出现在每一份站点配置里。漏洞的核心问题在于 rewrite 模块在处理特定构造的请求 URI 时,内部缓冲区边界检查存在逻辑缺陷:

  • 当 URI 经过多次 rewrite 规则链式处理后,模块会对中间结果做字符串拼接与长度计算。
  • 在拼接过程中,一个整数溢出导致长度校验被绕过,后续的内存写入越界。
  • 攻击者可以通过精心构造的请求路径触发这一溢出链条,最终在服务器进程空间中执行任意代码。

关键细节:这个缺陷自 2008 年 rewrite 模块重构时引入,此后每次模块微调都保留了原始的边界计算逻辑。18 年间所有人工审计——包括 NGINX 自身代码审查、多个开源安全项目扫描——都未触发这一路径,因为人工审计倾向于逐函数检查,而链式 rewrite 的跨规则交互恰恰是盲区。

AI 的发现方式:为什么人没看到,机器看到了

depthfirst 的 AI 系统采用了与传统静态分析截然不同的策略:

  1. 路径探索而非逐行审查:系统不是逐函数读代码,而是从 HTTP 请求入口出发,模拟所有可能的请求路径穿越 NGINX 内部模块链。当 URI 进入 rewrite 模块后,系统穷举了 rewrite 规则之间的组合交互——包括多轮 rewrite、正则捕获组回溯、if 条件分支等场景。
  2. 状态空间压缩:传统 fuzzing 面对如此大的组合空间会迅速耗尽资源。AI 系统通过抽象符号执行,将无限的具体请求压缩为有限的状态类,再对每个状态类做约束求解,找到能触发溢出的具体输入。
  3. "点击即分析":操作者只需指定目标软件版本和模块范围,系统自动完成从路径建模到约束求解到漏洞验证的全流程。这次分析从启动到确认漏洞,耗时不到一小时。

这恰恰击中了人工审计的短板:人很难系统地思考"规则 A 的输出作为规则 B 的输入,再作为规则 C 的输入"这种跨三四个规则的组合效应,而 AI 把这种组合当成了搜索空间的常规节点。

检查你的 NGINX 是否受影响

以下命令可以帮助你快速判断当前环境的风险状况。

第一步:确认 NGINX 版本与模块编译情况

# 查看 NGINX 版本及编译模块列表
nginx -V 2>&1 | grep -E 'version|rewrite'

# 输出中如果包含 --without-http_rewrite_module 则不受此漏洞影响
# 大多数默认编译都包含 rewrite 模块,需要重点关注

第二步:检查配置中 rewrite 规则的复杂度

# 扫描所有站点配置中 rewrite 相关指令的使用情况
grep -rn -E 'rewrite|if\s*\(' /etc/nginx/ 2>/dev/null | head -40

# 特别关注:同一 location 中有多条 rewrite 规则,
# 或 rewrite 与 if 混合使用的配置块——这些是高危触发点

第三步:查看官方补丁状态

# 检查当前安装的 NGINX 包版本是否已包含补丁
# 以 Debian/Ubuntu 为例
apt list --installed 2>/dev/null | grep nginx

# 访问 NGINX 官方安全公告确认对应版本的修复状态
# https://nginx.org/en/security_advisories.html

立即可用的缓解配置

如果你暂时无法升级 NGINX,可以通过配置层降低触发概率。以下是一份可直接部署的缓解配置片段:

# /etc/nginx/conf.d/rewrite_safeguard.conf
# 缓解 CVE-2026-42945 的临时配置——限制 URI 长度与 rewrite 链深度

# 全局限制请求 URI 最大长度,阻断超长路径触发溢出
server {
    # 拒绝超过 8KB 的 URI(正常请求极少超过此值)
    if ($request_uri ~ "^.{8192,}") {
        return 444;  # 直接关闭连接,不返回响应
    }
}

# 对存在多轮 rewrite 的 location,限制 rewrite 深度
location /legacy/ {
    # 最多允许 2 次 rewrite,避免链式触发
    rewrite ^/legacy/(.*)$ /new/$1 break;
    # 不要在此 location 中继续添加第二条 rewrite 或 if
    # 如果业务需要多轮跳转,改用 return 301 做单次重定向
}
# 部署后测试配置语法并重载
nginx -t && systemctl reload nginx

# 验证:发送超长 URI 确认被拦截
curl -v "http://localhost/$(python3 -c 'print("a"*9000)')" 2>&1 | head -5
# 预期:连接被直接关闭,无响应返回

注意:上述配置是缓解措施而非完整修复。if 指令在 NGINX 配置中素有"evil"之称,此处用于长度拦截是可接受的窄场景,但不要因此扩展 if 的使用范围。完整修复仍需升级到官方补丁版本。

更根本的防御:减少 rewrite 的复杂度

这个漏洞暴露的不只是代码缺陷,还有配置模式的隐患。以下是一份自查清单:

检查项 风险等级 建议
同一 location 内超过 2 条 rewrite 🔴 高 改用 return/try_files 替代多轮跳转
rewriteif 在同一块内混合使用 🔴 高 拆分为独立 location,用 try_files 逻辑替代
rewrite 正则中使用复杂捕获组 (.*)(.*) 🟡 中 简化正则,减少回溯压力
未限制 $request_uri 长度 🟡 中 server 层加长度拦截
NGINX 版本落后于当前稳定版超过 2 个小版本 🔴 高 尽快升级至已修复版本

一个实用的重构思路:把"多轮 rewrite 跳转"改为"一次精确匹配 + 一次重定向"。例如:

# 危险模式:多轮 rewrite
location /old/ {
    rewrite ^/old/a/(.*)$ /mid/$1 last;
    rewrite ^/mid/(.*)$ /new/$1 last;
}

# 安全模式:直接映射
location /old/a/ {
    return 301 /new/;
}
location /old/b/ {
    return 301 /other/;
}

规则越扁平,攻击者能构造的链式路径就越短,触发溢出的窗口就越小。

AI 安全审计的信号

CVE-2026-42945 的发现方式本身值得关注。传统静态分析工具(Coverity、Semgrep 等)也能扫描代码,但它们依赖预定义的规则模式——本质上还是"人告诉机器去查什么"。depthfirst 的系统走得更远:它自己构建了路径模型,自己发现了审计盲区,自己求解出了触发输入。

这并不意味着 AI 安全工具已经成熟到可以替代人工审计。当前阶段的现实判断:

  • AI 在路径组合探索上明显优于人工,尤其适合跨模块、跨规则的交互分析。
  • AI 在漏洞影响评估和补丁设计上仍需人工介入,CVE-2026-42945 的补丁由 NGINX 核心团队完成,而非 AI 自动生成。
  • AI 发现的漏洞需要严格的人工复现确认,避免误报导致不必要的恐慌和运维成本。

对运维和安全团队的实际建议:把 AI 安全分析纳入 CI/CD 流程,作为代码变更后的自动扫描环节,但不要将其结果直接等同于确认漏洞——建立"AI 初筛 → 人工复现 → 官方编号"的三级流程。


一个潜伏 18 年的漏洞被一次点击揪出,这既是 NGINX 代码历史的遗憾,也是 AI 安全分析能力的里程碑。对正在运行 NGINX 的团队来说,当下最紧迫的事不是讨论 AI 能不能替代人,而是检查自己的 rewrite 配置、确认版本状态、部署缓解措施——然后在下一次代码审计时,给 AI 一个席位。


相关推荐