自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入分析在ISC BIND服務(wù)器中潛藏了15年的RCE漏洞

安全 漏洞
在本文中,我們將與讀者一道深入分析在ISC BIND服務(wù)器中潛藏了15年的一個RCE漏洞 。

2020年10月,我們收到了一份針對ISC BIND服務(wù)器的匿名安全報告。在這份報告中發(fā)現(xiàn)的安全問題,實際上基于之前曝出的漏洞CVE-2006-5989,該漏洞影響Apache模塊mod_auth_kerb,并且,它最初也是由匿名研究人員發(fā)現(xiàn)的。ISC BIND服務(wù)器SPNEGO(the Simple and Protected GSSAPI Negotiation Mechanism,SPNEGO)組件內(nèi)共享了含有該漏洞的代碼,但ISC當時并沒有合并相應(yīng)的安全補丁。15年后,ISC對BIND中的這個漏洞進行了修復(fù),并為其分配了相應(yīng)的漏洞編號,即CVE-2020-8625。

對于BIND服務(wù)器來說,從9.11到9.16的版本都受到該漏洞的影響。并且,攻擊者可以在無需身份驗證的情況下遠程觸發(fā)該漏洞,進而導(dǎo)致一個4字節(jié)的堆溢出。這份安全報告的內(nèi)容符合Targeting Incentive Program的要求,但缺乏獲得全額獎金所需的完整exploit。不過,這仍然不失為一個優(yōu)秀的安全報告,而且這個漏洞也值得我們深入進行研究。

漏洞分析

該漏洞的成因,是位于lib/dns/spnego.c中的函數(shù)der_get_oid()存在堆溢出漏洞。

  1. static int 
  2. der_get_oid(const unsigned char *p, size_t len, oid *data, size_t *size) { 
  3. // ... 
  4. data->components = malloc(len * sizeof(*data->components));   // components == NULL) { 
  5.       return (ENOMEM); 
  6.     } 
  7.     data->components[0] = (*p) / 40;    // components[1] = (*p) % 40; 
  8.     --len;               //  0U; ++n) { 
  9.         unsigned u = 0
  10.   
  11.         do { 
  12.             --len; 
  13.             uu = u * 128 + (*p++ % 128); 
  14.         } while (len > 0U && p[-1] & 0x80); 
  15.         data->components[n] = u;      // <-- (4) 
  16.     } 
  17. // ... 

這個函數(shù)在(1)處分配一個數(shù)組緩沖區(qū)。變量len用于跟蹤緩沖區(qū)中剩余的元素數(shù)量。同時,代碼在(2)處對前2個元素進行了填充處理,但是,它在(3)處只將len減去了1。因此,循環(huán)(4)可以使緩沖區(qū)溢出1個元素。data->components的類型是int,所以,這將導(dǎo)致4字節(jié)的堆溢出。

觸發(fā)機制

由于該漏洞存在于SPNEGO組件中,因此,必須在BIND中對TKEY-GSSAPI進行相應(yīng)的配置。

  1. # cat /etc/bind/named.conf.options 
  2. options { 
  3.     directory "/var/cache/bind"; 
  4.     tkey-gssapi-keytab "/etc/bind/dns.keytab"; 
  5. }; 
  6.   
  7. # cat /etc/bind/named.conf.local 
  8. zone "example.nil." IN { 
  9.     type master; 
  10.     file "/etc/bind/example.nil.db"; 
  11. }; 

其中,dns.keytab文件位于bin/tests/system/tsiggss/ns1/中,而example.nil.db文件則是由腳本bin/tests/system/tsiggss/setup.sh生成的。

現(xiàn)在,相應(yīng)的測試環(huán)境已經(jīng)準備好了。當接收到一個手工請求時,該漏洞就會被觸發(fā),并產(chǎn)生以下調(diào)用棧:

  1. #0  der_get_oid at spnego.c:841 
  2. #1  decode_oid at spnego.c:1054 
  3. #2  decode_MechType at spnego_asn1.c:213 
  4. #3  decode_MechTypeList at spnego_asn1.c:290 
  5. #4  decode_NegTokenInit at spnego_asn1.c:523 
  6. #5  gss_accept_sec_context_spnego at spnego.c:591 
  7. #6  dst_gssapi_acceptctx at gssapictx.c:729 
  8. #7  process_gsstkey at tkey.c:551 
  9. #8  dns_tkey_processquery at tkey.c:882 
  10. #9  ns_query_start at query.c:11315 
  11. #10 ns__client_request at client.c:2161 
  12. #11 processbuffer at tcpdns.c:227 
  13. #12 dnslisten_readcb at tcpdns.c:294 
  14. #13 read_cb at tcp.c:814 
  15. ... 

漏洞利用

這個漏洞的可利用性高度依賴于glibc的版本,而下面的解釋是基于Ubuntu18.04和glibc2.27的,后者支持tcache。

首先,我們要確定這個溢出漏洞所能控制的內(nèi)容:

  • 在der_get_oid()中分配的易受攻擊的緩沖區(qū)的大小和內(nèi)容是可控的。順便說一下,當當前請求完成后,該緩沖區(qū)將被釋放。
  • decode_MechTypeList()中有一個while循環(huán),用于重復(fù)執(zhí)行der_get_oid()函數(shù),并且循環(huán)次數(shù)也是可控的。

有了這兩點,我們就可以輕松地操縱堆了。為了準備堆,我們可以耗盡任意大小的tcache bins,并在請求完成后重新對其進行填充。同時,重新填充的分塊(chunk)在內(nèi)存中可以是連續(xù)的。這使得內(nèi)存布局相當有利于通過緩沖區(qū)溢出發(fā)動攻擊。

