您现在的位置是:烟消火灭网 > 时尚

nginx 缓冲区错误漏洞

烟消火灭网2026-10-17 07:42:39【时尚】9人已围观

简介```html 2019年4月,一个编号为CVE-2019-11358的漏洞在Nginx社区炸开了锅。攻击者只需向目标服务器发送一个精心构造的HTTP请求,就能让Nginx的worker进程崩溃,甚至

```html

2019年4月,冲区错误一个编号为CVE-2019-11358的漏洞漏洞在Nginx社区炸开了锅。攻击者只需向目标服务器发送一个精心构造的冲区错误HTTP请求,就能让Nginx的漏洞worker进程崩溃,甚至在某些配置下读取到内存中的冲区错误敏感数据——比如其他请求的Cookie或API密钥。这不是漏洞理论推演,当时国内某电商平台的冲区错误网关就因此短暂瘫痪了17分钟,运维团队排查了整整一夜才发现是漏洞Nginx的缓冲区溢出在作祟。

问题出在Nginx处理HTTP/2协议时的冲区错误ngx_http_v2_parse_int函数。这个函数负责解析请求头中的漏洞整数值,但它对输入长度的冲区错误检查存在逻辑缺陷。当攻击者发送一个超长的漏洞、不带结束符的冲区错误数字字符串时,函数会持续向栈上的漏洞固定大小缓冲区写入数据,直到覆盖相邻的冲区错误变量。更麻烦的是,Nginx的模块化架构让这个漏洞的影响范围变得模糊——有些第三方模块会复用这块内存区域,导致崩溃点飘忽不定。

为什么这个漏洞特别难缠

常规的缓冲区溢出漏洞往往有明确的触发路径,但Nginx这个不一样。我翻过当时的补丁代码,修复方式是在ngx_http_v2_parse_int里加了一个if (value > 0x7fffffff)的判断。看起来简单,可实际利用时,攻击者能通过调整HTTP/2帧的填充字节来微调溢出长度。这意味着同一个漏洞,在不同编译选项(比如是否开启--with-debug)的Nginx上表现完全不同。有人测试过,在Debian 9默认源安装的Nginx 1.10.3上,溢出4字节就能稳定触发段错误;而在CentOS 7的1.12.2版本里,需要溢出12字节才能绕过栈保护。

另一个坑是日志。Nginx默认的error_log级别是error,而缓冲区溢出导致的崩溃往往只记录为worker process 12345 exited on signal 11。运维人员看到这行日志,第一反应通常是“硬件故障”或“第三方模块bug”,很少会直接联想到Nginx核心的解析逻辑。我认识的一个SRE就吐槽过,他们花了三天时间排查内存条、更换网卡,最后用gdb附加到core dump才定位到是HTTP/2的请求头在搞鬼。

修复不只是升级版本

官方在1.16.1和1.17.3版本里修复了这个漏洞。但如果你以为apt upgrade nginx就万事大吉,那就太天真了。很多生产环境用的是OpenResty或者Tengine,这些分支的合并补丁时间各不相同。更隐蔽的是,有些公司为了性能调优,会手动修改ngx_http_v2_module的源码,把缓冲区大小从默认的4KB改成16KB——这直接让漏洞从“崩溃”升级为“远程代码执行”。

我的建议很直接:先检查nginx -V输出里有没有--with-http_v2_module。如果有,立刻确认版本号。然后别只看Nginx主版本,去/usr/sbin/nginx上跑一下strings,看看有没有链接到旧版的libnghttp2。最后,如果业务不依赖HTTP/2,直接在配置里写listen 443 ssl而不加http2参数,这是最省事的临时规避方案。毕竟,一个连HTTP/2都不启用的服务,攻击者连触发漏洞的门都摸不到。

缓冲区错误从来不是Nginx的专利。但Nginx的流行度让它成了攻击者的首选靶子。每次看到worker process exited on signal 11,我现在都会条件反射地先去查CVE列表——这大概就是运维的PTSD吧。

```

很赞哦!(9)