nginx 1.30.1 发布:修复 rewrite 模块 RCE 与 HTTP/2 注入高危漏洞

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

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

预计阅读时间:7 分钟

nginx 1.30.1 刚刚发布,但这次不是常规的小版本迭代——它带着两个必须重视的安全补丁而来。其中一个是可能导致任意代码执行的堆溢出漏洞(CVE-2026-42945),另一个是 HTTP/2 请求体注入(CVE-2026-42926)。如果你的业务暴露在公网,升级优先级应该拉满。

rewrite 模块里的堆溢出:离 RCE 只差一步

CVE-2026-42945 影响的是 ngx_http_rewrite_module。这个模块在日常配置中出场率极高——只要你在 nginx 里写过 ifsetreturnrewrite 指令,就在使用它。

漏洞的根因是处理特制请求时发生了堆内存缓冲区溢出。堆溢出的危害不用多讲:攻击者精心构造的请求不仅能越界写内存,打垮 worker 进程造成拒绝服务,在特定内存布局下甚至能劫持控制流,实现任意代码执行。由于 rewrite 模块在请求处理早期阶段介入,且很多站点对外开启了不可控的输入源,这个漏洞的实际威胁面非常广。

proxy_set_body 配合 HTTP/2:请求体走私风险

CVE-2026-42926 针对的是使用了 proxy_set_body 指令的场景。这个指令允许管理员在代理请求时固定或动态修改发往后端的请求体。

问题出在 HTTP/2 的处理上。HTTP/2 采用二进制分帧传输,边界划分与 HTTP/1.1 的文本流不同。当 nginx 通过 proxy_set_body 重新设定请求体并转发给 HTTP/2 后端时,攻击者可以通过特制请求在代理请求中注入额外数据。这本质上是一种请求走私变体——后端可能将注入数据误判为新的请求帧,导致认证绕过、缓存投毒或内部接口被越权调用。

排查与升级实操

两个漏洞的触发条件都很具体,但现实中的配置往往比预期更复杂。下面是一套可以直接拿来跑的排查与升级流程。

第一步:确认当前版本与暴露面

在服务器上执行以下命令,确认是否在受影响范围内(1.30.1 之前的版本均受影响):

# 检查 nginx 版本
nginx -v

# 快速排查哪些站点用了 rewrite 模块的高危指令
# 排查 return / rewrite / if 等指令的外部暴露
grep -rnE "^\s*(if|rewrite|return|set)\s" /etc/nginx/

# 排查是否使用了触发 CVE-2026-42926 的 proxy_set_body
grep -rn "proxy_set_body" /etc/nginx/

如果 grep 命令输出了结果,尤其是 proxy_set_body 的命中项,你的风险敞口是明确的。

第二步:升级到 1.30.1

不同环境的升级路径不同,以下是最常见的包管理器升级方式:

# Ubuntu / Debian 环境(使用官方 nginx 仓库)
sudo apt update
sudo apt install nginx=1.30.1-1~$(lsb_release -cs)

# RHEL / CentOS / Rocky 环境
sudo yum update nginx
# 或指定版本
sudo yum install nginx-1.30.1

# 升级后务必验证二进制版本
nginx -v
# 预期输出:nginx version: nginx/1.30.1

第三步:升级后平滑重启

# 先验证配置文件没有语法错误,防止重启失败导致业务中断
sudo nginx -t

# 如果输出 syntax is ok / test is successful,执行平滑重启
# 平滑重启会让旧 worker 处理完当前请求后再退出,新 worker 接管新请求
sudo systemctl reload nginx

临时缓解方案(如果暂时无法升级)

针对 CVE-2026-42926,如果业务强依赖 proxy_set_body,可以在前端临时降级到 HTTP/1.1 代理,或直接注释掉该指令:

# 临时注释掉 proxy_set_body,阻断注入路径
server {
    listen 443 ssl;
    # proxy_set_body $request_body;  # 暂时注释,等待升级后恢复
    proxy_pass http://backend;
}

针对 CVE-2026-42945,rewrite 模块的漏洞没有简单的配置级缓解手段。最务实的做法是在 WAF/网关层对异常超长请求 URI 和参数进行长度与字符集限制,减少恶意请求到达 nginx rewrite 阶段的概率。

升级决策清单

面对安全补丁,运维往往需要在稳定性与安全性之间做取舍。对于 1.30.1 这次更新,建议按以下清单推进:

  • 评估暴露面:公网可达、且大量使用 rewrite 规则做路由/鉴权的网关节点,风险最高,必须在 24 小时内升级。
  • 内网节点:仅服务内部调用、且无 proxy_set_body 的节点,风险较低,可纳入常规发版窗口升级。
  • 配置回归测试:1.30.1 是安全补丁版本,不涉及行为变更,但升级前仍需跑一遍核心路由与代理的自动化测试,确认 rewrite 规则与代理转发逻辑无异常。
  • 滚动升级:多节点环境不要一次性全量 reload,按批次升级并观察 error.log 中是否有异常 crash 记录。

堆溢出 RCE 的杀伤力不需要再强调。与其在入侵发生后翻日志,不如现在花十分钟把版本推到 1.30.1。


相关推荐