- 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中
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)境,復現(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 即可查看版本號。
當前官方已發(fā)布最新版本,建議受影響的用戶及時更新升級到最新版本。鏈接如下:
升級方法:
在官網(wǎng)找到最新的版本進行下載并按照步驟安裝即可。
3、深信服解決方案
【深信服安全云眼】在漏洞爆發(fā)之初,已完成檢測更新,對所有用戶網(wǎng)站探測,保障用戶安全。不清楚自身業(yè)務是否存在漏洞的用戶,可注冊信服云眼賬號,獲取30天免費安全體驗。
注冊地址:http://saas.sangfor.com.cn
【深信服云鏡】在漏洞爆發(fā)第一時間即完成檢測能力的發(fā)布,部署了云鏡的用戶可以通過升級來快速檢測網(wǎng)絡中是否受該高危風險影響,避免被攻擊者利用。離線使用云鏡的用戶需要下載離線更新包來獲得漏洞檢測能力,可以連接云端升級的用戶可自動獲得漏洞檢測能力。