



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 来看,本次更新包含:
从变更数量上看,这次版本并不是大规模功能扩展,而是非常典型的“安全修复 + 稳定性增强”版本。对于生产环境来说,这类版本尤其重要,因为它直接关系到运行安全和请求处理的可靠性。
本次版本最关键的内容,毫无疑问是:
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 脚本执行与长度计算逻辑上:
原逻辑中在计算缓冲区长度时,对捕获内容和 URI 转义处理的长度统计进行了调整,修复后采用了更安全的捕获数据长度来源,避免在重叠捕获情况下出现错误长度计算。
变更点包括:
e->buf.len 时,改用捕获数组中的长度差来累计e->is_args = 0;在 ngx_http_script_regex_start_code() 中增加了:
e->is_args = 0;这说明脚本执行上下文在进入某些正则处理后,会显式重置参数状态,避免后续字符串拼接或 URI 处理时沿用错误状态。
le.is_args在 ngx_http_script_complex_value_code() 中新增:
le.is_args = e->is_args;这意味着复杂值计算阶段现在会携带参数状态,保证 URI、参数、转义等行为保持一致,减少边界情况下的逻辑偏差。
rewrite 模块广泛用于:
也就是说,它几乎是很多 nginx 站点的基础能力。一旦这里存在缓冲区溢出,影响面会非常大。 因此,如果你的 nginx 配置中使用了 rewrite 规则,尤其是复杂正则、捕获组、重写跳转、URI 拼接等逻辑,那么这次升级应该优先考虑。
本次更新中,src/http/v2/ngx_http_v2_filter_module.c 也有明显调整,主要是对 HTTP/2 响应头字段长度做限制。
新增逻辑包括:
当 r->headers_out.content_type.len 超过 NGX_HTTP_V2_MAX_FIELD 时,会记录严重日志并返回错误:
Content-Type当 r->headers_out.location->value.len 超过 NGX_HTTP_V2_MAX_FIELD 时,同样会:
HTTP/2 响应头在传输和编码上有严格约束。 如果头字段过长,可能导致:
本次修复的做法很直接: 在进入后续逻辑前先做长度检查,避免异常头值继续向下传播。
这类修改不改变正常场景的行为,但能显著增强边界条件下的稳定性。对于采用 HTTP/2 的站点来说,这属于非常典型且必要的健壮性修补。
在 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 相关模块也有多处修复,涉及:
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虽然这些修改看起来比较小,但它们主要集中在错误路径处理和事件处理流程上,非常关键。
在 ngx_mail_imap_init_session() 中增加了判断:
ngx_handle_read_event(c->read, 0) 失败ngx_mail_close_connection(c)这意味着 IMAP 初始化过程中,如果读取事件无法正确挂载,就不会继续向下走,而是立刻关闭连接,避免后续使用无效连接状态。
在 ngx_mail_pop3_init_session() 中,也采用了相同的处理方式:
这说明 IMAP 和 POP3 的初始化路径都被统一增强了错误处理逻辑。
在 ngx_mail_proxy_write_handler() 中增加了:
ngx_handle_write_event(wev, 0) 失败ngx_mail_proxy_internal_server_error(s)这表明 Mail 代理模块在写事件处理失败时,不再继续执行后续逻辑,而是直接走错误处理路径,避免状态错乱。
在 ngx_mail_smtp_greeting() 中,新增了读事件处理失败的判断:
同时,原有逻辑中还保留了:
c->read->ready,则把读事件加入已投递事件队列sscf->greeting_delay 存在,则将读事件处理器设置为 ngx_mail_smtp_invalid_pipelining 并返回ngx_mail_smtp_init_protocol从 diff 来看,这里还存在一些格式与结构上的整理,使 greeting 流程更清晰、更稳定。
Mail 模块虽然不是所有 nginx 部署都在使用,但一旦使用,就要求连接处理极其稳定。 这次更新把多个初始化与写事件路径上的失败处理补齐,目标是:
在 .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”内容可以概括为以下几项:
如果按影响程度排序,最重要的无疑是:
nginx 1.31.1 不是一个“功能爆发型”版本,而是一个非常典型的“安全和稳定性修复型”版本。 它的价值主要体现在以下几个方面:
CVE-2026-9256 是本次最核心的安全问题,修复后能有效降低被利用风险。
HTTP/2 对响应头长度限制、MP4 对空指针保护,都说明 nginx 对异常输入的处理更成熟。
Mail 模块在初始化和写事件失败时的处理更加明确,减少悬挂状态。
Rewrite 模块是 nginx 配置能力的重要部分,这次修复对于大量依赖重写规则的场景尤其重要。
代码地址:https://github.com/nginx/nginx
总的来说,nginx 1.31.1 是一个非常值得关注的主线版本。 它不仅修复了 ngx_http_rewrite_module 中可能导致缓冲区溢出的高危问题,还对 HTTP/2、MP4、Mail 等模块做了边界与错误路径修复,同时也完善了发布工作流。