田韻嵩 ,李中偉 ,譚 凱 ,洪 晟 ,劉 勇 ,金顯吉
(1.哈爾濱工業大學 電氣工程及自動化學院,黑龍江 哈爾濱150001;2.北京航空航天大學 網絡空間安全學院,北京 100191)
現代汽車智能化功能越來越豐富,汽車與外部的信息交互越來越頻繁,汽車網絡被入侵的風險越來越高[1]。而入侵檢測算法被應用于汽車CAN 總線網絡安全防御中,其檢測惡意攻擊的能力將對汽車CAN 總線網絡的安全性產生影響。
入侵檢測算法能夠識別外部針對網絡資源的惡意操作,也能夠檢測內部用戶的違規或未授權的非法行為。 目前,入侵檢測算法從檢測技術的角度可分為以下3 類:(1)基于規則的入侵檢測算法;(2)基于統計的入侵檢測算法;(3)基于機器學習的入侵檢測算法[2]。 其中基于機器學習的入侵檢測算法能夠利用龐大的已有數據進行學習,發現內在規律,實現網絡攻擊行為檢測的智能化。 并且機器學習具備預測能力,對未知模式的攻擊也具備一定的檢測能力,是目前熱門的入侵檢測算法研究領域。
近年來,越來越多的研究人員開始對汽車CAN總線的入侵檢測算法進行研究。 美國密歇根大學的Cho 等提出利用電子控制單元(Electronic Control Unit,ECU)指紋時鐘,結合遞歸最小二乘法有效監測CAN總線異常[3]。 德國的 Kneib 等提出從 CAN 報文數據幀中提取指紋來識別 ECU[4]。Groza 等提出利用布隆過濾器監測報文標識符和部分數據字段的周期,檢測潛在的重放和篡改攻擊[5]。 曾潤針對時間觸發型和事件觸發型的汽車CAN 報文,分別提出了基于發送時間間隔與C4.5 決策樹的入侵檢測算法[6]。吳貽淮提出了基于 PCA-BP 的 CAN 數據包發送頻率檢測算法及基于GA-RBF 神經網絡的CAN 網絡數據關聯性檢測算法[7]。 入侵檢測算法的多樣性為保障車載通信網絡的安全提供了更多的選擇,然而,如何對入侵檢測算法的檢測性能進行測試,確保應用于汽車通信安全防護的算法是可靠且有效的成為了一個新的亟待解決的問題。
目前,國內外針對入侵檢測算法的檢測性能主要采用相對傳統的方法進行測試,即利用已有數據集對算法檢測性能進行模糊測試,這種方法的缺點是所采用的測試數據集格式和內容固定,脫離入侵檢測算法的實際應用情境,導致得到的測試結果可信度較低[8-9]。為解決這一問題,本文提出一種改進汽車CAN 總線入侵檢測算法性能模糊測試方法[10-12]。該方法針對已知和未知CAN 總線協議規范的情況分別利用基于字段權重和基于WGAN-GP 的方法生成測試覆蓋率較高的測試用例,通過將測試用例輸入汽車CAN 總線入侵檢測算法中,得到入侵檢測算法對測試用例的檢測率,完成對入侵檢測算法的性能測試。
入侵檢測算法被廣泛應用于汽車CAN 總線網絡的安全防護中,而基于機器學習的入侵檢測算法更是目前研究的熱點[13]。 基于機器學習的入侵檢測算法能夠把異常行為識別轉換為模式識別問題,根據傳輸數據特征和已有數據記錄等來區分正常和異常的行為,在提升入侵檢測效率的同時也降低了誤報率和漏報率,應用前景廣闊。 常用的基于機器學習的入侵檢測算法主要包括神經網絡、集成學習、K 近鄰、貝葉斯網絡、聚類算法等。
為驗證本文提出的測試方法的有效性,本文選取了兩種理論成熟、應用廣泛且精度較高的基于機器學習的入侵檢測算法——K 近鄰算法和AdaBoost算法進行研究并實現,利用本文提出的方法對兩種入侵檢測算法進行性能測試。
K 近 鄰 算 法(K-Nearest Neighbor,KNN)是 一 種 監督學習算法。 這種算法通過使用所有已知類型的數據樣本作為參照,來判斷未知數據樣本的類別。 首先,計算待判斷類型的未知數據樣本到所有已知類型的數據樣本之間的距離,然后按照與待判斷類型的未知數據樣本距離最近的原則選擇k 個已知類型的數據樣本,判斷未知數據樣本的類型與k 個已知類型的數據樣本中占比較多的類型是否相一致。其中常見的計算樣本間距離的函數有:馬氏距離、巴氏距離、漢明距離、切比雪夫距離等。 KNN 算法的優點是理論簡單、易于實現,并且使用新數據更新訓練模型也較為容易。 缺點在于對樣本容量較大的數據集應用該算法時計算量較大,且在每次分類時都會進行一次全局運算;另外k 值的選取也會對分類結果的準確性產生很大的影響。
基于KNN 的汽車 CAN 總線入侵檢測算法基本流程如圖 1 所示。

