在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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.c
  • src/mail/ngx_mail_pop3_handler.c
  • src/mail/ngx_mail_proxy_module.c
  • src/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 atCreated At 的写法存在差异,更新后修正了工作流中对字段名称的匹配。

这类修复的作用主要是:

  • 让自动化流程更稳定
  • 避免字段名称不一致导致获取失败
  • 保障发布或项目管理流程正常运作

虽然它不影响 nginx 运行时功能,但对发行流程和仓库维护是有帮助的。


七、版本号更新

src/core/nginx.h 中,版本号从:

  • 1.31.0
    更新为:
  • 1.31.1

对应的内部版本数字也从:

  • 1031000
    变为:
  • 1031001

这属于标准版本递增,说明本次发布正式进入 1.31.1。


八、官方变更摘要完整梳理

根据 release summary,本次更新的“What’s Changed”内容可以概括为以下几项:

  1. 修复 set-creation-date.yaml 工作流
  2. MP4:避免添加或比较空指针
  3. HTTP/2:限制 Content-Type 和 Location 响应头长度
  4. Mail:修复错误路径
  5. Rewrite:加强 escape flags 控制
  6. Rewrite:修复重叠捕获导致的缓冲区溢出
  7. 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 等模块做了边界与错误路径修复,同时也完善了发布工作流。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