• 我的位置:
  • 首頁(yè)
  • -
  • 漏洞預(yù)警
  • -
  • 其他
  • -
  • Nginx DNS Resolver Off-by-One 堆寫(xiě)入漏洞
    • 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中

    #define ngx_tolower(c)   (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)#define ngx_toupper(c)    (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)void ngx_strlow(u_char *dst, u_char *src, size_t n);voidngx_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)站

    暫無(wú)

    受影響實(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)。


    2、官方修復(fù)建議

    當(dāng)前官方已發(fā)布最新版本,建議受影響的用戶(hù)及時(shí)更新升級(jí)到最新版本。鏈接如下:

    https://nginx.org/

    升級(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è)能力。