圖1 KNN 算法流程圖
本文以漢明距離作為所實現的KNN 算法的距離函數,計算已知與未知報文樣本之間的距離,找出k 個距離待判斷類型的未知報文樣本最近的已知類型報文樣本,并統計其中正常與異常報文的數量,以其中數量占比更多的報文類別作為未知報文樣本的類別判定結果。
自適應提升算法(Adaptive Boosting,AdaBoost)是一種提升學習算法。 AdaBoost 算法的優點是可有效利用弱分類器進行級聯且模型訓練方式充分考慮了每個弱分類器的權重,分類精度較高;缺點是AdaBoost 訓練過程迭代次數的設定對分類結果影響較大,且模型整體的訓練過程耗時較長。 AdaBoost算法的基本流程如下:
(1)構造訓練集。 在汽車 CAN 總線上采集正常的CAN 報文并變異生成訓練數據集, 賦予其中所有樣本相同的初始權重值。
(2)訓練弱分類器。 訓練初始弱分類器,計算樣本分類正誤率,按照正誤率確定弱分類器的權重,并對訓練集樣本權重進行更新:提高分類錯誤的樣本權重,降低分類正確的樣本權重。 之后訓練下一個弱分類器。
(3)弱分類器組合構成強分類器。在強分類器中弱分類器的影響能力由訓練時對訓練樣本檢測的正誤率決定。 弱分類器的檢測正確率越高,在最終的分類函數中影響力越大。
(4)在得到 AdaBoost 算法的強分類器后,使用強分類器 H(x)檢測報文。 AdaBoost 算法的訓練過程如圖 2 所示。

圖2 AdaBoost 算法的訓練過程
模糊測試通過向被測對象發送大量隨機或半隨機的數據來進行安全性測試。 目前,對入侵檢測算法的性能測試多采用公開數據集或經隨機變異得到的數據集作為測試用例,測試算法對于異常報文的檢測率。 但公開數據集的內容形式相對固定,人工隨機變異得到的數據集則存在隨機性太強的缺點,所以傳統模糊測試方法的測試用例覆蓋率不高,易出現組合爆炸的問題,測試效率較差且得到的測試結果并不可靠。 而本文所提出的改進汽車CAN 總線入侵檢測算法性能模糊測試方法重點針對生成模糊測試用例的方法進行研究,可以生成高覆蓋率的測試用例,通過計算汽車CAN 總線入侵檢測算法對測試用例的檢測率,測試算法的性能,能夠得到可信度較高的入侵檢測算法性能測試結果。
本文所提出的汽車CAN 總線入侵檢測算法性能測試方法的具體步驟如下:
(1)構建報文數據集。 采用以下兩種方式構建數據集:①利用汽車內部的OBD 等接口,在汽車處于正常行駛的狀態下收集CAN 報文,構造正常報文集,并通過人工變異的方式構建偽造異常報文集。②通過CANoe 等仿真軟件模擬汽車正常行駛和出現異常的狀況,生成正常和異常報文數據,構建報文數據集。
(2)預處理 CAN 報文,按照 ID 分類 CAN 報文。根據規定,CAN 總線報文數據場長度不超過 8 B,為了方便進行統一處理,當報文數據場的長度不足8 B 時,用 0 補齊至 8 B。 并將十六進制的報文數據轉化為二進制形式進行表示。
(3)生成測試用例。 這部分是本文提出的汽車CAN 總線入侵檢測算法性能測試方法的核心。 為生成覆蓋率較高的測試用例集,本文針對是否已知CAN 總線協議規范的情況分別提出了兩種生成測試用例的方法,分別是基于字段權重和基于WGAN-GP 的測試用例生成方法,在已知 CAN 總線協議規范的情況下可運用基于字段權重的測試用例生成方法,在未知CAN 總線協議規范的情況下,可以使用基于WGAN-GP 的測試用例生成方法。
(4)將測試用例輸入到入侵檢測分類器中,觀察分類結果, 根據分類結果計算分類器的準確率,評價入侵檢測算法的性能。
基于字段權重的測試用例生成方法需要在已知CAN 總線應用層報文數據場的字段格式基礎上進行。 下面首先對報文數據場內第j 位的位翻轉數進行定義:

