



2026年7月18日,nginx官方正式发布mainline主线版本nginx 1.31.3。作为全球使用最广泛的Web服务器与反向代理软件,nginx的每一次版本迭代都牵动着数百万运维与开发者的目光。本次1.31.3版本更新尤为关键——一次性修复了三项已分配CVE编号的安全漏洞,覆盖缓冲区溢出、内存泄露、释放后使用等高危风险类型,同时带来了HTTP/2协议栈多项修复、上游代理能力增强、隧道机制改进、Perl模块重构等多达34次提交、42个文件变更的大规模更新。
nginx 1.31.3属于mainline主线开发版本,是nginx官方持续迭代新功能的分支。本次版本发布包含以下核心数据:
从提交时间线来看,本次版本的开发周期从6月23日版本号提升开始,持续到7月16日正式发布,历时约三周。密集的提交集中在7月14日至7月15日,大量安全修复与功能改进在这两天内合入主干,体现了本次版本以安全加固为核心的发布基调。
本次版本最受关注的无疑是三项安全漏洞的集中修复。这三个漏洞分别影响不同的nginx模块与使用场景,风险等级均处于中高危区间,建议受影响用户尽快评估并升级。
漏洞描述:当使用map指令配合正则表达式时,存在缓冲区溢出漏洞。
影响范围:所有在配置中使用了map模块且map规则中包含正则表达式的nginx实例。
技术背景:map是nginx中非常常用的变量映射指令,允许根据一个变量的值来设置另一个变量。当map的匹配规则中使用正则表达式(通常以~开头)时,nginx需要对正则捕获的结果进行处理与存储。本次修复前,相关代码在处理正则捕获结果时缺少足够的边界保护,在特定构造的输入下可能发生缓冲区溢出,潜在导致拒绝服务甚至远程代码执行。
修复对应提交:
修复意义:缓冲区溢出是历史悠久但危害巨大的漏洞类型。本次修复在脚本引擎、访问日志等多个路径上统一增加了缓冲区越界保护,同时优化了正则捕获结果的复制逻辑,从多个层面杜绝了越界写入的可能。
漏洞描述:使用ngx_http_slice_module切片模块时,存在内存泄露漏洞。
影响范围:启用了slice指令、使用切片模块进行大文件分片传输的nginx实例。
技术背景:slice模块用于将大文件请求拆分为多个子请求分段返回,常用于视频流媒体、大文件下载等场景,能够提升大文件传输的稳定性与缓存效率。该漏洞属于内存信息泄露类型,攻击者可能通过精心构造的请求触发模块处理逻辑中的边界问题,导致本不应返回的内存数据被泄露到响应中,进而获取敏感信息。
修复对应提交:
修复意义:内存泄露漏洞虽然通常不直接导致代码执行,但可能泄露服务器内存中的密钥、会话数据、用户请求信息等敏感内容,在安全评估中同样属于高危范畴。边界检查的补充从源头阻断了越界读取的可能性。
漏洞描述:使用ngx_http_ssi_module服务器端包含模块时,存在释放后使用(Use-After-Free)漏洞。
影响范围:启用了SSI(Server Side Includes)功能的nginx实例。
技术背景:SSI模块允许在HTML页面中嵌入指令,由服务器在返回页面时动态执行并替换内容,常用于在静态页面中插入动态元素如当前时间、文件大小、CGI输出等。释放后使用是一种典型的内存安全漏洞——当一块内存被释放后,代码仍然持有指向该内存的指针并继续读写,可能导致程序崩溃、数据篡改,在特定条件下甚至可被利用实现远程代码执行。
修复对应提交:
修复意义:SSI模块涉及子请求的创建与销毁,生命周期管理复杂,容易出现内存管理问题。本次修复通过消除重复的子请求终结操作,确保内存只被释放一次,从根本上解决了UAF风险。
本次更新在构建配置中为loongarch64架构设置了专用的缓存行大小参数。龙芯架构作为国产自主指令集,近年来在服务器领域的应用逐步增长。nginx作为基础软件,针对不同CPU架构优化缓存行大小能够显著提升内存访问效率,减少伪共享带来的性能损耗。
这一变更体现了nginx社区对多元化架构生态的持续支持,也为国产硬件平台上部署nginx提供了更好的原生性能基础。
在configure脚本的crypt()功能检测中,新增了对crypt.h头文件的包含。在部分较新的编译环境中,crypt相关函数声明已从头文件中移除或需要显式包含特定头文件,这一调整确保了在不同Linux发行版与编译器版本下,configure脚本能正确检测crypt功能的可用性,避免构建失败或功能缺失。
这类构建系统的兼容性修复虽然不直接影响运行时功能,但对于维护nginx在多样化环境下的可编译性至关重要。
HTTP/2是nginx近年来持续投入优化的重点领域,本次版本中又有多项与HTTP/2相关的修复与改进合入。
关于HTTP/2 CONTINUATION帧中的重叠内存拷贝问题,本次版本经历了一次修复与一次回退的完整过程。最初的修复提交尝试解决CONTINUATION帧处理中使用memcpy进行重叠内存区域拷贝的问题——memcpy在源地址与目标地址存在重叠时行为未定义,可能导致数据损坏。
但随后该修复被回退。这通常意味着修复方案引入了新的兼容性问题或性能回退,需要进一步评估与重新设计。运维人员需要注意,该问题的最终修复可能会在后续版本中以更完善的方案重新提交。
修复了HTTP/2初始窗口大小在状态保存与恢复场景下的问题。HTTP/2采用流量窗口机制控制数据流传输速率,初始窗口大小是连接建立时的重要参数。当连接存在状态保存与复用场景时,初始窗口大小如果处理不当,可能导致流量控制计算错误,影响传输效率甚至引发协议异常。
为HTTP/2上游与gRPC上游增加了响应头字段大小限制。gRPC底层基于HTTP/2,响应头中可能携带大量元数据。增加大小限制能够防止异常上游返回超大响应头导致的内存消耗问题,提升代理层的健壮性。这是典型的纵深防御思路——即使上游服务出现异常,代理层也有兜底保护。
修复了使用HTTP/2上游且缓存重新验证时的发送逻辑问题。当nginx作为反向代理使用缓存,且缓存过期需要向上游重新验证时,如果上游连接是HTTP/2协议,特定条件下可能出现发送逻辑错误。该修复确保了缓存+HTTP/2上游这一组合场景下的稳定运行。
新增了对HTTP/2伪头顺序的严格校验,拒绝乱序出现的伪头请求。根据HTTP/2协议规范,以冒号开头的伪头(如:method、:path、:scheme、:status)必须出现在所有普通请求头之前。部分不规范的客户端可能违反这一约定发送请求,此前nginx可能容忍此类请求。
新增严格校验后,不符合协议规范的请求将被直接拒绝。这一方面提升了协议合规性,另一方面也能阻断某些利用协议解析差异进行的攻击(如请求走私)。
与上一条类似,该项修复专门拒绝在普通请求头之后再次出现伪头的HTTP/2请求。正常情况下伪头只应在请求头块的最开始出现一次,如果在普通头之后又出现伪头,属于严重的协议违规。增加这一校验进一步收紧了HTTP/2协议解析的严格程度,提升了安全性。
除了三个正式CVE对应的修复外,本次版本还有多处安全加固性质的改进,属于主动防御范畴。
XSLT模块默认禁用外部实体加载,同时新增了xml_external_entities配置指令用于显式控制该行为。
XML外部实体注入(XXE)是一类经典的Web安全漏洞。当应用程序解析包含外部实体引用的XML时,如果未禁用外部实体,攻击者可构造恶意XML读取本地文件、发起内网请求、导致拒绝服务等。nginx的xslt模块用于对XML响应进行XSLT转换渲染,如果允许加载外部实体,就可能成为XXE攻击的入口。
本次更新将默认行为调整为禁用外部实体,大幅降低了默认配置下的安全风险;同时提供配置指令供有真实业务需求的用户显式开启,兼顾安全与灵活性。这是一次非常典型的"安全默认"改进——将更安全的选项设为默认值,让大多数用户无需额外配置即可获得更好的保护。
在GitHub Actions工作流配置中显式声明了所需权限。GitHub近年来持续收紧工作流的默认令牌权限,显式声明权限一方面符合最佳实践,遵循最小权限原则;另一方面也避免因平台默认策略变更导致工作流异常失败。这属于项目工程安全范畴的改进,虽然不直接影响nginx运行时,但对项目供应链安全有积极意义。
字符集模块中,禁用了首列为utf-8的charset_map配置。当charset_map的第一列(源编码)为utf-8时,该映射表实际上没有存在的必要且可能引发处理逻辑异常。此项调整从配置层面消除了一类误用场景,提升了模块的健壮性。
上游代理是nginx作为反向代理最核心的功能之一,本次版本在这一领域有多项功能新增与修复。
改进了上游模块对Upgrade请求头的处理逻辑。Upgrade头用于HTTP协议升级,最常见的场景是WebSocket连接——客户端通过Upgrade: websocket头请求将HTTP连接升级为WebSocket协议。
此前nginx在代理包含Upgrade头的请求时,存在特定场景下的处理问题。本次优化确保Upgrade头能够被正确识别并传递给上游,提升了WebSocket代理等场景的兼容性与稳定性。
新增了针对上游连接套接字的发送缓冲区与接收缓冲区配置指令,覆盖HTTP代理与Stream代理两大模块:
HTTP模块新增指令:
Stream模块新增指令:
技术意义:套接字缓冲区大小直接影响网络传输性能。发送缓冲区(SO_SNDBUF)决定了内核中为该套接字排队待发送的数据量上限,接收缓冲区(SO_RCVBUF)决定了可缓存的已接收数据量上限。在高带宽、高延迟的网络环境中(如跨地域数据中心通信),适当增大缓冲区能够显著提升吞吐量。
此前nginx只能通过操作系统全局参数调整所有套接字的缓冲区大小,粒度较粗。新增的指令允许针对不同的上游server或location分别配置,提供了更精细的性能调优手段。对于大文件传输、流媒体代理、跨地域反向代理等场景,这一功能具有很高的实用价值。
在事件模块层面,为出站对等连接增加了SO_SNDBUF套接字选项的支持。这是上述缓冲区配置指令能够生效的底层基础——只有事件层支持设置该选项,上层模块的配置才能真正应用到套接字上。该项变更属于底层基础设施铺垫,为更多场景下的缓冲区调优打下了基础。
HTTP CONNECT隧道是nginx的另一重要应用场景,常用于正向代理中建立端到端的TCP隧道。本次版本对隧道相关逻辑进行了多项改进。
新增逻辑:处理HTTP CONNECT请求时忽略请求体。根据HTTP协议规范,CONNECT方法用于建立隧道,请求本身不应携带请求体。但部分不规范的客户端可能在CONNECT请求中附带body,此前的处理逻辑可能因此出现异常。
忽略请求体的处理方式确保了即使客户端附带了多余数据,nginx也能正确建立隧道连接,提升了兼容性。
与上一项配合,新增了对携带请求体的CONNECT请求的拒绝逻辑。对于明显违反协议规范、携带请求体的CONNECT请求,nginx将直接拒绝而非尝试忽略处理。这是更严格的协议合规处理,有助于防止利用CONNECT请求体进行的各类攻击尝试。
对HTTP CONNECT请求禁用HTTP keepalive长连接机制。CONNECT请求建立隧道后,连接进入透明转发模式,不再遵循HTTP协议的请求-响应模式,此时HTTP层面的keepalive机制已无意义且可能引入状态混乱。禁用长连接确保了CONNECT隧道的连接状态管理更加清晰可靠。
Perl模块允许在nginx配置中嵌入Perl脚本实现复杂逻辑,是扩展nginx能力的重要途径。本次版本对Perl模块进行了一系列底层重构与稳定性修复。
为Perl处理器增加了类型校验。不同类型的Perl处理器(如内容处理器、访问控制处理器、日志处理器等)有不同的调用约定与返回值要求,缺少类型检查时错误配置的处理器可能导致运行时异常甚至崩溃。新增类型检查能够在配置加载阶段就发现问题,提前报错,提升了配置安全性。
引入了Perl标量(scalar)的引用计数管理。Perl本身基于引用计数进行内存管理,但在nginx与Perl交互的边界上,对象生命周期容易出现管理混乱。引入显式的引用计数机制,确保nginx侧持有Perl对象时对象不会被意外回收,释放时能正确递减计数,从根本上减少了内存泄漏与悬垂指针问题。
增加了Perl请求对象的有效性校验。在Perl脚本执行过程中,对应的nginx请求对象可能因各种原因(如连接断开、子请求结束等)已被销毁,此时如果Perl代码继续访问该对象,将触发未定义行为。新增的有效性校验在每次访问前检查请求对象是否仍然有效,避免访问已销毁对象导致的崩溃。
修复了ngx_ssl_get_ech_outer_server_name()函数中的内存泄漏问题。
ECH(Encrypted Client Hello)是TLS 1.3的重要扩展,用于加密TLS握手过程中的Server Name Indication(SNI)信息,进一步提升隐私保护。ngx_ssl_get_ech_outer_server_name函数负责获取ECH外层加密的服务器名称。该函数在特定执行路径下存在内存分配后未正确释放的问题,长期运行可能导致内存占用持续增长。
本次修复堵住了这一内存泄漏点,对于启用了ECH功能的站点,升级后内存使用将更加稳定。
修复了IPV6_DONTFRAG套接字选项的设置问题。
IPV6_DONTFRAG选项用于控制IPv6数据包是否允许在传输路径上被分片。设置该选项后,超过路径MTU的数据包将被丢弃并返回ICMPv6数据包过大错误,而不是被中间路由器分片。这对于某些对延迟敏感或依赖PMTU发现的应用场景很重要。
修复前该选项可能未被正确应用到套接字上,导致配置不生效。修复后相关指令能够正确控制IPv6分片行为。
为方便读者快速查阅,以下按模块分类整理本次版本的全部变更项:
基于本次版本的变更内容,给出以下分级升级建议:
紧急升级(建议72小时内完成):
以上场景直接对应本次修复的安全漏洞,存在被远程利用的风险,建议优先升级。
计划内升级(建议下个维护窗口完成):
这些场景对应的修复与新功能能够提升稳定性或提供新的调优手段,属于收益明确的常规升级。
可观察暂缓:
这类场景可以等待社区反馈或下一个稳定版本再行升级。
代码地址:github.com/nginx/nginx
nginx 1.31.3是一次以安全加固为核心、同时伴随多项功能增强的重要更新。三项CVE漏洞的集中修复提醒我们,即使是久经考验的基础软件,在模块组合与边界场景下仍可能出现安全问题,及时跟进补丁是运维工作的必修课。
功能层面,上游套接字缓冲区配置的新增为性能调优提供了更精细的工具;HTTP/2协议栈的持续修复与加固体现了nginx对新一代HTTP协议的重视;XSLT默认禁用外部实体、严格校验HTTP/2伪头等改进则贯彻了"安全默认"的设计理念,让普通用户无需深入配置也能获得更安全的默认体验。
·