一、这不是演习:全球互联网基础设施正在遭遇一场无声攻击
2026年5月14日以来,全球数以百万计的Nginx服务器运维人员面临了一场突如其来的安全危机。
攻击者仅需发送一条精心构造的HTTP请求,即可使目标服务器的Nginx工作进程崩溃,甚至无需任何身份认证即可实现远程代码执行。这并非科幻剧情,而是正在互联网上真实上演的安全事件——漏洞编号CVE-2026-42945,代号“NGINX Rift”。
根据安全研究机构depthfirst的报告,该漏洞在Nginx代码库中潜伏了长达18年,最早可追溯至2008年发布的Nginx 0.6.27版本。这一时间跨度意味着,从2008年到2026年5月之前发布的几乎所有Nginx版本都受到影响。受影响的版本范围覆盖0.6.27至1.30.0,波及NGINX Open Source和NGINX Plus两大主线,以及大量基于Nginx的商业衍生产品,包括NGINX Ingress Controller、F5 WAF for NGINX、NGINX App Protect WAF、NGINX Gateway Fabric等。
安全机构VulnCheck的安全研究员Patrick Garrity披露,CVE-2026-42945公布仅三天后,其监测系统就已捕捉到野外的实际攻击行为。PoC(概念验证代码)在GitHub上同步公开,攻击者“读补丁的速度比大多数管理员还快”已经成为安全社区的共识。