式中,BFNj為報文數據場第 j 位的位翻轉數,m 為汽車 CAN 總線系統中一段時間 t 內某 ID 相同報文的集合,n 為某ID 相同報文的集合中的報文數量。
則在該段時間內報文的第j 位翻轉率為:

式中,BFAj為報文第 j 位的位翻轉率,BFNj為報文數據場第 j 位的位翻轉數,n 為某 ID 相同報文的集合中的報文數量。
計算出在一段時間t 內某ID 的報文的位翻轉率BFAj后,定義該字段內的平均位翻轉率為:

式中,BFDk為第 k 個字段的平均位翻轉率,k1為該字段的起始位,k2為該字段的結束位。
當一個字段的平均位翻轉率越高,說明在這段時間內該字段的變化越快,在生成測試用例時應作為重點考慮的變異對象。 所以對變化較快的字段賦予較高的權值。 本文采用了以下幾種構造變異數據的方法:
(1)對CAN 報文數據場中的某一段數據進行隨機變異,其余部分保持不變。
(2)設置一定的變異比例,按照比例選取CAN報文數據場中的部分二進制位,以“從 0 置 1,從 1置0”的形式對這部分二進制位進行變異。
(3)按照協議規范,將數據場中某一字段看作是一個整體,對整體的數據值進行加1 或減1 操作來進行變異。
(4)選取數據場中一定比例的二進制位進行置0 或 置 1 操 作 。
另外,當多個字段組合起來進行變異時也可能會被入侵檢測算法檢測到異常,因此為了提升生成的測試用例的質量,還需要考慮將同一ID 的報文所劃分的不同報文字段進行多字段組合變異。 單一字段變異和組合字段變異兩者結合生成最終模糊測試使用的所有測試用例。 具體的步驟如下:
(1)首先根據協議規范對字段格式的劃分,確定對每個字段進行變異的權重指數。
(2)針對單一字段進行變異。采用合適的變異方法,利用之前確認的每個字段進行變異的權重指數,確定單一字段進行變異的次數,變異權重越高,則變異次數越多,相應生成的測試用例也越多。
(3)分析不同字段之間可能存在的關聯性。利用人工分析或通過采取關聯規則分析技術分析不同字段之間可能存在的關系,以此為基礎進行組合字段的變異。
(4)計算組合字段的變異權重指數,進一步確認組合測試用例的數目并變異生成。
本文采用從正常運行的汽車上采集的數據變異生成模糊測試用例,為保護汽車協議的私密性,采用“X”來隱藏汽車的一部分報文 ID,采集 ID 為 0x1X4的報文格式為[0X1X2X31B 08 3Y 00 Z1Z2Z3Z4]。 在計算了字段的平均位翻轉率及組合字段變異權重等參數后,能夠生成報文 ID 為 0x1X4 的部分模糊測試用例如表1 所示。

