• 我的位置:
  • 首頁
  • -
  • 漏洞預警
  • -
  • 其他
  • -
  • Nginx DNS Resolver Off-by-One 堆寫入漏洞
    • CNNVD編號:未知
    • 危害等級: 高危 
    • CVE編號:CVE-2021-23017
    • 漏洞類型: 遠程代碼執(zhí)行
    • 威脅類型:遠程
    • 廠       商:未知
    • 漏洞來源:深信服
    • 發(fā)布時間:2021-05-31
    • 更新時間:2021-05-31

    漏洞簡介

    1、組件介紹

    Nginx (engine x) 是款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協(xié)議下發(fā)行。其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力在同類型的網(wǎng)頁服務器中表現(xiàn)較好一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。

    2、漏洞描述

    2021年5月28號,深信服安全團隊監(jiān)測到一則Nginx組件存在Off-by-One 堆寫入漏洞的信息,漏洞編號:CVE-2021-23017,漏洞威脅等級:高危。

    該漏洞是由于Nginx在將未壓縮的域名放入緩沖區(qū)時,并沒有將到前面計算出的未壓縮的DNS域名大小作為參數(shù),攻擊者可利用該漏洞在未授權(quán)的情況下,構(gòu)造惡意數(shù)據(jù)執(zhí)行如遠程代碼執(zhí)行攻擊,最終獲取服務器最高權(quán)限。

    3、漏洞分析

    Nginx中通過ngx_resolver_copy()函數(shù)來驗證和解壓縮DNS響應中包含的每個DNS域名,接收網(wǎng)絡數(shù)據(jù)包和一個指向被處理的域名指針,并在成功后返回指向新分配緩沖區(qū)的指針,該緩沖區(qū)包含未壓縮的DNS名稱。該函數(shù)大致可分為兩步完成:


    1.計算未壓縮的域名大小的長度并驗證輸入包的合法性,丟棄包含大于128個指針或包含超出輸入緩沖區(qū)邊界的域名。

    2.分配輸出緩沖區(qū),并將未壓縮的域名復制到其中。

    查看nginx/1.18.0源碼,可以發(fā)現(xiàn)每次處理URL的標簽部分非0時,都會在這個標簽后面添加一個.字符,而在最后的標簽后面時不需要加.字符的,而該程序中加入了.字符,導致off-by-one漏洞,如果計算的大小恰好與堆塊大小對齊,則超出范圍的點字符將覆蓋下一個堆塊長度的元數(shù)據(jù)中的最低有效字節(jié)。這可能會直接導致下一個堆塊的大小寫入,但還會覆蓋3個標志,從而導致 PREV_INUSE被清除并 IS_MMAPPED被設置。


    攻擊向量分析:

    DNS響應可以通過多種方式觸發(fā)漏洞。

    首先,Nginx必須發(fā)送了DNS請求,并且必須等待響應。然后,可以在DNS響應的多個部分放入payload:

    DNS Questions QNAME,DNS Answers NAME,DNS Answers RDATA for CNAME and SRV responses,

    通過在多處位置控制輸入(QNAME,NAME,RDATA),可以在處理響應時多次觸發(fā)漏洞函數(shù),從而有效地執(zhí)行多次內(nèi)存讀寫操作。


    此外,當攻擊者提供中毒的CNAME時,它將以遞歸方式解決,從而在執(zhí)行過程中觸發(fā)了額外的OOB寫操作 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”請求的DNS響應示例負載,其中包含被污染的CNAME:

    ngx_strlow源碼如下,作用是將src前面長度為n的大寫字母轉(zhuǎn)換為小寫字母并存入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)境,復現(xiàn)該漏洞,效果如下:

    參考網(wǎng)站

    暫無

    受影響實體

    Nginx 可以在大多數(shù) Unix、Linux 系統(tǒng)上編譯運行,并有 Windows 移植版。Nginx主要在美國和中國使用量最高,在全球約有1億以上的服務器。Nginx 在中國境內(nèi)主要分布在中國臺灣、中國香港。


    目前受影響的Nginx版本:0.6.18-1.20.0

    補丁

    1、如何檢測組件系統(tǒng)版本

    Nginx 目錄下輸入:nginx -v 即可查看版本號。


    2、官方修復建議

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

    https://nginx.org/

    升級方法:

    在官網(wǎng)找到最新的版本進行下載并按照步驟安裝即可。

    3、深信服解決方案

    深信服安全云眼】在漏洞爆發(fā)之初,已完成檢測更新,對所有用戶網(wǎng)站探測,保障用戶安全。不清楚自身業(yè)務是否存在漏洞的用戶,可注冊信服云眼賬號,獲取30天免費安全體驗。

    注冊地址:http://saas.sangfor.com.cn

    深信服云鏡】在漏洞爆發(fā)第一時間即完成檢測能力的發(fā)布,部署了云鏡的用戶可以通過升級來快速檢測網(wǎng)絡中是否受該高危風險影響,避免被攻擊者利用。離線使用云鏡的用戶需要下載離線更新包來獲得漏洞檢測能力,可以連接云端升級的用戶可自動獲得漏洞檢測能力。