- CNNVD編號(hào):未知
- 危害等級(jí): 高危
- CVE編號(hào):CVE-2021-23017
- 漏洞類(lèi)型: 遠(yuǎn)程代碼執(zhí)行
- 威脅類(lèi)型:遠(yuǎn)程
- 廠 商:未知
- 漏洞來(lái)源:深信服
- 發(fā)布時(shí)間:2021-05-31
- 更新時(shí)間:2021-05-31
漏洞簡(jiǎn)介
1、組件介紹
Nginx (engine x) 是款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。
2、漏洞描述
2021年5月28號(hào),深信服安全團(tuán)隊(duì)監(jiān)測(cè)到一則Nginx組件存在Off-by-One 堆寫(xiě)入漏洞的信息,漏洞編號(hào):CVE-2021-23017,漏洞威脅等級(jí):高危。
該漏洞是由于Nginx在將未壓縮的域名放入緩沖區(qū)時(shí),并沒(méi)有將到前面計(jì)算出的未壓縮的DNS域名大小作為參數(shù),攻擊者可利用該漏洞在未授權(quán)的情況下,構(gòu)造惡意數(shù)據(jù)執(zhí)行如遠(yuǎn)程代碼執(zhí)行攻擊,最終獲取服務(wù)器最高權(quán)限。
3、漏洞分析
Nginx中通過(guò)ngx_resolver_copy()函數(shù)來(lái)驗(yàn)證和解壓縮DNS響應(yīng)中包含的每個(gè)DNS域名,接收網(wǎng)絡(luò)數(shù)據(jù)包和一個(gè)指向被處理的域名指針,并在成功后返回指向新分配緩沖區(qū)的指針,該緩沖區(qū)包含未壓縮的DNS名稱(chēng)。該函數(shù)大致可分為兩步完成:
1.計(jì)算未壓縮的域名大小的長(zhǎng)度并驗(yàn)證輸入包的合法性,丟棄包含大于128個(gè)指針或包含超出輸入緩沖區(qū)邊界的域名。
2.分配輸出緩沖區(qū),并將未壓縮的域名復(fù)制到其中。
查看nginx/1.18.0源碼,可以發(fā)現(xiàn)每次處理URL的標(biāo)簽部分非0時(shí),都會(huì)在這個(gè)標(biāo)簽后面添加一個(gè).字符,而在最后的標(biāo)簽后面時(shí)不需要加.字符的,而該程序中加入了.字符,導(dǎo)致off-by-one漏洞,如果計(jì)算的大小恰好與堆塊大小對(duì)齊,則超出范圍的點(diǎn)字符將覆蓋下一個(gè)堆塊長(zhǎng)度的元數(shù)據(jù)中的最低有效字節(jié)。這可能會(huì)直接導(dǎo)致下一個(gè)堆塊的大小寫(xiě)入,但還會(huì)覆蓋3個(gè)標(biāo)志,從而導(dǎo)致 PREV_INUSE被清除并 IS_MMAPPED被設(shè)置。
攻擊向量分析:
DNS響應(yīng)可以通過(guò)多種方式觸發(fā)漏洞。
首先,Nginx必須發(fā)送了DNS請(qǐng)求,并且必須等待響應(yīng)。然后,可以在DNS響應(yīng)的多個(gè)部分放入payload:
DNS Questions QNAME,
DNS Answers NAME,
DNS Answers RDATA for CNAME and SRV responses,
通過(guò)在多處位置控制輸入(QNAME,NAME,RDATA),可以在處理響應(yīng)時(shí)多次觸發(fā)漏洞函數(shù),從而有效地執(zhí)行多次內(nèi)存讀寫(xiě)操作。
此外,當(dāng)攻擊者提供中毒的CNAME時(shí),它將以遞歸方式解決,從而在執(zhí)行過(guò)程中觸發(fā)了額外的OOB寫(xiě)操作 ngx_resolve_name_locked() 調(diào)用ngx_strlow()(ngx_resolver.c:594)和其他OOB讀取期間 ngx_resolver_dup()(ngx_resolver.c:790)和 ngx_crc32_short()(ngx_resolver.c:596)。
用于“example.net”請(qǐng)求的DNS響應(yīng)示例負(fù)載,其中包含被污染的CNAME:
ngx_strlow源碼如下,作用是將src前面長(zhǎng)度為n的大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母并存入dst中
void ngx_strlow(u_char *dst, u_char *src, size_t n);
void
ngx_strlow(u_char *dst, u_char *src, size_t n)
{
while (n) {
*dst = ngx_tolower(*src);
dst++;
src++;
n--;
}
漏洞公示
搭建nginx組件nginx/1.18.0版本環(huán)境,復(fù)現(xiàn)該漏洞,效果如下:
參考網(wǎng)站
受影響實(shí)體
Nginx 可以在大多數(shù) Unix、Linux 系統(tǒng)上編譯運(yùn)行,并有 Windows 移植版。Nginx主要在美國(guó)和中國(guó)使用量最高,在全球約有1億以上的服務(wù)器。Nginx 在中國(guó)境內(nèi)主要分布在中國(guó)臺(tái)灣、中國(guó)香港。
目前受影響的Nginx版本:0.6.18-1.20.0
補(bǔ)丁
1、如何檢測(cè)組件系統(tǒng)版本
Nginx 目錄下輸入:nginx -v 即可查看版本號(hào)。
當(dāng)前官方已發(fā)布最新版本,建議受影響的用戶(hù)及時(shí)更新升級(jí)到最新版本。鏈接如下:
升級(jí)方法:
在官網(wǎng)找到最新的版本進(jìn)行下載并按照步驟安裝即可。
3、深信服解決方案
【深信服安全云眼】在漏洞爆發(fā)之初,已完成檢測(cè)更新,對(duì)所有用戶(hù)網(wǎng)站探測(cè),保障用戶(hù)安全。不清楚自身業(yè)務(wù)是否存在漏洞的用戶(hù),可注冊(cè)信服云眼賬號(hào),獲取30天免費(fèi)安全體驗(yàn)。
注冊(cè)地址:http://saas.sangfor.com.cn
【深信服云鏡】在漏洞爆發(fā)第一時(shí)間即完成檢測(cè)能力的發(fā)布,部署了云鏡的用戶(hù)可以通過(guò)升級(jí)來(lái)快速檢測(cè)網(wǎng)絡(luò)中是否受該高危風(fēng)險(xiǎn)影響,避免被攻擊者利用。離線(xiàn)使用云鏡的用戶(hù)需要下載離線(xiàn)更新包來(lái)獲得漏洞檢測(cè)能力,可以連接云端升級(jí)的用戶(hù)可自動(dòng)獲得漏洞檢測(cè)能力。