直接在源码编译前用patch命令打补丁是修复nginx已知安全漏洞最精准、对生产环境扰动最小的方式;关键在于补丁必须匹配正确版本、使用-p1参数在解压后顶层目录执行,并通过diff或git验证生效,全过程须在./configure前完成。

直接在源码编译前用 patch 命令打补丁,是修复 Nginx 已知安全漏洞最精准、对生产环境扰动最小的方式。它不改变版本号、不引入新功能、不破坏原有模块兼容性,只修正漏洞代码本身。关键在于补丁必须打在正确版本的源码上、用对层级参数、并验证是否真正生效。
确认漏洞与补丁匹配性
安全补丁不是通用药丸,必须严格对应 Nginx 版本和启用模块:
- 查当前版本:
nginx -V输出中找configure arguments和版本字符串(如nginx/1.24.0) - 核对补丁说明:官方补丁文件名通常含版本,如
nginx-1.24.0-CVE-2022-41741.patch;非官方补丁需确认其生成所基于的 commit 或版本 - 检查模块依赖:例如 CVE-2022-41741 只影响启用了
--with-http_mp4_module的实例,若未启用该模块,打补丁无实际意义 - 避免“强行打”:若补丁提示
Hunk FAILED,大概率是版本不匹配,不要加-f强制应用
准备环境并进入源码根目录
补丁操作必须在解压后的顶层目录执行,不能进错子目录:
- 安装必要工具:
yum install -y patch gcc make pcre-devel zlib-devel openssl-devel(CentOS/RHEL)或apt-get install -y patch build-essential libpcre3-dev zlib1g-dev libssl-dev(Debian/Ubuntu) - 解压源码:
tar -zxf nginx-1.24.0.tar.gz,然后cd nginx-1.24.0/—— 这个路径必须是源码包解压后最外层目录,里面应有src/、auto/、configure等 - 切勿进入
src/或src/core/后再打补丁,否则-p1会失效
执行 patch 并验证修改结果
标准命令是 patch -p1 ,其中 <code>-p1 表示忽略补丁路径中第一个 / 前的目录名:
- 成功输出示例:
patching file src/http/modules/ngx_http_mp4_module.c,且每块Hunk #X succeeded - 若提示
Reversed (or previously applied) patch detected!,说明可能已打过同款补丁,可跳过 - 手动验证是否生效:用
git diff(如果已初始化 git)或diff -u src/http/modules/ngx_http_mp4_module.c.orig src/http/modules/ngx_http_mp4_module.c查看关键修复行是否写入 - 重点关注补丁描述中的函数名和条件判断,比如 CVE-2022-41741 补丁一定会新增类似
if (end - atom_header > atom_size)的边界检查
编译安装与上线前验证
补丁打完即进入标准编译流程,无需额外开关或标记:
- 运行
./configure(可复用原nginx -V中的参数,确保模块一致) - 执行
make && make install - 测试配置:
/usr/local/nginx/sbin/nginx -t,确保语法通过 - 检查构建信息:
/usr/local/nginx/sbin/nginx -V,虽然版本号不变,但可观察是否有新增模块名或自定义编译标记(部分补丁会注入标识) - 启动后,建议用 PoC 请求(如构造特定 MP4 请求)做轻量级功能验证,确认漏洞路径已被拦截而非仅崩溃