表1 基于字段權重方法生成的部分 ID 0x1X4 報文
由表1 可以看出,生成的報文基本符合字段的格式。
生成對抗網絡(Generative Adversarial Network,GAN)是一種深度學習算法,分別由生成模型和判別模型兩部分組成。 模型整體的訓練是一個博弈的過程,生成模型輸入噪聲,判別模型輸入真實數據及生成模型生成的數據,按照判別模型對其輸入數據的判別結果調整GAN 模型的參數,使生成數據與真實數據逐漸相似。 而本文的測試用例需要依據協議格式規范生成,采用生成對抗網絡模型進行訓練能夠高效地對正常CAN 總線報文的格式規范進行學習,訓練完成的模型最終能夠生成多數滿足使用需要的測試用例[14]。
Wasserstein 生成對抗網絡(Wasserstein Generative Adversarial Network,WGAN)是為了解決 GAN 在使用時可能出現的梯度消失、梯度爆炸、模型不收斂等問題而提出的一種改進方法[15]。 使用 Wasserstein 距離來衡量真實數據與生成數據的差異性,該距離的定義如式(4)所示:

另外,其判別模型的目標函數如式(5)所示:

生成模型的目標函數如式(6)所示:

式(4)~式(6)中,Pdata是真實數據分布,PZ是生成數據分布,V(D,G)為生成對抗網絡的目標函數,D 代表判別模型,D(x)表示 x 是真實數據的概率,G 代表生成模型,G(z)是樣本數據 z 的概率分布。
Wasserstein 距離越小,則證明模型訓練效果越好。
然而,WGAN 仍存在訓練困難、模型收斂較慢等問題。 為解決上述問題,Ishaan 等人提出了引入梯度懲罰的改進Wasserstein 生成對抗網絡(Wasserstein Generative Adversarial Network with Gradient Penalty,WGAN-GP),去除權重裁剪項并在判別模型的目標函數中加入梯度懲罰項,目標函數如式(7)所示[16]。 WGAN-GP 能夠穩定地以更快的速度趨于收斂,因此本文將選用WGAN-GP 進行模型的訓練,生成模糊測試用例。

本文的WGAN-GP 模型采用全連接神經網絡結構,由輸入層、隱藏層、輸出層組成,隱藏層的激活函數選取ReLU 函數,能夠有效避免在訓練過程中可能會出現的梯度消失現象,減少模型訓練和使用時的運算開銷。 模型目標函數的優化運用隨機梯度下降方式。
在經過充分訓練后,可以得到成熟可用的生成對抗網絡模型,該模型能夠生成可用于入侵檢測算法性能測試的模糊測試用例。 改進Wasserstein 生成對抗網絡的整體結構如圖3 所示。 而生成模型的輸入采用均勻的噪聲分布,判別模型利用通過汽車OBD 等接口采集的真實CAN 總線報文和生成模型生成的數據進行訓練。 訓練過程中,生成模型與判別模型相互博弈,調整參數,最終逐漸使生成模型生成的測試用例與正常汽車CAN 總線報文的格式一致。

圖3 改進Wasserstein 生成對抗網絡訓練流程與結構圖
基于WGAN-GP 的測試用例生成方法無需對CAN 總線協議格式進行具體分析,該方法可以在未知CAN 總線協議規范的基礎上進行,可以直接利用采集到的CAN 總線報文進行模型訓練,其適用性更強。 具體步驟如下:
(1)構造訓練數據集。生成對抗網絡模型的訓練過程要用到大量的數據,因此,為保證模型訓練的效果,在訓練前需要合理地構造訓練數據集。 本文使用 CAN 總線分析儀,從汽車的 OBD 等端口獲取真實的CAN 總線報文數據,所采集的報文數據均為十六進制的形式,為便于模型的訓練使用,對采集的報文數據進行了兩步預處理操作:去除報文數據集中存在重復的數據,并將報文數據由十六進制的形式轉換為十進制形式,形成用于訓練模型的數據集。
(2)構建生成模型。 本文利用 WGAN-GP 技術構建測試用例生成模型。 所構建的模型將滿足以下兩點條件:①能夠生成符合CAN 報文格式規范要求的測試用例,同時也要求不同測試用例的內容存有足夠的差異性,保證測試用例的測試覆蓋率足夠高;②保證構建生成模型并將模型訓練至成熟可用這一過程的時間成本要盡可能地低。
(3)輸入測試。利用生成對抗網絡模型生成測試用例,將生成的測試用例注入到入侵檢測算法中,觀察分類結果。
WGAN-GP 模型生成的 ID 0x1X4 的部分報文數據如表 2 所示。 通過WGAN-GP 模型同樣也生成了符合協議格式的報文。

