NGINX CVE-2026-42945 漏洞修复实战记录

2026-06-03 08:16:46 57

NGINX CVE-2026-42945 漏洞修复实战记录

作者:Cy23
日期:2026年6月3日
环境:CentOS 6/7,NGINX 1.27.2(编译安装)


一、背景

2026年5月,NGINX官方披露了一个严重漏洞 CVE-2026-42945(代号Rift),影响自0.6.27至1.30.0的绝大部分NGINX版本。漏洞存在于ngx_http_rewrite_module模块中,由于内部标志位管理错误导致堆缓冲区溢出,攻击者可利用精心构造的HTTP请求触发Worker进程崩溃,甚至实现远程代码执行。

我的服务器运行的是NGINX 1.27.2(mainline分支),恰好在受影响范围内。经过评估,决定立即升级到修复版本1.30.2(stable分支)。

二、升级前准备

首先确认当前版本和编译参数:

nginx -v
nginx -V

输出显示:

  • 版本:nginx/1.27.2
  • 编译参数:--prefix=/usr/local/nginx(无其他额外模块)

然后安装编译所需的依赖:

yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel

三、完整备份(至关重要)

DATE=$(date +%Y%m%d%H%M)
cp -a /usr/local/nginx /usr/local/nginx.backup.$DATE
mkdir -p /root/nginx_bak
cp -a /usr/local/nginx/conf /root/nginx_bak/conf.$DATE
if [ -f /etc/init.d/nginx ]; then cp -a /etc/init.d/nginx /root/nginx_bak/init.nginx.$DATE; fi

四、下载并编译修复版本

从nginx.org下载1.30.2稳定版源码:

cd /usr/local/src
wget https://nginx.org/download/nginx-1.30.2.tar.gz
tar -zxvf nginx-1.30.2.tar.gz
cd nginx-1.30.2

使用原编译参数进行配置:

./configure --prefix=/usr/local/nginx

编译:

make -j$(nproc)

验证编译产物:

ls -lh objs/nginx

输出显示二进制文件大小3.8M,编译成功。

五、替换二进制与重启

先备份旧二进制:

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old.$(date +%Y%m%d%H%M)

测试新二进制能否读取现有配置:

/usr/local/src/nginx-1.30.2/objs/nginx -t -c /usr/local/nginx/conf/nginx.conf

返回“syntax is ok”和“test is successful”。

替换二进制:

cp /usr/local/src/nginx-1.30.2/objs/nginx /usr/local/nginx/sbin/nginx

由于我的服务器使用service nginx start管理,选择允许短暂停机的重启方式(选项A):

service nginx stop
sleep 1
service nginx start

六、验证升级结果

nginx -v

输出:nginx version: nginx/1.30.2

nginx -t

配置语法检查通过。

ps aux | grep 'nginx:' | grep -v grep

显示一个master进程和多个worker进程正常运行。

curl -I http://127.0.0.1/

返回HTTP/1.1 200 OK,网站正常访问。

七、总结

本次升级过程顺利,从发现问题、备份、编译到替换重启,总耗时约30分钟(主要花费在源码编译)。核心经验:

  • 对于编译安装的NGINX,采用同参数重新编译覆盖是最直接可靠的升级方式。
  • 务必做好完整备份(包括配置、二进制、启动脚本),以便快速回滚。
  • 升级前先用新二进制测试配置兼容性,避免上线后出错。
  • 如果业务不允许中断,可采用USR2/WINCH/QUIT信号进行零停机热升级。

至此,CVE-2026-42945漏洞已成功修复,服务器安全得到保障。