屈云軒,王軼駿,薛 質(zhì)
(上海交通大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院,上海 200240)
隨著計(jì)算機(jī)網(wǎng)絡(luò)的高速發(fā)展,越來越多的信息通過網(wǎng)絡(luò)進(jìn)行傳輸。然而,最近發(fā)生的多起用戶信息泄露事件也給受害者帶來了損失,用戶在上網(wǎng)過程中不希望自己的身份被其他人獲取。匿名通信網(wǎng)絡(luò)就是為了隱藏通信雙方的身份而設(shè)計(jì)的,使用匿名通信網(wǎng)絡(luò)可以防止自己的身份被對(duì)方或監(jiān)聽者獲取,從而保護(hù)用戶的身份。Chaum在1981年最先提出基于MIX網(wǎng)絡(luò)的匿名通信技術(shù)[1]。由于MIX網(wǎng)絡(luò)可以提供強(qiáng)大的匿名性,因此目前大多數(shù)匿名通信網(wǎng)絡(luò)均使用MIX網(wǎng)絡(luò)對(duì)用戶身份提供保護(hù)。I2P就是一種使用非常廣泛的基于MIX網(wǎng)絡(luò)的匿名通信網(wǎng)絡(luò),通過隨機(jī)選擇MIX網(wǎng)絡(luò)中的節(jié)點(diǎn)組成通信鏈路為用戶提供匿名。同時(shí),I2P提供了Eepsite和LeaseSet,使服務(wù)器可以在隱藏身份的情況下與用戶進(jìn)行通信。正是由于I2P提供了強(qiáng)大的匿名性,使得很多違法分子通過I2P進(jìn)行違法犯罪活動(dòng)[2]。
國內(nèi)外目前已有大量針對(duì)匿名通信網(wǎng)絡(luò)及其流量識(shí)別技術(shù)的研究。在國外,Conrad等人在文獻(xiàn)[3]中對(duì)Tor和I2P網(wǎng)絡(luò)進(jìn)行了對(duì)比;Bernaille等[4]提出了通過觀察TCP流的前5個(gè)數(shù)據(jù)包對(duì)應(yīng)用進(jìn)行識(shí)別;Raahemi等[5]通過對(duì)IP層數(shù)據(jù)進(jìn)行挖掘識(shí)別P2P流量;Mayank等[6]提出了RDClass的算法,通過流量與關(guān)鍵字集合之間的距離對(duì)應(yīng)用進(jìn)行識(shí)別;Staravoitau[7]提出了通過對(duì)數(shù)據(jù)進(jìn)行預(yù)處理后,使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)流量進(jìn)行識(shí)別,準(zhǔn)確率達(dá)到99.33%。在國內(nèi),方鵬[8]使用了TCP特征和聚類的方式對(duì)惡意TCP流進(jìn)行識(shí)別,并標(biāo)記惡意流量;何高峰等[9]通過Tor流量的TLS和長度分布特征對(duì)Tor流量進(jìn)行識(shí)別;李響[10]對(duì)使用Meek網(wǎng)橋的Tor流量進(jìn)行深入分析,使用多級(jí)過濾和SVM相結(jié)合的方式,對(duì)基于Meek的Tor流量進(jìn)行識(shí)別;李金栓[11]對(duì)I2P流量特征進(jìn)行分析,使用多級(jí)過濾和遺傳算法對(duì)I2P流量進(jìn)行識(shí)別,實(shí)現(xiàn)了一個(gè)原型系統(tǒng)。
目前,針對(duì)匿名通信網(wǎng)絡(luò)的研究主要集中在Tor的流量識(shí)別,很少有關(guān)于I2P流量識(shí)別的文獻(xiàn)。同時(shí),I2P新加入的NTCP2協(xié)議也給I2P流量帶來了新的特征,因此有必要對(duì)最新版I2P的流量特征進(jìn)行研究,并設(shè)計(jì)算法識(shí)別其流量。本文對(duì)加入NTCP2協(xié)議后的I2P流量特征進(jìn)行研究,并實(shí)現(xiàn)了一個(gè)用于識(shí)別I2P流量的原型系統(tǒng)。
對(duì)I2P運(yùn)行原理和傳輸層協(xié)議進(jìn)行分析,包括I2P隧道建立、轉(zhuǎn)發(fā)過程以及I2P路由節(jié)點(diǎn)之間進(jìn)行通信的協(xié)議——SSU、NTCP和NTCP2。
I2P是一種廣泛使用的匿名通信網(wǎng)絡(luò),可以用于匿名瀏覽網(wǎng)頁、匿名郵件及匿名文件共享等。I2P在發(fā)送數(shù)據(jù)時(shí)會(huì)使用節(jié)點(diǎn)選擇算法從netDB中隨機(jī)選擇一定數(shù)目的節(jié)點(diǎn)組成單向的傳入隧道(Inbound Tunnel)和傳出隧道(Outbound Tunnel)。其中,傳入隧道用于接收數(shù)據(jù),傳出隧道用于發(fā)送數(shù)據(jù),隧道中的每個(gè)節(jié)點(diǎn)都只知道它的上一跳和下一跳節(jié)點(diǎn)。路由間數(shù)據(jù)通過I2P傳輸層協(xié)議進(jìn)行傳輸。
下面介紹I2P的網(wǎng)絡(luò)數(shù)據(jù)庫、隧道建立和傳輸層協(xié)議。
I2P netDB是一個(gè)分布式數(shù)據(jù)庫,保存有路由節(jié)點(diǎn)信息(RouterInfos)和賃集(LeaseSets)兩種信息。它們都經(jīng)過簽名,任何使用這些數(shù)據(jù)的節(jié)點(diǎn)都可以通過簽名驗(yàn)證這些信息。其中,RouterInfo記錄了路由節(jié)點(diǎn)的身份(包括加密密鑰、簽名密鑰和證書)、IP地址和端口等信息。
當(dāng)I2P需要進(jìn)行通信時(shí),客戶端建立傳入隧道和傳出隧道。隧道建立時(shí),I2P隨機(jī)從netDB中選擇節(jié)點(diǎn)建立單向傳輸?shù)乃淼馈S捎谒淼朗菃蜗虻?,因此為了完成通信,至少需要建立一條用于發(fā)送數(shù)據(jù)的傳出隧道和一條用于接收數(shù)據(jù)的傳入隧道。
I2P路由節(jié)點(diǎn)之間通過傳輸層協(xié)議進(jìn)行通信,高層協(xié)議經(jīng)過I2P傳輸層協(xié)議進(jìn)行封裝后通過TCP或UDP發(fā)送到目標(biāo)路由節(jié)點(diǎn)。I2P的傳輸層有安全半可靠UDP(Secure Semireliable UDP,SSU)、NTCP和NTCP2三種協(xié)議。
1.3.1 SSU
SSU在UDP協(xié)議的基礎(chǔ)上實(shí)現(xiàn)半可靠的、加密的、面向連接的和點(diǎn)到點(diǎn)的數(shù)據(jù)傳輸服務(wù)。SSU連接建立過程如圖1所示。
圖1 SSU會(huì)話建立
1.3.2 NTCP
NTCP使用TCP協(xié)議,是一種基于Java NIO的傳輸層協(xié)議。NTCP建立過程如圖2所示。
圖2 NTCP會(huì)話建立
1.3.3 NTCP2
NTCP2在I2P 0.9.36中被引入,NTCP2使用Noise協(xié)議框架。NTCP2可以與NTCP運(yùn)行在同一端口或者不同端口。NTCP2建立連接的過程如圖3所示。
圖3 NTCP2會(huì)話建立
通過運(yùn)行I2P并進(jìn)行抓包獲取包含I2P流量的數(shù)據(jù)包,并使用netDB中RouterInfo對(duì)數(shù)據(jù)流進(jìn)行標(biāo)記,最后分析I2P數(shù)據(jù)流特征。由于NTCP和NTCP2協(xié)議可以同時(shí)運(yùn)行,因此下文不再區(qū)分NTCP和NTCP2協(xié)議。
提取捕獲到的數(shù)據(jù)包的載荷長度,分別繪制載荷長度分布直方圖,如圖4和圖5所示??梢钥闯觯瑹o論是基于TCP還是UDP的協(xié)議,均存在載荷長度較小的數(shù)據(jù)包,且這樣的數(shù)據(jù)包占了很大比重,長度較大的載荷長度根據(jù)協(xié)議的不同有較大差異。根據(jù)第1節(jié)的描述,由于I2P隧道是單向的,因此隧道反向傳輸?shù)臄?shù)據(jù)只有確認(rèn)包,數(shù)據(jù)量較小。然而,通過對(duì)大量的I2P數(shù)據(jù)流進(jìn)行分析發(fā)現(xiàn),雖然大部分?jǐn)?shù)據(jù)流符合該特征,但仍有小部分上下行數(shù)據(jù)量大致相同。
圖4 基于TCP的I2P數(shù)據(jù)流載荷長度分布
圖5 基于UDP的I2P數(shù)據(jù)流載荷長度分布
為了進(jìn)一步得到I2P數(shù)據(jù)流載荷長度的特征,下面分析其載荷長度的統(tǒng)計(jì)量。由于基于TCP和UDP的I2P流量有較大差異,因此需要分別對(duì)其進(jìn)行研究。同時(shí),I2P流量的載荷長度可以明顯分為兩種,長度較大的載荷一般用于數(shù)據(jù)的發(fā)送,長度較小的載荷用于對(duì)報(bào)文的確認(rèn)。由于載荷長度大小對(duì)流量特征也有較大影響,因此本文設(shè)定了一個(gè)len_threshold,大于該長度的載荷視為長度較大載荷,小于該長度的視為長度較小的載荷。通過計(jì)算不同基于UDP的I2P數(shù)據(jù)流的統(tǒng)計(jì)量,繪制成圖6、圖7和圖8。
圖6 基于UDP的I2P數(shù)據(jù)流載荷長度期望
圖7 基于UDP的I2P數(shù)據(jù)流載荷長度標(biāo)準(zhǔn)差
圖8 基于UDP的I2P數(shù)據(jù)流載荷長度熵
從圖6、圖7和圖8可以看出,基于UDP的I2P流量具有一定的統(tǒng)計(jì)特性,尤其是用于確認(rèn)的長度較小的載荷,期望分布于0~200,標(biāo)準(zhǔn)差分布于0~50,熵分布于0~30。
本文使用同樣的方法繪制了基于TCP的I2P數(shù)據(jù)流的統(tǒng)計(jì)特征圖,如圖9、圖10和圖11所示。
圖9 基于TCP的I2P數(shù)據(jù)流載荷長度期望
圖10 基于TCP的I2P數(shù)據(jù)流載荷長度標(biāo)準(zhǔn)差
圖11 基于TCP的I2P數(shù)據(jù)流載荷長度熵
從圖9、圖10和圖11可以看出,基于TCP的I2P數(shù)據(jù)流小長度載荷長度的統(tǒng)計(jì)特征較UDP更為明顯,TCP較小載荷長度期望分布在0~20,標(biāo)準(zhǔn)差分布在0~300,載荷長度熵分布于0~10。長度較大的載荷期望分布在1 000~2 500,大部分標(biāo)準(zhǔn)差小于1 000。
在第1節(jié)中介紹了I2P傳輸層連接建立的過程,從連接過程交換的信息來看,I2P傳輸層協(xié)議在連接建立過程中可能存在明顯的長度序列模式。下面截取部分基于TCP的I2P傳輸層建立會(huì)話過程的數(shù)據(jù)流,如圖12所示。
圖12 基于TCP的I2P傳輸層建立連接
圖13對(duì)比了3條基于TCP的數(shù)據(jù)流,可以看出數(shù)據(jù)流的前幾個(gè)數(shù)據(jù)包的載荷長度序列有一定的大小范圍?;赨DP的I2P數(shù)據(jù)流也有類似的模式,部分?jǐn)?shù)據(jù)流如圖13所示。
圖13 基于UDP的I2P傳輸層建立連接
從圖13可以看出,基于UDP的I2P流量有著更為明顯的特征,尤其是第3個(gè)載荷長度固定為512 Byte。
I2P載荷經(jīng)過加密處理,因此載荷無明顯特征。然而,這與其他加密協(xié)議如TLS有明顯區(qū)別。在TLS協(xié)議中,安全傳輸層載荷開始處會(huì)記錄數(shù)據(jù)類型、協(xié)議版本和長度等信息。
根據(jù)對(duì)大量I2P流量數(shù)據(jù)包網(wǎng)際互聯(lián)層和傳輸層的頭部分析發(fā)現(xiàn),I2P流量的IP頭部的TOS字段均為0,TCP頭部的PSH位置位,如圖12所示。
根據(jù)I2P官方網(wǎng)站的描述,I2P在運(yùn)行時(shí)會(huì)從大于1 024的端口號(hào)中隨機(jī)選取一個(gè)端口號(hào)進(jìn)行通信。觀察大量的I2P數(shù)據(jù)包,也證實(shí)了這個(gè)描述。
在TCP協(xié)議中,接收到數(shù)據(jù)包后要返回ACK確認(rèn)數(shù)據(jù)包到達(dá)時(shí)間。本文通過計(jì)算ACK數(shù)據(jù)包發(fā)送時(shí)間和相應(yīng)數(shù)據(jù)包的差值繪制成圖14。
圖14 確認(rèn)到達(dá)時(shí)間差
從圖14中可以看出,I2P數(shù)據(jù)流確認(rèn)到達(dá)數(shù)據(jù)包的發(fā)出時(shí)間差集中在0.2~0.5 s,初始的幾個(gè)報(bào)文時(shí)間差較小。同時(shí),受到網(wǎng)絡(luò)波動(dòng)和計(jì)算量的影響,少部分?jǐn)?shù)據(jù)包的時(shí)間差可能超出范圍。
將根據(jù)第2節(jié)對(duì)I2P流量特征的分析結(jié)果,設(shè)計(jì)并實(shí)現(xiàn)一套算法實(shí)現(xiàn)對(duì)I2P流量進(jìn)行過濾,并對(duì)算法進(jìn)行測(cè)試。
本文首先通過端口號(hào)過濾掉端口小于等于1 024的數(shù)據(jù)流,然后對(duì)數(shù)據(jù)流的其他特征進(jìn)行檢查,如果通過所有檢查,則認(rèn)為是I2P數(shù)據(jù)流。
算法如下:
(1)讀入捕獲的數(shù)據(jù)包并重新建立數(shù)據(jù)流,去除數(shù)據(jù)流中重傳幀;
(2)提取數(shù)據(jù)流的首部標(biāo)志位特征、載荷長度特征、TCP數(shù)據(jù)流確認(rèn)時(shí)間和載荷前十個(gè)字節(jié);
(3)檢查數(shù)據(jù)流端口號(hào),如果小于等于1 024,則認(rèn)為不是I2P數(shù)據(jù)流;
(4)檢查首部特征,如果不符合I2P數(shù)據(jù)流的首部特征,則認(rèn)為不是I2P數(shù)據(jù)流;
(5)檢查載荷前10字節(jié)是否包含載荷長度信息以及同一數(shù)據(jù)流相同位置字節(jié)的相關(guān)性,如果包含或相關(guān)性過大,則認(rèn)為不是I2P數(shù)據(jù)流;
(6)如果是TCP流,則檢查確認(rèn)報(bào)文發(fā)出時(shí)間差,如果有一定比例的數(shù)據(jù)包超出范圍,則認(rèn)為不是I2P數(shù)據(jù)流;
(7)設(shè)定長度len_threshold,根據(jù)len_threshold將載荷長度分成兩部分,小于len_threshold的記為Y,大于len_threshold的記為Z;
(8) 計(jì) 算 E(Y)、D(Y)和 H(Y),如 果 E(Y)、D(Y)或H(Y)不在I2P較小載荷的期望、標(biāo)準(zhǔn)差和長度熵區(qū)間內(nèi),則認(rèn)為不是I2P流量;
(9)計(jì)算 E(Z)和 H(Z),如果 E(Z)或 H(Z)不在I2P較大載荷的期望和長度熵區(qū)間內(nèi),則認(rèn)為不是I2P流量;
(10)如果通過以上所有檢查,則認(rèn)為是I2P流量。
根據(jù)以上算法,本文使用python開發(fā)了一套用于檢測(cè)I2P流量的原型系統(tǒng)。為了使實(shí)驗(yàn)結(jié)果更加準(zhǔn)確,本文在不同環(huán)境重新抓取了包含I2P流量的數(shù)據(jù)包,共獲取到34 926條數(shù)據(jù)流,其中包含5 583條I2P數(shù)據(jù)流。運(yùn)行流量識(shí)別原型系統(tǒng)對(duì)流量進(jìn)行識(shí)別,結(jié)果如表1所示。
表1 實(shí)驗(yàn)結(jié)果
從表1可以計(jì)算出,該原型系統(tǒng)對(duì)I2P流量識(shí)別的精確度(Accuracy)達(dá)到93%,召回率達(dá)到94%,證明該系統(tǒng)可以有效識(shí)別I2P流量。
本文首先對(duì)I2P原理和傳輸層協(xié)議進(jìn)行介紹,其次重點(diǎn)分析I2P數(shù)據(jù)流存在的統(tǒng)計(jì)學(xué)特征,最后根據(jù)I2P數(shù)據(jù)流的統(tǒng)計(jì)學(xué)特征設(shè)計(jì)了一套算法對(duì)I2P流量進(jìn)行識(shí)別。實(shí)驗(yàn)結(jié)果表明,該算法具有較高的精確度和召回率。
在本文的基礎(chǔ)上未來可以從以下幾個(gè)方向?qū)2P流量識(shí)別算法進(jìn)行進(jìn)一步優(yōu)化:
(1)進(jìn)一步豐富數(shù)據(jù)流的種類,對(duì)流量識(shí)別算法進(jìn)行進(jìn)一步優(yōu)化;
(2)可以通過抓取I2P路由節(jié)點(diǎn)信息,直接使用路由節(jié)點(diǎn)信息識(shí)別數(shù)據(jù)流;
(3)可以利用機(jī)器學(xué)習(xí)算法進(jìn)行進(jìn)一步識(shí)別,提高精確度。