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

image.png

三、漏洞細節

首先從patch定位問題,src/http/modules/ngx_http_range_filter_module.c(range過(guò)濾模塊)

CVE-2017-7529_1.png

CVE-2017-7529_2.png

官方patch了兩(liǎng)個地方,一個避免range start 爲負值,一個保護整形size不被(bèi)溢出。

CVE-2017-7529_3.png

CVE-2017-7529_4.png

通過(guò)patch的文檔意見函數邏輯可以看出,如果使用 bytes=-100進(jìn)入if(suffix),end設置一個大于緩存文件大小的值,會導緻start 爲負值。

CVE-2017-7529_5.png

size 一直累加,最後(hòu)size 有個判斷, size 需要一個特别大的值構成(chéng)size 累加爲負值。

CVE-2017-7529_6.png

因此,我們可以構造 range:bytes=-xx,-xx,-xx,-xx構造成(chéng)size有符号整形溢出爲負值。

在GDB裡(lǐ)構造請求調試進(jìn)行驗證:

CVE-2017-7529_7.png

CVE-2017-7529_8.png

size 累加成(chéng)一個負值。

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

這(zhè)裡(lǐ)啓用了以下配置,因此獲取不到真實的IP地址。

CVE-2017-7529_10.png

四、修複

1、升級Nginx到最新無漏洞版本,當前1.13.3,1.12.1版本中已修複了這(zhè)個問題。
2、臨時方案:配置 max_ranges 1;

相關新聞