表2 基于WGAN-GP 方法生成的部分 ID 0x1X4 報文
為了驗證本文所提出的改進汽車CAN 總線入侵檢測算法性能模糊測試方法的有效性,本文對基于KNN 和AdaBoost 的入侵檢測算法進行了性能測試,選取了 10 個不同 ID 的 CAN 總線報文集訓練入侵檢測算法的分類器。 使用汽車正常運行時實際采集的20 000 條CAN 總線報文作為正常報文數據集,并通過人工隨機變異的方式生成異常報文數據集。 對報文數據集按照報文 ID 進行分類。 在基于KNN 算法和AdaBoost 算法的分類器訓練過程中,訓練集中包括多個不同 ID 的 CAN 報文,每個ID 各有3 000 條報文,其中正常和異常的報文各占一半,訓練過程采用MATLAB 軟件中的工具箱進行,最終能夠分別得到基于兩種算法的檢測分類器。
利用基于字段權重的方法和基于WGAN-GP 的方法生成測試用例。 兩種測試用例生成方法使用的編程環境為 PyCharm,編譯器為 Python3.5。 基于WGAN-GP 的測試用例生成方法采用了深度學習框架TensorFlow 搭建生成對抗網絡。 使用生成的測試用例對基于KNN 和 AdaBoost 的入侵檢測算法進行性能測試,分別計算兩種入侵檢測算法對測試用例的檢測率,作為入侵檢測算法的檢測性能測試結果,具體如圖4 和圖 5 所示。 圖中橫坐標為不同報文的ID,縱坐標為入侵檢測算法對ID 不同的測試用例的檢測率。

圖4 基于字段權重生成的測試用例的檢測率

圖5 基于WGAN-GP 生成的測試用例的檢測率
由圖 4 和圖 5 可以看出,KNN 算法對基于字段權重生成的測試用例的平均檢測率為84.3%,對基于WGAN-GP 生成的測試用例的平均檢測率為78.3%。 AdaBoost 算法對基于字段權重生成的測試用例的平均檢測率為85.1%,對基于 WGAN-GP 生成的測試用例的平均檢測率為79.8%。
由測試結果分析可知:(1)相對于傳統的汽車CAN 總線入侵檢測算法性能模糊測試方法,本文提出的改進模糊測試方法所生成的測試用例通過KNN 算法和AdaBoost 算法檢測的成功率更高,證明了本文所提出的兩種方法所生成的模糊測試用例相較于傳統模糊測試方法所使用的測試用例的針對性更強,能夠更好地適應入侵檢測算法的實際應用場景。 (2)與基于字段權重方法生成的測試用例相比,利用改進Wasserstein 生成對抗網絡方法生成的測試用例通過 KNN 和 AdaBoost 算法檢測的概率相對較高,這表明該方法生成的測試用例在報文格式上與正常的CAN 總線報文更為相似,能夠更好地避開入侵檢測,可以更有效地挖掘汽車CAN 總線入侵檢測算法檢測能力存在的不足之處。 (3)從兩種入侵檢測算法對異常報文的平均檢測率結果來看,AdaBoost 算法的檢測水平要更優于 KNN 算法,因此若安全研究人員在選用汽車CAN 總線入侵檢測算法時相較于其他因素更為注重檢測性能,則可以優先考慮選用AdaBoost 算法,提高汽車CAN總線通信系統的安全防護水平。
本文提出了基于字段權重和基于WGAN-GP生成對抗網絡的模糊測試用例生成方法,解決了傳統模糊測試方法的測試結果因測試用例覆蓋率較低而導致可信度較差的問題;提出了一種改進汽車CAN 總線入侵檢測算法性能模糊測試方法,以基于機器學習的入侵檢測算法 KNN 和 AdaBoost 算法的分類器為對象進行方法的測試驗證。 測試結果表明AdaBoost 算法對異常報文的平均檢測率相對較高,本文提出的改進汽車CAN 總線入侵檢測算法性能模糊測試方法能夠生成針對性更強、冗余度更低的測試用例,可以被用于測試入侵檢測算法的性能。
本文的下一步研究工作是對實際汽車CAN 總線網絡中使用的入侵檢測算法進行模糊測試,進一步檢驗本文所提出的改進汽車CAN 總線入侵檢測算法性能模糊測試方法的性能。