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