Nginx敏感信息泄露漏洞(CVE-2017-7529)分析
一、背景
2017年7月11日,为了修复整数溢出漏洞(CVE-2017-7529), Nginx官方发布了nginx-1.12.1 stable和nginx-1.13.3 mainline版本,并且提供了官方patch。
二、漏洞描述&影响
Integer overflow in the range filter
Severity: medium
当使用Nginx并且开启缓存功能时,攻击者可以构造特定header头字段,能越界读取到缓存文件的文件头信息。文件头信息中可能会包含Nginx代理站点的真实IP,造成敏感信息泄露。
另外,一些第三方模块可能会因此导致拒绝服务或者当前进程的内存泄漏,但Nginx官方暂未发现这样的第三方模块。
此漏洞涉及了nginx 0.5.6 – 1.13.2全版本。
此漏洞需要在Nginx用作代理缓存的情况下才能触发,如基于Nginx的CDN服务等。
当缓存的设置如下时,也不会泄露后台的IP信息。
三、漏洞细节
首先从patch定位问题,src/http/modules/ngx_http_range_filter_module.c(range过滤模块)
官方patch了两个地方,一个避免range start 为负值,一个保护整形size不被溢出。
通过patch的文档意见函数逻辑可以看出,如果使用 bytes=-100进入if(suffix),end设置一个大于缓存文件大小的值,会导致start 为负值。
size 一直累加,最后size 有个判断, size 需要一个特别大的值构成size 累加为负值。
因此,我们可以构造 range:bytes=-xx,-xx,-xx,-xx构造成size有符号整形溢出为负值。
在GDB里构造请求调试进行验证:
size 累加成一个负值。
可以获取缓存文件的key。
这里启用了以下配置,因此获取不到真实的IP地址。
四、修复
1、升级Nginx到最新无漏洞版本,当前1.13.3,1.12.1版本中已修复了这个问题。
2、临时方案:配置 max_ranges 1;