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