王天棋,丁要軍
(甘肅政法大學,甘肅 蘭州 730070)
在安全和隱私保護需求的驅動下,加密流量在網絡中占據了越來越重要的地位。根據谷歌在2020 年發布的透明度報告,已經有80%的安卓應用程序默認使用傳輸層安全協議(Transport Layer Security,TLS)加密所有流量[1]。根據CISCO 2019年的報告,使用加密來隱藏遠程控制以及數據泄露等惡意行為的惡意軟件占比超過70%,使用加密通信的惡意軟件幾乎覆蓋了所有常見類型[2]。因此,高效識別TLS 惡意加密流量有重要的現實意義。
目前,已經有國內外研究人員對網絡惡意加密流量進行了研究,并且取得了一定的成就。Canard等人[3]提出了對加密流量進行深度包檢測(Deep Packet Inspection,DPI)而無需解密的技術,但在設置階段需要大量的計算和較長的檢測時間。Torroledo 等人[4]通過考慮TLS 協議中的證書,利用證書內容對惡意流量進行識別,但是此方法對無證書傳遞的加密會話惡意性檢測無效。Anderson 等人[5]提出了一種TLS 指紋識別系統,該系統利用目標地址、端口和服務器名精心構造了指紋串。但是,Matou?ek 等人[6]發現以取證為目的創建唯一且穩定的TLS 指紋并不容易,惡意用戶可以通過惡意行為改變TLS 版本、密碼套件等信息躲避檢測,因此指紋的發展受到了限制。此外,Anderson等人在文獻[7]中研究利用TLS 握手階段的可用特征來識別加密惡意流量,但缺乏對握手階段外的特征考慮,且只使用了邏輯回歸分類器進行驗證。
鑒于此,本文在TLS 加密流量特征分析的基礎上,提出了一種基于Stacking 的網絡惡意加密流量識別方法。該方法通過對惡意流量和正常流量進行分析,提取出能識別惡意流量的會話特征、握手特征和證書特征,并在單一特征和多特征條件下對惡意加密流量識別進行對比,發現多特征的檢測方法能有效提升識別效果。為解決單一的機器學習方法在不同環境下的分類準確率難以保持穩定且泛化能力差的問題,構建Stacking 模型并選擇合適的基學習器和元學習器,最后在公開數據集上進行訓練,實驗證明所提算法的識別效果優于現有方法。
TLS 協議是加密流量傳輸中常用的協議[8],也是保護許多明文應用協議的主要協議。圖1 是一個完整的TLS 握手過程。如圖1 所示,首先,客戶端發送一條ClientHello 消息,該消息為服務器提供了一系列密碼套件和一組客戶端支持的TLS 擴展;其次,服務器發送一個ServerHello 消息,其中包含從客戶端列表中選擇的加密套件,還包含服務器支持的擴展列表以及證書鏈的Certificate 消息,該消息可用于對服務器進行身份驗證;再次,在客戶端發送ClientKeyExchange 消息給服務器端后,客戶端和服務器交換ChangeCipherSpec 消息,以后的消息將使用協商好的加密參數進行加密;最后,客戶機和服務器開始交換應用程序數據[9]。

圖1 TLS 協議握手協商階段流程
傳統的通過TLS 解密來查看流量密文內容的方式,不僅耗時,而且不能保護隱私。由于TLS 協商的過程是通過明文來進行的,因此可以從未加密的消息中提取有用的信息。雖然證書是在TLS 握手階段得到的,但由于其對分類結果的影響明顯,因此本文將證書作為單獨特征向量進行考慮。
1.2.1 TLS 握手特征分析和提取
握手特征從客戶端發送明文Client Hello 消息和服務端反饋Server Hello 消息中提取。圖2 展示了惡意會話和正常會話的服務器對TLS 加密套件的選擇對比和客戶端支持的曲線對比。為了更清晰地表示,將密碼套件用16 進制代碼表示。

圖2 惡意會話和正常會話密碼套件和曲線對比
服務器選擇的密碼套件針對大多數正常會話和惡意會話有嚴格劃分。大多數正常的加密會話服務器選擇的TLS 密碼套件為000a、c014。
其中:

從圖2(a)中可以看出,惡意軟件占比多的0004、0005 是比較弱的加密套件,安全性不足。從客戶端支持的曲線對比看出,除選用基于256 bits的素數域P 上的橢圓曲線(secp256r1)外,有23%的惡意會話的客戶端依賴底層素數域特征為2255-19的橢圓曲線(x25519),而有33%的正常會話選用基于384 bits 的素數域P 上的橢圓曲線(secp384r1)。
此外,觀察到正常加密流量客戶端支持的擴展種類豐富,惡意流量客戶端擴展種類較為單一。提取出的TLS 握手特征如表1 所示。

