張廷龍 張浩東 唐青


前言:目前,隨著網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)囊?guī)模不斷擴(kuò)大,出現(xiàn)的漏洞和風(fēng)險(xiǎn)也越來(lái)越繁復(fù)。其中的漏洞之一OpenSSL的心跳處理邏輯沒(méi)有檢測(cè)心跳包中的長(zhǎng)度字段是否和后續(xù)的數(shù)據(jù)字段相符合,攻擊者可以利用這一點(diǎn),構(gòu)造異常的數(shù)據(jù)包,來(lái)獲取心跳數(shù)據(jù)所在的內(nèi)存區(qū)域的數(shù)據(jù)。這些數(shù)據(jù)中可能包含了證書(shū)私鑰,用戶名,用戶密碼,用戶地址等敏感信息。本篇文章就對(duì)OpenSSL協(xié)議在實(shí)現(xiàn)TLS和DTLS的心跳處理邏輯時(shí)存在編碼缺陷稱為Heartbleed漏洞的原理作初步的研究。
關(guān)鍵詞:Heartbleed漏洞;SSL;TLS
1. Heartbleed漏洞原理
SSL(Secure Socket Layer)安全套接層及其繼任者傳輸層安全TLS(Transport Layer Security)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS和SSL在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。所以通過(guò)SSL或TLS協(xié)議加密后的數(shù)據(jù)包再通過(guò)WireShark軟件進(jìn)行對(duì)數(shù)據(jù)包的抓取時(shí),抓取到的數(shù)據(jù)也是經(jīng)過(guò)加密處理的數(shù)據(jù)。
DTLS(Datagram Transport Layer Security)數(shù)據(jù)包傳輸層安全協(xié)議。TLS不能用來(lái)保證UDP上傳輸?shù)臄?shù)據(jù)的安全,因此Datagram TLS試圖在現(xiàn)存的TLS協(xié)議架構(gòu)上提出擴(kuò)展,使之支持UDP,即成為T(mén)LS的一個(gè)支持?jǐn)?shù)據(jù)報(bào)傳輸?shù)陌姹尽?/p>
心臟出血漏洞主要通過(guò)攻擊者模擬向服務(wù)器端發(fā)送自己編寫(xiě)的Heartbeat心跳數(shù)據(jù)包,主要是HeartbeatMessage的長(zhǎng)度與payload的length進(jìn)行匹配,若payload_lenght長(zhǎng)度大于HeartbeatMes sage的length,則會(huì)在服務(wù)器返回的response響應(yīng)包中產(chǎn)生數(shù)據(jù)溢出,造成有用數(shù)據(jù)泄露。
2.Heartbleed漏洞的發(fā)現(xiàn)與驗(yàn)證
心臟出血漏洞必須在含有心跳擴(kuò)展和漏洞沒(méi)有被修復(fù)的版本中存在,目前存在OpenSSL心血漏洞的OpenSSL版本有OpenSSL1.X等多個(gè)版本。心臟出血漏洞主要存在于OpenSSL的心跳機(jī)制里,判斷OpenSSL有沒(méi)有開(kāi)啟心跳擴(kuò)展,并開(kāi)啟心跳擴(kuò)展機(jī)制。在客戶端對(duì)虛擬機(jī)中搭建的靶場(chǎng)頁(yè)面進(jìn)行訪問(wèn),同時(shí)在客戶端中通過(guò)POC程序?qū)Π袌?chǎng)進(jìn)行攻擊,最后通過(guò)wireshark對(duì)攻擊的請(qǐng)求包和響應(yīng)包進(jìn)行捕獲。
TLS數(shù)據(jù)請(qǐng)求包如下圖所示:
分析由于SSL記錄協(xié)議位于某個(gè)傳輸協(xié)議,例如TCP上面由于數(shù)據(jù)通過(guò)SSL加密處理后顯示亂碼,我們抓取的數(shù)據(jù)包主要通過(guò)16進(jìn)制顯示,所以像heartbeat_Request的數(shù)據(jù)包主要分為四部分:(1)數(shù)據(jù)包幀頭部分;(2)IPv4(IPv6)網(wǎng)絡(luò)層部分;(3)TCP傳輸層部分;(4)圖片中方框標(biāo)注的部分即為通過(guò)SSL加密的心跳數(shù)據(jù)包部分。payload和padding都為空,下面利用漏洞將后面內(nèi)存中的數(shù)據(jù)dump下來(lái)。TLS數(shù)據(jù)響應(yīng)包如下圖所示:
上圖中為通過(guò)wireshark抓取的heartbeat_Response數(shù)據(jù)包的模塊化展示,同樣數(shù)據(jù)包分為幀頭部分,IPv4網(wǎng)絡(luò)層部分,TCP傳輸層部分以及SSL返回的數(shù)據(jù)部分。
0x4000表示返回的數(shù)據(jù)包長(zhǎng)度為16384。0x02表示返回的心跳消息類型。0x4000表示返回的payload_length(16384)。剩余的數(shù)據(jù)即為通過(guò)心臟出血漏洞從內(nèi)存中dump下來(lái)的數(shù)據(jù)。
由于請(qǐng)求包的長(zhǎng)度為3。但是要返回的payload_length為0x4000(16384),所以響應(yīng)包返回的數(shù)據(jù)長(zhǎng)度為0x4000(16384)即漏洞攻擊成功。
3.結(jié)束總結(jié)
OpenSSL心臟出血漏洞(heartbleed)的產(chǎn)生主要由于OpenSSL的心跳處理邏輯沒(méi)有檢測(cè)心跳包中的長(zhǎng)度字段是否和后續(xù)字段相吻合導(dǎo)致攻擊者構(gòu)造異常數(shù)據(jù)包,來(lái)直接獲取心跳數(shù)據(jù)所在的內(nèi)存區(qū)域的后續(xù)數(shù)據(jù)。主要特征有:heartbleed漏洞主要存在于有心跳機(jī)制的OpenSSL協(xié)議中。
IANA組織把開(kāi)啟心跳擴(kuò)展機(jī)制的SSL數(shù)據(jù)包type類型定義為24(0x18)。 heartbleed漏洞主要存在于TLS和DTLS兩種協(xié)議中,在含有heartbleed漏洞的OpenSSL協(xié)議中需要開(kāi)啟心跳擴(kuò)展機(jī)制,而含有心跳擴(kuò)展機(jī)制的TLS版本主要包含在TLSv1.0,TLSv1.1,TLSv1.2三種版本中。heartbleed漏洞攻擊主要由于攻擊者構(gòu)造異常的心跳數(shù)據(jù)包,即心跳包中的長(zhǎng)度字段與后續(xù)的數(shù)據(jù)字段不相符合,來(lái)獲取心跳數(shù)據(jù)所在的內(nèi)存區(qū)域的后續(xù)數(shù)據(jù)。
綜上所述我們可以通過(guò)對(duì)線網(wǎng)中的數(shù)據(jù)首先進(jìn)行判斷是否為含有OpenSSL的數(shù)據(jù)包,同時(shí)通過(guò)對(duì)數(shù)據(jù)包中的type類型判斷數(shù)據(jù)包是否為心跳數(shù)據(jù)包,然后對(duì)TLS的版本進(jìn)行匹配找到相應(yīng)的含有心跳擴(kuò)展機(jī)制的心跳數(shù)據(jù)包,最后通過(guò)對(duì)心跳包中的數(shù)據(jù)實(shí)際長(zhǎng)度與長(zhǎng)度字段定義的值比較,如果實(shí)際長(zhǎng)度小于定義的長(zhǎng)度則該數(shù)據(jù)包即為含有heartbleed漏洞的數(shù)據(jù)包。
參考文獻(xiàn):
[1]石一鳴,馬利民.基于OpenSSL的程序完整性度量方案設(shè)計(jì)與實(shí)現(xiàn)[J],電子世界.?2020,(02).
[2]周興暉,王朝,金鑫.?生成對(duì)抗機(jī)制的密碼算法組件化設(shè)計(jì)[J].?北京電子科技學(xué)院學(xué)報(bào).?2020(04)
[3] 謝東良.基于國(guó)密算法的OpenSSL安全性優(yōu)化研究[D].哈爾濱工程大學(xué)?2016
資助項(xiàng)目:國(guó)家級(jí)大學(xué)科技創(chuàng)新項(xiàng)目(基于Spark的校園網(wǎng)蜜罐系統(tǒng)的研究與設(shè)計(jì),項(xiàng)目編號(hào):023220076?)。