實現(xiàn)任意寫原語

在這個階段,通過濫用tcache空閑列表可輕松實現(xiàn)任意寫原語。

觸發(fā)一個4字節(jié)的溢出來擴展下一個空閑的chunk大小。

在下一個請求中,在受損的chunk中分配內(nèi)存空間。當請求結(jié)束時,它將被移動到新的tcache bin中。

用新的大小再次分配受損的chunk。這時,受損的chunk將與下一個空閑的chunk發(fā)生重疊,然后,用一個任意的值覆蓋其freelist。

從“中毒的”tcache freelist上分配內(nèi)存空間。它將返回一個任意地址。

泄漏內(nèi)存地址

默認情況下,會為BIND啟用所有Linux緩解措施。因此,我們首先要搞定ASLR,這意味著我們需要找到一種從內(nèi)存中泄漏地址的方法。一個可能實現(xiàn)內(nèi)存泄漏的機會,是利用code_NegTokenArg()函數(shù)。該函數(shù)用于將響應(yīng)消息編碼到一個緩沖區(qū)中,并將其發(fā)送給客戶端。

  1. static OM_uint32 
  2. code_NegTokenArg(OM_uint32 *minor_status, const NegTokenResp *resp, 
  3.                  unsigned char **outbuf, size_t *outbuf_size) { 
  4. // ... 
  5.     buf_size = 1024
  6.     buf = malloc(buf_size);    // <-- (5) 
  7. //... 
  8.     do { 
  9.         ret = encode_NegTokenResp(buf + buf_size - 1, buf_size, resp, 
  10.                                   &buf_len); 
  11. // ... 
  12.     } while (ret == ASN1_OVERFLOW); 
  13.   
  14.     *outbuf = malloc(buf_len);    // <-- (6) 
  15.     if (*outbuf == NULL) { 
  16.         *minor_status = ENOMEM
  17.         free(buf); 
  18.         return (GSS_S_FAILURE); 
  19.     } 
  20.     memmove(*outbuf, buf + buf_size - buf_len, buf_len); 
  21.     *outbuf_size = buf_len
  22.   
  23.     free(buf);       // <-- (7) 
  24.   
  25.     return (GSS_S_COMPLETE); 

位于(5)處的buf是一個臨時緩沖區(qū),它的初始大小是1024字節(jié),正好在tcache處理的范圍內(nèi)。而(6)處的outbuf是將被發(fā)送到客戶端的緩沖區(qū),其大小也在tcache的范圍內(nèi)。如果可以對這兩個緩沖區(qū)的大小進行tcache dup攻擊,那么,在(5)和(6)處的兩次malloc()調(diào)用將返回相同的地址。在執(zhí)行(7)處的free()函數(shù)之后,一個tcache->next指針將被更新到buf中,但是,這時它已經(jīng)和outbuf重疊在一起了。這意味著堆指針將泄露給客戶端。

理想情況下,位于(6)處的buf_len應(yīng)該選擇得足夠大,以避免干擾較小的tcache bins。不幸的是,最大值似乎只有96個字節(jié)。由于這個問題,進程根本無法存活,并在客戶端得到泄漏的堆指針后不久就會崩潰。因此,我們需要進行更深入的研究,以便來找到一種可以充分利用該漏洞的方法。

漏洞的修復(fù)

在BIND 9.16.12和BIND 9.11.28中,已經(jīng)修復(fù)了該漏洞。為了修復(fù)BIND 9.16,ISC完全放棄了SPNEGO的使用。在BIND 9.11中,他們針對原始問題應(yīng)用了補丁程序。

小結(jié)

這個安全漏洞表明,即使軟件是開源的,并且得到了廣泛使用,漏洞也會存在多年而難以被發(fā)現(xiàn)。軟件維護人員需要密切監(jiān)視他們使用的所有外部模塊,以確保應(yīng)用了最新的安全補丁。同時,該漏洞也表明這是一個非常棘手的挑戰(zhàn)。ISC BIND是Internet上最流行的DNS服務(wù)器,所以,該漏洞的影響范圍相當大,特別是該漏洞可以在遠程且無需身份驗證的情況下觸發(fā)。我們建議大家盡快更新相應(yīng)的DNS服務(wù)器。

本文翻譯自:https://www.thezdi.com/blog/2021/2/24/cve-2020-8625-a-fifteen-year-old-rce-bug-returns-in-isc-bind-server

 

 

責任編輯:趙寧寧 來源: 嘶吼網(wǎng)
相關(guān)推薦

2020-09-30 10:11:34

漏洞

2011-11-29 12:10:57

2010-05-10 14:10:34

Unix服務(wù)器

2009-12-28 15:50:23

AnyMedia接入系

2009-11-23 17:56:45

業(yè)務(wù)路由器

2010-05-06 14:22:12

流媒體服務(wù)器負載均衡

2017-09-28 10:12:51

2010-11-26 13:10:17

2021-03-18 10:56:59

SpringMVC參數(shù)解析器

2022-04-12 08:30:45

TomcatWeb 應(yīng)用Servlet

2010-09-07 14:21:22

PPPoE協(xié)議

2017-01-15 22:51:16

2011-03-23 11:01:55

LAMP 架構(gòu)

2024-11-21 14:59:47

2022-04-26 16:52:59

漏洞網(wǎng)絡(luò)攻擊者谷歌

2009-12-23 09:06:34

網(wǎng)吧路由器

2020-12-07 06:23:48

Java內(nèi)存

2014-10-30 15:08:21

快速排序編程算法

2017-02-08 08:46:39

瀏覽器服務(wù)端亂碼

2009-11-30 14:15:17

Cisco路由器配置實
點贊
收藏

51CTO技術(shù)棧公眾號