Nginx敏感信息泄露漏洞(CVE-2017-7529)分析
一、背景
2017年7月11日,為了修復(fù)整數(shù)溢出漏洞(CVE-2017-7529), Nginx官方發(fā)布了nginx-1.12.1 stable和nginx-1.13.3 mainline版本,并且提供了官方patch。
二、漏洞描述&影響
Integer overflow in the range filter
Severity: medium
當(dāng)使用Nginx并且開(kāi)啟緩存功能時(shí),攻擊者可以構(gòu)造特定header頭字段,能越界讀取到緩存文件的文件頭信息。文件頭信息中可能會(huì)包含Nginx代理站點(diǎn)的真實(shí)IP,造成敏感信息泄露。
另外,一些第三方模塊可能會(huì)因此導(dǎo)致拒絕服務(wù)或者當(dāng)前進(jìn)程的內(nèi)存泄漏,但Nginx官方暫未發(fā)現(xiàn)這樣的第三方模塊。
此漏洞涉及了nginx 0.5.6 – 1.13.2全版本。
此漏洞需要在Nginx用作代理緩存的情況下才能觸發(fā),如基于Nginx的CDN服務(wù)等。
當(dāng)緩存的設(shè)置如下時(shí),也不會(huì)泄露后臺(tái)的IP信息。
三、漏洞細(xì)節(jié)
首先從patch定位問(wèn)題,src/http/modules/ngx_http_range_filter_module.c(range過(guò)濾模塊)
官方patch了兩個(gè)地方,一個(gè)避免range start 為負(fù)值,一個(gè)保護(hù)整形size不被溢出。
通過(guò)patch的文檔意見(jiàn)函數(shù)邏輯可以看出,如果使用 bytes=-100進(jìn)入if(suffix),end設(shè)置一個(gè)大于緩存文件大小的值,會(huì)導(dǎo)致start 為負(fù)值。
size 一直累加,最后size 有個(gè)判斷, size 需要一個(gè)特別大的值構(gòu)成size 累加為負(fù)值。
因此,我們可以構(gòu)造 range:bytes=-xx,-xx,-xx,-xx構(gòu)造成size有符號(hào)整形溢出為負(fù)值。
在GDB里構(gòu)造請(qǐng)求調(diào)試進(jìn)行驗(yàn)證:
size 累加成一個(gè)負(fù)值。
可以獲取緩存文件的key。
這里啟用了以下配置,因此獲取不到真實(shí)的IP地址。
四、修復(fù)
1、升級(jí)Nginx到最新無(wú)漏洞版本,當(dāng)前1.13.3,1.12.1版本中已修復(fù)了這個(gè)問(wèn)題。
2、臨時(shí)方案:配置 max_ranges 1;