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信息。

image.png

三、漏洞细节

首先从patch定位问题,src/http/modules/ngx_http_range_filter_module.c(range过滤模块)

CVE-2017-7529_1.png

CVE-2017-7529_2.png

官方patch了两个地方,一个避免range start 为负值,一个保护整形size不被溢出。

CVE-2017-7529_3.png

CVE-2017-7529_4.png

通过patch的文档意见函数逻辑可以看出,如果使用 bytes=-100进入if(suffix),end设置一个大于缓存文件大小的值,会导致start 为负值。

CVE-2017-7529_5.png

size 一直累加,最后size 有个判断, size 需要一个特别大的值构成size 累加为负值。

CVE-2017-7529_6.png

因此,我们可以构造 range:bytes=-xx,-xx,-xx,-xx构造成size有符号整形溢出为负值。

在GDB里构造请求调试进行验证:

CVE-2017-7529_7.png

CVE-2017-7529_8.png

size 累加成一个负值。

CVE-2017-7529_9.png可以获取缓存文件的key。

这里启用了以下配置,因此获取不到真实的IP地址。

CVE-2017-7529_10.png

四、修复

1、升级Nginx到最新无漏洞版本,当前1.13.3,1.12.1版本中已修复了这个问题。
2、临时方案:配置 max_ranges 1;

相关新闻