
使用depthfirst的内部系统分析NGINX源代码后,自主发现了4个远程内存损坏问题,其中包含2008年引入的关键堆缓冲区溢出漏洞,该漏洞影响NGINX 0.6.27到1.30.0版本,使用rewrite和set指令的NGINX配置存在风险,已开发关闭ASLR下的RCE概念验证,相关漏洞已通报NGINX并获确认,博客于2026年5月13日发布。
漏洞发现背景与过程
讨论基础设施最脆弱点时,关注到作为应用平台唯一暴露面的Web服务,进而将分析目标转向全球近三分之一网站使用的NGINX,其作为核心基础设施单漏洞可暴露大量后端系统。
使用depthfirst内部专用于分析底层软件的系统分析NGINX,仅需一键接入仓库触发分析,6小时扫描后识别出5个安全问题,其中包含处理NGINX rewrite指令时的高严重性堆溢出问题。
2026年4月18日系统报告5个内存损坏问题,4月21日通过GitHub安全通告向NGINX上报所有问题,每个问题均提供详细漏洞描述、根本原因分析和系统直接生成的证明概念。
2026年4月24日NGINX确认4个问题,4月28日告知NGINX已开发出可演示RCE的有效PoC,5月5日向NGINX分享RCE PoC并附演示视频,5月13日发布相关博客。
确认的4个NGINX安全漏洞详情
CVE-2026-42945(严重,CVSS 9.2):ngx_http_rewrite_module中的堆缓冲区溢出问题,rewrite和set序列期间未传播的is_args标志导致缓冲区分配过小,复制阶段将攻击者控制的转义URI数据写入堆边界之外,导致RCE,2008年引入,影响NGINX 0.6.27到1.30.0版本,触发需使用rewrite和set指令。
CVE-2026-42946(高,CVSS 8.3):ngx_http_scgi_module和ngx_http_uwsgi_module中的过度内存分配问题,不完整上游状态行读取后的状态不匹配导致跨缓冲区指针减法,产生约1TB的密钥长度,导致工作进程崩溃。
CVE-2026-40701(中,CVSS 6.3):ngx_http_ssl_module中的释放后使用问题,若TLS连接在异步OCSP DNS解析完成前关闭,上下文池会被销毁但未取消解析器请求,DNS计时器后续会解引用已释放的指针。
CVE-2026-42934(中,CVSS 6.3):ngx_http_charset_module中的越界读取问题,处理代理缓冲区边界的不完整UTF-8序列时差一错误损坏长度状态,计算出负源偏移,读取已分配上游缓冲区前2字节。
CVE-2026-42945根本原因分析
NGINX脚本引擎处理rewrite和set指令采用两阶段流程:第一阶段计算最终字符串总长度,从内存池分配精确所需内存;第二阶段执行复制操作将实际数据写入新分配的缓冲区,要求第一阶段计算的长度与第二阶段写入的数据量完全匹配,两阶段间引擎状态变化会导致内存损坏漏洞。
漏洞位于src/http/ngx_http_script.c,触发条件为rewrite指令的替换字符串包含问号,会触发ngx_http_script_start_args_code函数永久设置e->is_args = 1标志,且该标志在脚本代码评估间不会重置。
后续set指令引用正则捕获组时触发ngx_http_script_complex_value_code函数,长度计算阶段使用完全置零的子引擎le,le.is_args为0,ngx_http_script_copy_capture_len_code函数判断条件不成立,仅返回原始未转义的捕获长度,分配对应大小的缓冲区。
复制阶段使用主引擎e,e->is_args仍为1,ngx_http_script_copy_capture_code函数相同条件判断成立,调用带NGX_ESCAPE_ARGS标志的ngx_escape_uri函数,将每个可转义字符(如加号、&符号)从1字节扩展为3字节,导致写入的数据量远超缓冲区分配大小,造成堆缓冲区溢出。
触发配置示例:location ~ ^/api/(.*) /internal?migrated=true; set 1; },填充URI的加号可控制溢出大小,但写入字节受限于URI安全字符,无法注入任意字节。
CVE-2026-42945利用方式
NGINX多进程架构下工作进程从主进程fork,内存空间完全复制,堆布局在不同工作进程中完全确定,利用失败崩溃工作进程后主进程会生成相同内存布局的新进程,可多次尝试,假设已绕过ASLR。
利用目标为ngx_pool_t结构的cleanup指针(偏移64),该指针指向ngx_pool_cleanup_t结构链表,池销毁时会执行链表中的handler函数,但需先覆盖d、max、current、chain、large等前置字段,直接覆盖会破坏池分配器状态导致进程崩溃。
采用跨请求堆风水技术控制时序:打开初始连接发送部分头,NGINX为其分配请求池;打开第二个受害者连接,在第一个池旁分配受害者池;完成初始头触发rewrite溢出,从第一个池溢出到相邻受害者池头;立即关闭受害者连接触发ngx_destroy_pool销毁受害者池,此时仅迭代cleanup链表不触碰损坏的池结构字段,避免崩溃,获得任意解引用ngx_pool_cleanup_s的能力。
因只能写入URI安全字符,通过POST请求体喷射任意二进制payload(POST体为原始数据流可包含null字节),构造包含指向libc system函数的伪造cleanup结构和用户提供的命令字符串的喷射payload,利用可预测的堆布局,爆破伪造结构落点地址,筛选全URI安全字节的地址,覆盖cleanup指针低地址指向伪造结构,关闭受害者套接字触发池销毁,执行注入的命令,实现未授权RCE,相关PoC源码已在GitHub仓库公开。
受影响版本范围
NGINX Open Source 0.6.27 through 1.30.0
NGINX Plus R32 through R36
NGINX Instance Manager 2.16.0 through 2.21.1
F5 WAF for NGINX 5.9.0 through 5.12.1
NGINX App Protect WAF 4.9.0 through 4.16.0 and 5.1.0 through 5.8.0
F5 DoS for NGINX 4.8.0
NGINX App Protect DoS 4.3.0 through 4.7.0
NGINX Gateway Fabric 1.3.0 through 1.6.2 and 2.0.0 through 2.5.1
NGINX Ingress Controller 3.5.0 through 3.7.2, 4.0.0 through 4.0.1, and 5.0.0 through 5.4.1
附:Nginx 高危漏洞 CVE-2026-42945 深度解析与宝塔面板修复指南(完整版)
标签: 潜伏18年 NGINX 高危漏洞 CVE-2026-42945 深度解析 安全修复指南