表1 TLS 握手特征
1.2.2 服務器證書特征分析和提取
服務器證書是用于驗證服務器身份的文件,普通認證機構(Certificate Authority,CA)證書由可信的CA 機構頒發。自簽名證書任何人都可以頒發,它的issuer 與subject 相同。
在提取證書特征的過程中,證書的有效期、證書鏈的長度、證書是否自簽名等重要特征指標無法直接獲取,需要通過相應的算法來獲得。圖3 展示了正常和惡意加密流量的服務器證書有效期時長對比和服務器證書的issuer 長度對比。可以看出,正常的加密流量證書有效期較短,有58%的正常會話證書有效期是80 天左右。而惡意加密流量有效期時間相對較長,甚至有5.6%達到36 500 天。

圖3 惡意和良性流量證書有效期和issuer 長度對比
從服務器證書的issuer 長度可以看出,60%的正常加密會話的服務器證書issuer 長度為1,而惡意流量證書issuer 長度為2 和3 的占比86%。此外,觀察到TLS 服務器使用自簽名證書的頻率和使用公鑰的長度等指標在惡意和正常加密流量中也有明顯區別。提取出的服務器證書特征如表2 所示。

表2 證書特征
1.2.3 會話的特征分析和提取
會話特征是現有文獻中的常見特征。通過觀察發現,大部分惡意軟件的接收數據包數量為5~12個,而正常流量數據包的數量變化范圍較大。惡意加密流量的連接狀態為連接已建立,發起方中止RSTO 的最多,占比43%,而正常加密流量的連接狀態以正常建立和終止SF 的居多。此外,包長度、包到達時間等也是重要的會話統計特征。提取出的會話特征如表3 所示。

表3 會話特征
Stacking 是組合異質分類器的集成學習方法,它融合不同的學習算法實現高精度的分類任務[10],能夠有效降低泛化誤差,并通過元學習器來取代Bagging 的投票法,來綜合降低偏差和方差。同時,Stacking 作為一種集成框架,往往采用兩層結構,第1 層組合多個基學習器輸出特征,第2 層使用元學習器組合第1 層的輸出特征,給出最終的預測結果。研究表明,Stacking 在增加有限計算開銷的同時,有出色的性能和魯棒性[11]。
Stacking 算法共分成3 個步驟:
(1)根據原始數據D訓練第一層分類器,一共有T個分類器,其中ht是第t次循環得到的分類器;
(2)根據第一層分類器的輸出,構造新的數據集,第一層的預測結果將作為數據的新特征,原始數據的標簽成為新數據的標簽;
(3)根據新的數據集訓練第二層分類器得到新的分類器h′,對于每一個數據實例x,分類器的預測結果為h′(h1(x),h2(x),…,hT(x)),其中,h1(x),h2(x),…,hT(x)表示第一層中的分類器[12]。
Stacking 算法偽代碼如下:


Stacking 集成方法通過將不同的算法結合在一起,發揮每個算法的優勢來獲得更佳的預測性能。在構建Stacking 集成模型中,首先需要確定基學習器的種類,而基學習器的選擇需從準確性和多樣性兩個方面考慮。
從基學習器的預測性能方面考慮,本文除了選擇隨機森林(Random Forest,RF)和LightGBM[13]模型作為基學習器,還選擇了其他預測性能優異的模型。其中,XGBoost 針對傳統的梯度提升決策樹進行改進,在訓練時間等方面都有所提升。
為了獲得最佳的集成模型,還需要考慮基學習器之間的相關性。選擇相關性較小的算法能夠充分發揮不同算法的優勢[14],達到互補的目的。本文采用Pearson 相關系數衡量算法之間的相關性大小,其表達式為:

式中:和分別為各向量中元素的平均值。最后,依據基分類器追求“準而不同”的原則,初步選 擇RF、K 近 鄰(K-Nearest Neighbor,KNN)、XGBoost、支持向量機(Support Vector Machine,SVM)和LightGBM 作為基學習器。
Wolpert 在提出Stacking 時,就說明了元學習算法和新數據的屬性表示對Stacking 集成的泛化性能影響很大[15]。對于輸出類概率的初級分類器,分類器h對樣例x的預測是,x屬于所有可能類標簽的概率為pht(cj|x),j=1,…,l,其中,l是指l個分類問題,pht(cj|x)定義了分類器h估計樣例x屬于類別cj的概率值。將基分類器對所有類預測的后驗概率作為元層學習器的輸入屬性[16],乘以最大概率的概率分布,其表達式為:

