一、背景

2017年7月11日,为了修复整数溢出漏洞(CVE-2017-7529), Nginx官方发布了nginx-1.12.1 stable和nginx-1.13.3 mainline版本,并且提供了官方patch。

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全 Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

二、漏洞描述&影响

Integer overflow in the range filter

Severity: medium

当使用Nginx并且开启缓存功能时,攻击者可以构造特定header头字段,能越界读取到缓存文件的文件头信息。文件头信息中可能会包含Nginx代理站点的真实IP,造成敏感信息泄露。

另外,一些第三方模块可能会因此导致拒绝服务或者当前进程的内存泄漏,但Nginx官方暂未发现这样的第三方模块。

此漏洞涉及了nginx 0.5.6 – 1.13.2全版本。

此漏洞需要在Nginx用作代理缓存的情况下才能触发,如基于Nginx的CDN服务等。

当缓存的设置如下时,也不会泄露后台的IP信息。

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

三、漏洞细节

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

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

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

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

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

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

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

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

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

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

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

size 累加成一个负值。

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全可以获取缓存文件的key。

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

Nginx敏感信息泄露漏洞(CVE-2017-7529)-唯嘉利亚云安全

四、修复

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