2026 年 5 月 13 日,一个自 2008 年就藏在 NGINX rewrite 模块里的远程代码执行漏洞被正式编号为 CVE-2026-42945。发现者不是某支资深安全团队,而是初创公司 depthfirst 的 AI 安全分析系统——一次"点击即分析"的操作就锁定了这个影响全球近三分之一网站的高危缺陷。18 年、数十亿次请求、无数安全审计,这个漏洞始终安静地躺在所有人眼皮底下,直到 AI 用不同的方式去看代码。
漏洞根因:rewrite 模块里的致命路径
NGINX 的 rewrite 模块是日常配置中使用频率最高的功能之一——rewrite、if、return、break 这些指令几乎出现在每一份站点配置里。漏洞的核心问题在于 rewrite 模块在处理特定构造的请求 URI 时,内部缓冲区边界检查存在逻辑缺陷:
- 当 URI 经过多次 rewrite 规则链式处理后,模块会对中间结果做字符串拼接与长度计算。
- 在拼接过程中,一个整数溢出导致长度校验被绕过,后续的内存写入越界。
- 攻击者可以通过精心构造的请求路径触发这一溢出链条,最终在服务器进程空间中执行任意代码。
关键细节:这个缺陷自 2008 年 rewrite 模块重构时引入,此后每次模块微调都保留了原始的边界计算逻辑。18 年间所有人工审计——包括 NGINX 自身代码审查、多个开源安全项目扫描——都未触发这一路径,因为人工审计倾向于逐函数检查,而链式 rewrite 的跨规则交互恰恰是盲区。
AI 的发现方式:为什么人没看到,机器看到了
depthfirst 的 AI 系统采用了与传统静态分析截然不同的策略:
- 路径探索而非逐行审查:系统不是逐函数读代码,而是从 HTTP 请求入口出发,模拟所有可能的请求路径穿越 NGINX 内部模块链。当 URI 进入 rewrite 模块后,系统穷举了 rewrite 规则之间的组合交互——包括多轮 rewrite、正则捕获组回溯、
if条件分支等场景。 - 状态空间压缩:传统 fuzzing 面对如此大的组合空间会迅速耗尽资源。AI 系统通过抽象符号执行,将无限的具体请求压缩为有限的状态类,再对每个状态类做约束求解,找到能触发溢出的具体输入。
- "点击即分析":操作者只需指定目标软件版本和模块范围,系统自动完成从路径建模到约束求解到漏洞验证的全流程。这次分析从启动到确认漏洞,耗时不到一小时。
这恰恰击中了人工审计的短板:人很难系统地思考"规则 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 替代多轮跳转 |
rewrite 与 if 在同一块内混合使用 |
🔴 高 | 拆分为独立 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 一个席位。