加载失败
Nginx 是广泛使用的 web server 和 reverse proxy,这次讨论围绕公开漏洞 CVE-2026-42945,也被称为 “NGINX Rift”。漏洞位于 `ngx_http_rewrite_module`,本质是一个 heap buffer overflow,触发链和 `rewrite`、`set`、正则捕获组有关,评论里还提到它可能从很早的版本就存在。公开 PoC 试图把这个内存破坏推进到跨请求利用和 RCE,但是否能在默认 Linux 环境稳定复现,成为争论焦点。F5 已发布补丁和缓解建议,核心思路是用 named captures 替代 `$1/$2` 这类 unnamed captures;OpenResty(一个基于 Nginx 的 Lua 应用服务器发行版)也需要分别查看自己的修复进度。
不少人强调,这个漏洞不能因为公开 PoC 没有直接绕过 ASLR 就被视为“没那么危险”。评论里反复指出,ASLR 只是防御纵深的一层,真实攻击里常常还能继续补齐绕过手段,而且公开写法之外还可能存在更完整的利用链。有人提醒,即使最后不能立刻稳定拿到 RCE,至少也能造成可靠的 DoS,或者为后续的读内存、利用崩溃重试铺路。整体态度是:不要把“没看到完整武器化 PoC”误读成“没有风险”。
也有很多评论在拆解公开 PoC 的适用范围,认为它并不是对所有 nginx 部署都能直接打。触发条件包括 `rewrite` 里 replacement 字符串带 `?`,后面还要接 `set`、`if` 或另一个 `rewrite`,并且涉及未命名捕获如 `$1`、`$2`。PoC 还假设 ASLR 关闭,这让它在普通 Linux 发行版上的复现门槛更高。有人因此判断,当前公开代码更多是说明漏洞存在,而不是能被脚本小子直接照抄的现成武器。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7]
官方修复和缓解信息是这条讨论的另一核心。F5 的建议是把未命名捕获 `$1/$2` 改成 named captures,例如 `$user_id`、`$section`,同时已经给出对应版本的补丁。评论还提到 OpenResty(一个基于 Nginx 的 Lua 应用服务器发行版)也有自己的修补进度,说明不同分支需要分别确认。有人补充了 Debian、Ubuntu 的安全追踪链接和版本检查方法,强调 `nginx -v` 可能不够,要看完整包版本。
有些人认为这个漏洞看起来吓人,但在常见部署里未必广泛可触发,因为不一定用了有风险的 `ngx_http_rewrite_module` 配置。另一边则指出,`set` 在实际 nginx 配置里并不罕见,比如反代时设置 `proxy_set_header`,或者默认 PHP 集成里对路径信息的拆分。也有人说明,历史 URL 重写、子域名跳转这类场景仍然依赖 nginx 边缘层逻辑,不一定方便搬到应用代码里。最终形成的共识是:触发条件不算“无处不在”,但在真实生产配置中也绝不稀有。
讨论很快扩展到更大的问题:Apache 和 nginx 这类老牌 Web server 是否应该被 Go、Java 之类内存更安全的方案替代,或者改用 Caddy、Jetty 这类项目。回复普遍认为,任何达到这个规模的软件都会有漏洞历史,内存安全只能减少一类 bug,并不能自动消灭请求解析、逻辑错误或配置设计缺陷。Caddy 被夸易用,但它的插件/二进制组合方式也被认为有取舍;有人还指出,nginx 之所以还能扛住市场份额,本身就是成熟度的证明。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6]
ASLR: Address Space Layout Randomization,让进程内存地址随机化的防护机制,用来增加利用难度。
ngx_http_rewrite_module: Nginx 中负责 URL rewrite 的模块,这次漏洞就出在这里。
rewrite directive: Nginx 配置中的重写指令,用于改写请求 URI 或跳转路径。
named capture / unnamed capture: 正则表达式的捕获组;命名捕获用 `$name` 引用,未命名捕获常用 `$1/$2`。
checksec: 用于检查二进制硬化选项的工具,可查看 RELRO、Stack Canary、NX/PaX、PIE 等状态。