nginx 1.31.1 发布:一次安全修复驱动的主线升级,涉及 Rewrite、HTTP/2、Mail、MP4 与工作流修正



2026年5月23日,nginx-1.31.1 mainline version 正式发布。
本次版本更新最核心的看点,是修复了 ngx_http_rewrite_module 中的缓冲区溢出漏洞 CVE-2026-9256。同时,官方还同步带来了一系列围绕 HTTP/2、Mail、MP4 以及发布工作流的修复与改进。
如果你正在关注 nginx 主线版本的安全性、稳定性和可维护性,这次 1.31.1 版本非常值得认真看一遍。下面我将基于官方 release 信息和变更摘要,完整梳理这次更新内容,帮助你快速理解本次升级的重点。
一、版本发布概览
nginx-1.31.1 是 nginx 主线版本的一次更新,发布时间为 2026年5月23日。
官方说明中明确指出:这次发布修复了 ngx_http_rewrite_module 中的一个缓冲区溢出漏洞,漏洞编号为 CVE-2026-9256。
从 release summary 来看,本次更新包含:
- 发布工作流修正
- MP4 模块空指针相关处理
- HTTP/2 响应头长度限制
- Mail 模块错误路径修复
- Rewrite 模块安全加固
- Rewrite 模块缓冲区溢出修复
- 版本号更新到 1.31.1
从变更数量上看,这次版本并不是大规模功能扩展,而是非常典型的“安全修复 + 稳定性增强”版本。对于生产环境来说,这类版本尤其重要,因为它直接关系到运行安全和请求处理的可靠性。
二、最重要的安全修复:Rewrite 模块缓冲区溢出
本次版本最关键的内容,毫无疑问是:
Rewrite: fix buffer overflow with overlapping captures
官方中文 changelog 中对应的描述是:
当使用 ngx_http_rewrite_module 的配置并且存在重叠捕获时,工作进程中可能发生堆内存缓冲区溢出,从而潜在导致任意代码执行(CVE-2026-9256)。
这意味着什么?
简单说,问题出现在 rewrite 相关处理逻辑中,当配置里存在某些重叠捕获场景时,可能会触发堆内存越界写入或越界访问,最终导致程序异常,严重时甚至可能被利用执行任意代码。
对于 Web 服务器而言,这类漏洞属于高危级别,因此这次修复是整个 1.31.1 版本的核心。
这次修复涉及什么变化
从源码变更可以看到,src/http/ngx_http_script.c 做了多处调整,主要集中在 rewrite 脚本执行与长度计算逻辑上:
1)长度计算更严谨
原逻辑中在计算缓冲区长度时,对捕获内容和 URI 转义处理的长度统计进行了调整,修复后采用了更安全的捕获数据长度来源,避免在重叠捕获情况下出现错误长度计算。
变更点包括:
- 计算
e->buf.len时,改用捕获数组中的长度差来累计 - 对 URI 场景下的转义长度计算进行更准确的处理
- 处理捕获数据时更加谨慎,减少越界风险
2)增加 e->is_args = 0;
在 ngx_http_script_regex_start_code() 中增加了:
e->is_args = 0;
这说明脚本执行上下文在进入某些正则处理后,会显式重置参数状态,避免后续字符串拼接或 URI 处理时沿用错误状态。
3)复杂值计算时传递 le.is_args
在 ngx_http_script_complex_value_code() 中新增:
le.is_args = e->is_args;
这意味着复杂值计算阶段现在会携带参数状态,保证 URI、参数、转义等行为保持一致,减少边界情况下的逻辑偏差。
为什么这是必须重视的修复
rewrite 模块广泛用于:
- URL 重写
- 路由跳转
- 条件匹配
- 参数拼接
- 地址重定向
也就是说,它几乎是很多 nginx 站点的基础能力。一旦这里存在缓冲区溢出,影响面会非常大。
因此,如果你的 nginx 配置中使用了 rewrite 规则,尤其是复杂正则、捕获组、重写跳转、URI 拼接等逻辑,那么这次升级应该优先考虑。
三、HTTP/2:限制响应头 Content-Type 和 Location 长度
本次更新中,src/http/v2/ngx_http_v2_filter_module.c 也有明显调整,主要是对 HTTP/2 响应头字段长度做限制。
新增逻辑包括:
1)限制 Content-Type 长度
当 r->headers_out.content_type.len 超过 NGX_HTTP_V2_MAX_FIELD 时,会记录严重日志并返回错误:
- 日志内容表示:响应头值过长
- 头字段示例为:
Content-Type
2)限制 Location 长度
当 r->headers_out.location->value.len 超过 NGX_HTTP_V2_MAX_FIELD 时,同样会:
- 记录严重日志
- 返回错误
这类修复的意义
HTTP/2 响应头在传输和编码上有严格约束。
如果头字段过长,可能导致:
- 编码处理异常
- 内存处理压力增加
- 协议层兼容性问题
- 非预期的请求失败
本次修复的做法很直接:
在进入后续逻辑前先做长度检查,避免异常头值继续向下传播。
这类修改不改变正常场景的行为,但能显著增强边界条件下的稳定性。对于采用 HTTP/2 的站点来说,这属于非常典型且必要的健壮性修补。
四、MP4 模块:避免空指针参与比较或处理
在 src/http/modules/ngx_http_mp4_module.c 中,ngx_http_mp4_read() 的判断条件做了调整。
原先逻辑中,相关判断只检查了缓冲区位置和结束位置的关系。
现在改成了:
- 先确认
mp4->buffer_pos非空 - 再确认
mp4->buffer_end非空 - 然后再判断
mp4->buffer_pos + size <= mp4->buffer_end
这说明了什么
这类修改通常是为了避免在某些异常路径下:
- 对空指针做加法
- 对空指针做比较
- 或者在缓冲区尚未正确初始化时执行后续读取逻辑
虽然这次没有被描述为安全漏洞,但它明显是一个稳健性增强修复。
对于涉及 MP4 处理的请求场景,空指针问题往往会导致:
- 进程异常
- 请求失败
- 资源读取错误
- 难以定位的偶发问题
所以这个变更的目标很明确:
让 MP4 读取逻辑对空状态更安全,减少异常路径下的错误行为。
五、Mail 模块:错误路径修复与会话清理优化
这次更新中,Mail 相关模块也有多处修复,涉及:
src/mail/ngx_mail_imap_handler.csrc/mail/ngx_mail_pop3_handler.csrc/mail/ngx_mail_proxy_module.csrc/mail/ngx_mail_smtp_handler.c
虽然这些修改看起来比较小,但它们主要集中在错误路径处理和事件处理流程上,非常关键。
1)IMAP 初始化会话:读事件处理失败时关闭连接
在 ngx_mail_imap_init_session() 中增加了判断:
- 如果
ngx_handle_read_event(c->read, 0)失败 - 则调用
ngx_mail_close_connection(c) - 并直接返回
这意味着 IMAP 初始化过程中,如果读取事件无法正确挂载,就不会继续向下走,而是立刻关闭连接,避免后续使用无效连接状态。
2)POP3 初始化会话:同样增加失败退出
在 ngx_mail_pop3_init_session() 中,也采用了相同的处理方式:
- 读事件处理失败
- 关闭连接
- 返回
这说明 IMAP 和 POP3 的初始化路径都被统一增强了错误处理逻辑。
3)Mail 代理写事件:写事件处理失败时进入内部错误
在 ngx_mail_proxy_write_handler() 中增加了:
- 如果
ngx_handle_write_event(wev, 0)失败 - 调用
ngx_mail_proxy_internal_server_error(s) - 然后返回
这表明 Mail 代理模块在写事件处理失败时,不再继续执行后续逻辑,而是直接走错误处理路径,避免状态错乱。
4)SMTP greeting 处理逻辑修正
在 ngx_mail_smtp_greeting() 中,新增了读事件处理失败的判断:
- 失败则关闭连接并返回
同时,原有逻辑中还保留了:
- 如果
c->read->ready,则把读事件加入已投递事件队列 - 如果
sscf->greeting_delay存在,则将读事件处理器设置为ngx_mail_smtp_invalid_pipelining并返回 - 否则设置为
ngx_mail_smtp_init_protocol
从 diff 来看,这里还存在一些格式与结构上的整理,使 greeting 流程更清晰、更稳定。
这些 Mail 修复的整体意义
Mail 模块虽然不是所有 nginx 部署都在使用,但一旦使用,就要求连接处理极其稳定。
这次更新把多个初始化与写事件路径上的失败处理补齐,目标是:
- 避免无效连接继续运行
- 避免事件挂载失败后程序进入不一致状态
- 提高错误路径的可控性
- 减少 Mail 服务在异常场景下的崩溃或行为异常
六、发布工作流修正
在 .github/workflows/set-creation-date.yaml 中,做了一个很小但重要的修复:
原来的日期字段获取逻辑中,Created at 和 Created At 的写法存在差异,更新后修正了工作流中对字段名称的匹配。
这类修复的作用主要是:
- 让自动化流程更稳定
- 避免字段名称不一致导致获取失败
- 保障发布或项目管理流程正常运作
虽然它不影响 nginx 运行时功能,但对发行流程和仓库维护是有帮助的。
七、版本号更新
在 src/core/nginx.h 中,版本号从:
1.31.0
更新为:1.31.1
对应的内部版本数字也从:
1031000
变为:1031001
这属于标准版本递增,说明本次发布正式进入 1.31.1。
八、官方变更摘要完整梳理
根据 release summary,本次更新的“What’s Changed”内容可以概括为以下几项:
- 修复 set-creation-date.yaml 工作流
- MP4:避免添加或比较空指针
- HTTP/2:限制 Content-Type 和 Location 响应头长度
- Mail:修复错误路径
- Rewrite:加强 escape flags 控制
- Rewrite:修复重叠捕获导致的缓冲区溢出
- nginx-1.31.1-RELEASE
如果按影响程度排序,最重要的无疑是:
- Rewrite 缓冲区溢出修复
- Rewrite 相关安全加固
- HTTP/2 响应头限制
- Mail 错误路径修复
- MP4 空指针防护
九、这次更新的整体评价
nginx 1.31.1 不是一个“功能爆发型”版本,而是一个非常典型的“安全和稳定性修复型”版本。
它的价值主要体现在以下几个方面:
1)安全性显著提升
CVE-2026-9256 是本次最核心的安全问题,修复后能有效降低被利用风险。
2)边界处理更严格
HTTP/2 对响应头长度限制、MP4 对空指针保护,都说明 nginx 对异常输入的处理更成熟。
3)错误路径更健壮
Mail 模块在初始化和写事件失败时的处理更加明确,减少悬挂状态。
4)配置相关逻辑更稳妥
Rewrite 模块是 nginx 配置能力的重要部分,这次修复对于大量依赖重写规则的场景尤其重要。
十、结语
代码地址:https://github.com/nginx/nginx
总的来说,nginx 1.31.1 是一个非常值得关注的主线版本。
它不仅修复了 ngx_http_rewrite_module 中可能导致缓冲区溢出的高危问题,还对 HTTP/2、MP4、Mail 等模块做了边界与错误路径修复,同时也完善了发布工作流。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)