概率分布的熵為:

元模型通常很簡單,為了減輕過擬合,第二層元學習器選擇邏輯回歸模型。本文構建的基于Stacking 的加密惡意流量檢測模型如圖4 所示。

圖4 基于Stacking 的惡意加密流量識別算法流程
本文采用scikit-learn 機器學習庫構建Stacking模型并完成實驗評估,在Windows 10 環境下運行,處理器為AMD Ryzen 4800H,圖形處理器(Graphics Processing Unit,GPU)為RTX 2060,內存為16 GB。
本實驗選用DataCon 開放數據集[17],源自2020年2—6 月收集的惡意軟件與正常軟件,經奇安信技術研究院天穹沙箱運行并采集其產生的流量篩選生成,數據集格式為pcap 文件。由于本文研究需要更精確的數據集,對數據進行以下處理:
(1)過濾未完成完整握手過程的會話;
(2)過濾確認包、重傳包及傳輸丟失的壞包;
(3)借助Zeek[18]將pcap 包轉換為流量日志,進行特征提取;
(4)特征提取后對非數值型的特征流量使用One-Hot 編碼,滿足模型輸入的需要;
(5)對特征的缺失值和異常值進行處理,采用Z-score 對數據進行標準化。經過數據預處理后,最終的數據集如表4 所示。

表4 最終數據集構成
本文采用精確率(Precision)、召回率(Recall)、F1 值和ROC 曲線下方的面積(Area Under Curve,AUC)值作為評價指標來估計方法的分類效果。精確率(Precision)、召回率(Recall)和F1 值的定義分別為:

式中:TP為被模型預測為正類的正樣本數量;FN為被模型預測為負類的正樣本數量;FP為被模型預測為正類的負樣本數量。
本文提取出會話統計特征86 維,握手特征62維和證書特征31 維,共計179 維特征向量。為了分析不同特征組合的性能,使用隨機森林算法分別測試了3 種特征組合下的識別效果,實驗結果如表5 所示。

表5 不同的特征組合五折交叉驗證結果
為了減小特征冗余和噪聲,去除相關度高及有負影響的特征,使用特征篩選算法Correlation AttributeEval,分別選擇特征從10 到100 維的10 種情況進行實驗,確定特征維數為多少時,模型分類效果最佳,實驗結果如圖5 所示。

圖5 特征維數確定
當特征維數為30 時,使用隨機森林算法分類時,F1 最高,達到97.2%。此后隨著維數的增加,F1 值逐漸降低。因此,本文將特征維數縮減到30 來進行實驗,在提高識別效果的同時縮短了運行時間。
不同特征組合下分類性能對比如圖6 所示。可以看出多特征識別顯著提升了模型精確率和召回率,特征篩選進一步提升了模型的性能。
為了減輕過擬合,第二層元學習器一般選擇簡單的模型,本文選擇邏輯回歸作為元分類器學習。表6 比較了常用于Stacking 模型中的K 近鄰(K-Nearest Neighbor,KNN)、支持向量機(Support Vector Machine,SVM)和邏輯回歸(Logistic Regression,LR)算法作為基分類器的差異。結果表明LR 算法作為元學習器時,Stacking 模型表現最好。
將本文構建的Stacking 模型與SVM、RF、XGBoost、CNN 算法對比,實驗結果如表7 所示。

表7 算法性能對比
由表7 可以看出,本文構建的Stacking 模型的查準率、召回率、F1 值和AUC值均高于其他算法模型。與SVM 相比,分別提高了3.4%,3.3%,3.4%和3.2%;與XGBoost 相比,分別提高了2.2%,2.1%,1.7%和0.3%;與CNN 相比,分別提高了1.5%,2.7%,2.1%和4.1%。因此,通過上述對實驗結果的分析,驗證了本文提出的基于Stacking 的網絡惡意加密流量識別方法的可行性。
本文通過分析大量的正常和惡意加密流量,從中提取出具有顯著區分度的會話特征、握手特征和證書特征。對單一特征和多特征識別網絡惡意加密流量進行對比,結果表明加入了握手和證書特征后可以顯著提升模型的識別效果。構建基于Stacking集成學習的網絡惡意加密流量檢測模型,實驗表明,在Datacon2020 數據集下,本文Stacking 模型效果比XGBoost 等4 種算法效果均有所提升,解決了單一的機器學習方法泛化能力弱的問題。此外,文章還存在一些不足之處,如在構建Stacking 模型時可以嘗試更多基分類器和元分類器的組合,從而作出更優的選擇,這也是今后進一步研究的方向。