如果你是Nginx的使用者,请拿出10分钟,按照本文的指引立即行动。
二、漏洞拆解:这枚“Rift”炸弹埋在何处
2.1 漏洞基本信息速览
| 项目 | 详情 |
|---|---|
| 漏洞编号 | CVE-2026-42945 |
| 漏洞代号 | NGINX Rift |
| 影响模块 | ngx_http_rewrite_module(重写模块) |
| 漏洞类型 | 堆缓冲区溢出 |
| CVSS v4评分 | 9.2(高危) |
| 引入时间 | 2008年(Nginx 0.6.27) |
| 受影响版本 | 0.6.27 ~ 1.30.0(含NGINX Plus R32~R36) |
| 修复版本 | 1.30.1(稳定版)/ 1.31.0(主线版) |
| 官方公告 | https://nginx.org/en/security_advisories.html |
2.2 技术原理:一次“算错账”引发的灾难
CVE-2026-42945的根源埋藏在Nginx脚本引擎的两阶段处理机制之中。
ngx_http_rewrite_module是Nginx核心模块之一,几乎每个生产环境都会使用到它的功能。当Nginx处理rewrite指令时,引擎会执行两遍流程:第一遍计算处理所需的内存缓冲区大小,第二遍才实际将数据拷贝进去。
问题出在一个名为is_args的标志位上。当rewrite指令的替换字符串中包含问号“?”时,该标志位在第一阶段结束后仍处于启用状态。结果就是:系统在计算缓冲区大小时使用的是未经转义的URI长度(较小),而在实际写入阶段写入的却是经过转义处理的更长数据(例如,“+”和“&”等字符从1字节膨胀到3字节),最终导致缓冲区溢出。
更麻烦的是,溢出写入的数据来自攻击者构造的URI,这意味着内存损坏的内容可以被攻击者主动塑形,而不是随机的垃圾数据——这使得稳定利用变得可行。
2.3 触发条件:你的服务器是否中招
漏洞触发的配置模式如下:
- rewrite指令后紧跟set、if或另一个rewrite指令
- rewrite指令中使用未命名的PCRE捕获组(例如1、1、2)
- rewrite的替换字符串中包含问号“?”
高风险配置示例:
# 示例1:API路由转发(极高风险)
rewrite ^/api/(.*)$ /internal?migrated=true; # 注意这里的?,使用了捕获组$1
set $original_endpoint $1;
# 示例2:伪静态URL美化
rewrite ^/news/([0-9]+)/?$ /article.php?id=$1&page=1;
set $article_id $1;
# 示例3:参数重定向
rewrite ^/old/(.*)$ /new/?ref=$1;
if ($query_string != "") {
set $has_args "1";
}
只要你的nginx.conf中存在“以?结尾的rewrite + 后续使用捕获组的set/if/rewrite”模式,就极有可能受到此漏洞影响。
2.4 攻击后果:从服务崩溃到服务器沦陷
根据F5官方的安全公告和安全媒体的分析,攻击者利用CVE-2026-42945可以实现以下几种后果:
服务拒绝(DoS): 攻击者发送特制HTTP请求后,Nginx工作进程因堆缓冲区溢出而崩溃。虽然主进程会自动重启新的worker,但服务会出现短暂中断(通常3-5秒)。对于高频交易场景或大型电商平台,每一次中断都可能造成实实在在的经济损失。
远程代码执行(RCE): 对于关闭了ASLR(地址空间布局随机化)保护的系统,攻击者有潜力实现远程代码执行,直接拿下服务器的控制权限。ASLR是现代操作系统默认启用的内存防护机制,但部分追求性能的嵌入式系统、老旧虚拟机环境可能会将其关闭。
持续的崩溃循环: 攻击者可以反复发送恶意请求,使worker进程陷入“崩溃→重启→再崩溃”的死循环,导致服务持续不可用。攻击者控制的溢出字节可重复利用这一特性。
企小脉提示:根据The Hacker News和CybersecurityNews的报道,虽然现代Linux系统默认启用ASLR降低了RCE的成功率,但DoS攻击的门槛极低,任何未升级的Nginx服务都暴露在服务中断的风险之下。
三、影响面有多大?一组数据告诉你
全球约570万台互联网暴露的Nginx服务器运行着可能受此漏洞影响的版本。
Nginx承载着全球网站流量中约三分之一的份额——从大型电商平台、金融机构、云服务商,到API网关和Kubernetes Ingress控制器,无一不在其覆盖范围内。
中国的受影响网站数量超过254万个。意味着大量国内企业的Web服务、API接口、反向代理、容器编排平台都面临着直接威胁。
Kubernetes社区使用的NGINX Ingress Controller自v1.13.3以来一直基于Nginx 1.27.1版本,同样受此漏洞影响。在云原生架构日益普及的当下,这个漏洞的影响范围远超传统Web服务器范畴。
四、企业Nginx运维紧急应对方案
4.1 步骤一:立即自查——你的Nginx是否在受影响之列
① 检查Nginx版本
nginx -v # 或 /usr/sbin/nginx -V
如果输出版本号在0.6.27 ~ 1.30.0之间(包括这两端),系统处于高危状态。
② 检查配置文件中的风险规则
# 在nginx.conf所在目录执行 grep -rn "rewrite.*?.*$[0-9]" ./ --include="*.conf"
重点关注rewrite指令中包含问号“?”且后续有set/if/rewrite指令的模式。
③ 检查NGINX Ingress Controller版本(K8s环境)
kubectl get po -A | grep nginx-ingress | grep controller
受影响版本包括open-source NGINX Ingress Controller v1.13.9及更早版本、v1.14.5及更早版本。
4.2 步骤二:升级Nginx(推荐的方案)
官方已于2026年5月13日发布了修复版本。以下为各平台的升级操作指引。
Debian / Ubuntu:
# 更新软件源并升级 sudo apt update sudo apt install nginx # 验证升级 nginx -v sudo nginx -t && sudo systemctl reload nginx
CentOS / RHEL / Rocky / AlmaLinux:
# 添加官方源后升级 sudo yum update nginx # 或使用dnf(新版系统) sudo dnf update nginx # 验证升级 nginx -v sudo nginx -t && sudo systemctl reload nginx
源码编译用户:
- 从官方下载页面获取nginx-1.30.1(稳定版)或nginx-1.31.0(主线版)
- 重新编译并安装,确保新版本二进制文件被正确加载
NGINX Plus商业版用户:
| 受影响版本 | 修复版本 |
|---|---|
| R32 ~ R36 | R32 P6 / R35 P2 / R36 P4 |
NGINX Ingress Controller(K8s环境):
- 社区版:升级至v1.13.10及以上 / v1.14.6及以上
- CCE NGINX Ingress Controller插件:升级至v5.0.15及以上 / v6.0.25及以上
4.3 步骤三:升级后验证
nginx -v # 确认显示 1.30.1 或 1.31.0 # 配置语法检查 sudo nginx -t # 重新加载配置(不中断现有连接) sudo systemctl reload nginx # 查看worker进程状态 ps aux | grep "nginx: worker"
4.4 升级前的临时缓解措施
如果因为业务原因无法立即升级,可采用以下临时方案缓解风险:
方案一:将未命名捕获组替换为命名捕获组
官方给出的缓解方法是将受影响rewrite规则中的未命名正则捕获(1、1、2)改为命名捕获(例如$user_id)。命名捕获不会进入有问题的转义路径,能够移除攻击面。
风险配置示例(需修改):
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2last; set $user_id $1;
修复后配置示例:
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$sectionlast; set $user_info $user_id;
方案二:避免rewrite指令以“?”结尾
检查所有rewrite规则,将可能导致漏洞触发的问号移出替换字符串。例如将rewrite中的“?迁移至后续拼接逻辑中处理。
方案三:调整规则顺序——将set指令提前到rewrite之前
# 修改前(高风险) rewrite ^/api/(.*)$ /internal?target=$1; set $original $1; # 修改后(低风险) set $original $1; rewrite ^/api/(.*)$ /internal?target=$1;
需要注意:修改前务必备份原配置文件,并在修改后使用nginx -t进行语法验证。临时措施无法完全替代升级,仅用于过渡阶段争取升级时间。
五、批量化运维场景下的应对策略
对于管理成百上千台Nginx服务器的运维团队,单台逐一手动升级不现实。以下是企小脉针对批量化场景提供的几条实操建议。
5.1 自动化版本扫描与告警
建议将以下检测集成到日常自动化巡检体系中:
使用Ansible批量检查:
- name: Check Nginx versions across inventory
hosts: web_servers
gather_facts: no
tasks:
- name: Get nginx version
command: nginx -v 2>&1
register: nginx_version
- name: Warn if vulnerable version detected
debug:
msg: "Vulnerable Nginx version detected on {{ inventory_hostname }}: {{ nginx_version.stderr }}"
when:
- "'nginx/0.' in nginx_version.stderr or 'nginx/1.' in nginx_version.stderr"
- "'nginx/1.30.1' not in nginx_version.stderr and 'nginx/1.31.0' not in nginx_version.stderr"
5.2 分批升级策略
建议按以下优先级分批完成升级:
- 第一批(24小时内完成) :公网暴露的Nginx实例、API网关、Kubernetes Ingress Controller
- 第二批(48小时内完成) :反向代理集群、负载均衡器
- 第三批(1周内完成) :内部服务的Nginx实例、开发测试环境
5.3 灾备演练不可少
在正式升级生产环境之前,务必在预发布或测试环境完成一轮升级演练,验证新版本的兼容性。有些Nginx模块或第三方扩展可能与1.30.1/1.31.0版本存在依赖关系需要同步更新。
5.4 升级后的长期监测
完成升级并重启Nginx服务后,建议持续监测以下指标:
- Nginx worker进程的崩溃/重启频率
- 异常的rewrite相关请求日志,重点关注包含大量“%2B”“%26”“%3F”等URL编码字符的访问
- 服务器CPU和内存使用情况,排查潜在的异常波动
一旦发现异常波动,立即进行日志取证,确认是否为漏洞扫描或攻击尝试。
六、其他已修复的安全漏洞
Nginx 1.30.1和1.31.0版本本次一并修复了5个其他安全漏洞,升级一次即可全部覆盖:
| 漏洞编号 | 严重程度 | 简要描述 |
|---|---|---|
| CVE-2026-42926 | 中高危 | HTTP/2请求注入 |
| CVE-2026-42946 | 高危 | SCGI/UWSGI模块缓冲区越界读取 |
| CVE-2026-42934 | 中危 | HTTP/3地址伪造 |
| CVE-2026-40460 | 中危 | OCSP resolver use-after-free |
| CVE-2026-40701 | 中危 | 其他内存相关问题 |
七、企小脉给企业Nginx运维的长期安全建议
7.1 建立官方安全公告跟踪机制
建议将以下渠道纳入日常安全情报监控:
- NGINX官方安全公告:https://nginx.org/en/security_advisories.html
- F5安全公告:https://my.f5.com/manage/s/article/K000161019
- NVD国家漏洞数据库对CVE-2026-42945的持续更新
7.2 采用最小化模块加载原则
仅加载业务必需的Nginx模块。对不需要的模块(如dav、mp4、mail等)明确禁用,既能减少攻击面,也能提升服务性能。
# 编译时禁用不必要的模块示例
./configure --without-http_dav_module \
--without-http_mp4_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module
7.3 启用前置安全防护
在Nginx前端配置WAF(Web应用防火墙)或使用云服务商的安全防护产品(如Cloudflare、阿里云WAF)。前置防护可以在漏洞修补的空窗期内阻断大量自动化扫描和攻击尝试,为运维争取宝贵的反应时间。
7.4 异常日志监控
建立针对rewrite相关异常的日志告警规则,重点关注:
- 异常增多的400/502错误状态码
- 访问日志中包含大量URL编码字符(%2B、%26、%3F等)的请求
- Nginx错误日志中的memory allocation相关报错
# 监控worker进程异常重启
tail -f /var/log/nginx/error.log | grep -E "worker process.*exited|signal"
# 监控可疑访问模式
tail -f /var/log/nginx/access.log | grep -E "(%2B|%26|%3F){3,}"
7.5 配置文件的变更审计与版本管理
建议使用Git等版本控制系统管理nginx.conf及相关配置文件的每一次变更。清晰的变更历史不仅便于回滚,也便于在漏洞爆发时快速定位高风险配置,评估受影响的服务器范围。
7.6 容器化与K8s场景下的补充建议
- 定期更新NGINX Ingress Controller镜像基础版本
- 在容器编排层面启用Liveness Probe和Readiness Probe,以便在worker crash时自动摘除不健康Pod并快速恢复
- 避免在生产容器环境中关闭ASLR等默认安全机制
八、紧急行动清单
如果你的Nginx版本仍在0.6.27到1.30.0之间,这份清单值得逐项核对:
- 运行 nginx -v 确认当前版本
- 检查nginx.conf中是否存在“rewrite … ? … $n” + 后续set/if/rewrite的风险模式
- 根据操作系统选择对应的升级命令(apt/yum/dnf或源码编译)
- 升级完成后执行 nginx -t 检查配置语法
- 执行 systemctl reload nginx 使配置生效
- 验证nginx -v输出是否为1.30.1或1.31.0(NGINX Plus则为R32 P6/R35 P2/R36 P4)
- 监测error.log确认worker进程运行正常
- 如为K8s环境,检查并更新NGINX Ingress Controller版本
- 将本次漏洞修复纳入公司的基线安全配置标准
现在就去执行检查吧。
如果你在操作过程中遇到任何问题,欢迎通过企小脉平台获取技术支持,我们将持续关注NGINX Rift漏洞的动态,为你的企业服务器安全保驾护航。
本文基于2026年5月20日前公开的安全公告和技术分析撰写。安全形势瞬息万变,建议读者关注官方渠道获取信息更新。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...













