(海軍工程大學艦船綜合電力技術國防重點實驗室 武漢 430033)
隨著工業(yè)互聯(lián)網(wǎng)的不斷發(fā)展,以及信息化和工業(yè)化的不斷融合,傳統(tǒng)工業(yè)控制系統(tǒng)[1]與互聯(lián)網(wǎng)的聯(lián)系越來越緊密。原本只設計在內(nèi)網(wǎng)通信的工控系統(tǒng)逐漸接入互聯(lián)網(wǎng),這在增加工業(yè)控制系統(tǒng)的開放性、互連性和提高生產(chǎn)力的同時,也使得傳統(tǒng)工控系統(tǒng)將面臨著越來越多來自互聯(lián)網(wǎng)的安全威脅[2]。與常規(guī)軟件漏洞挖掘相比,使用模糊測試[3~5]來挖掘工控協(xié)議漏洞的困難在于工控協(xié)議是狀態(tài)機,并且數(shù)據(jù)包的正確性具有很強的約束性。如果構造的異常數(shù)據(jù)包與工控協(xié)議格式不一致,工控設備很容易將其丟棄,將沒有機會觸發(fā)漏洞。因此,模糊測試工具應該具有一些基本的智能,而遺傳算法(Genetic Algorithm,GA)[6]非常適合此任務,本文提出一種基于遺傳算法的Modbus TCP協(xié)議模糊測試方法。
編碼的目的是將問題空間的參數(shù)轉換成遺傳算法可以處理的形式,編碼的方法會對交叉等接下來幾個步驟產(chǎn)生直接的影響。因此,選擇合適的編碼方法會有效提高計算效率。常見的編碼方式包括:二進制編碼和格雷編碼等。二進制編碼是遺傳算法中經(jīng)常使用的編碼方式。它的缺點是不適用于多維、高精度連續(xù)函數(shù)優(yōu)化問題,還可能存在較大的漢明距離,也被稱為漢明懸崖,因此本文選擇格雷編碼方式。
遺傳算法在計算搜索最優(yōu)解時,不依賴外部的信息,只依靠構造的適應度函數(shù)。因此,如何構造合適的適應度函數(shù)是遺傳算法的核心問題。
傳統(tǒng)針對Modbus TCP協(xié)議[7]的模糊測試方法,未考慮根據(jù)可編程邏輯控制器(Programmable Logic Controllers,PLC)[8]接收到模糊測試用例后的響應報文,對模糊測試用例的生成過程進行及時調(diào)整,導致產(chǎn)生大量冗余數(shù)據(jù)[9~10]。
為了能根據(jù)模糊測試結果對遺傳算法的進化方向進行及時調(diào)整,使用返回的異常碼來指示測試用例的代碼覆蓋率,并為不同的異常碼[11]分別賦予不同的權重,如式(1)所示,異常碼為4時權重最大為w4,其次是異常碼2、異常碼3和異常碼1,分別賦予權重w2、w3和w1,若生成的測試用例被工控設備正常響應,即構造的測試用例屬于正常數(shù)據(jù)包,則該測試用例被賦予的分數(shù)最小為w0。
首先,創(chuàng)建一個測試用例隊列,用于存儲每次遺傳算法計算出的最佳測試用例,以及在接收該測試用例后被測PLC響應報文中的異常碼。初始隊列由上位機與PLC進行正常通信時捕獲的Modbus TCP協(xié)議數(shù)據(jù)包組成。
然后,在生成個體px后,將測試用例隊列中所有與個體px功能碼相同的個體組成一個集合Py。計算px與集合Py中個體pj每個字節(jié)的距離,再將每個字節(jié)的距離進行累加,計算出px與個體pj的距離,之后對計算出的距離加1,此處加1是為了避免距離為0。再取倒數(shù),并乘以根據(jù)py的異常碼計算得出的權重wj,如式(2)所示。
之后,再將px與集合Py中每個個體的距離相加,并除以集合Py的數(shù)量n,得出個體px和初始種群的平均距離,如式(3)所示。
最后,將最終計算出的平均距離作為該個體的適應度值,如式(4)所示。
在完成上一步個體適應度值的計算后,為了篩選出具有優(yōu)良基因的個體繼續(xù)生存繁衍,本文的使用“輪盤賭選擇算子”從父代種群中挑選出雙親。
輪盤賭算子的計算步驟如下:
步驟1):如式(5)所示,依據(jù)公式計算出個體的適應度值,計算出種群中所有個體被遺傳的概率Pro(msgi)。
步驟2):如式(6)所示,計算出種群中所有個體的累計概率Qi。
步驟3:之后在[0,1]區(qū)間內(nèi)生成隨機值rand。若r<Q1,則選擇個體1,否則選擇滿足式(7)的個體k,將挑選出來的個體進入子代種群進行下一步操作。
步驟4):不斷重復步驟3,得到的個體形成一個新種群。
適用于二進制編碼個體的交叉算子有單點交叉和兩點交叉等。本文選擇采用單點交叉,即在兩個父代個體編碼后的二進制基因序列上隨機選擇一個位點,將這個交叉位點后部的兩個父代基因序列進行交換,以產(chǎn)生新的下一代個體。
變異本文采取較為簡單的實現(xiàn)方式。由于編碼后的基因序列都是二進制數(shù)據(jù)串,因此本文采用基本位變異算子。變異算法如算法1所示,首先獲取個體的編碼后的基因序列的長度length。然后再結合變異概率Pm計算出需要變異的基因序列的數(shù)目count。再在0~length-1之間生成一個隨即數(shù)k,用以指定將要進行變異的基因序列的位置,對第k位基因進行取反,變異過程循環(huán)執(zhí)行count次。最后輸出變異后的個體基因序列Msg。
為了保留適應度值高的個體,并剔除適應度值低的個體,本文使用自適應遺傳算法[12]計算交叉概率Pc和變異概率Pm,如式(8)所示。
其中fmax表示種群中所有個體適應度值的最大值;favg表示種群中所有個體適應度值的平均值;f表示兩個將要交叉?zhèn)€體的適應度值中的較大值;f'表示將要變異的個體的適應度值。
如圖1所示,本文提出的Modbus TCP協(xié)議模糊測試系統(tǒng)是在模糊測試工具Peach的基礎上進行二次開發(fā)而成。模糊測試用例生成模塊在生成測試用例后,將測試用例傳入Peach Fuzzer的格式解析模塊,通過狀態(tài)控制模塊控制交互發(fā)布模塊將生成的模糊測試用例輸入被測PLC,同時代理監(jiān)控模塊檢測被測PLC是否出現(xiàn)崩潰,若出現(xiàn)異常則通過日志記錄模塊進行記錄,并終止測試,若未出現(xiàn)異常,則通過交互發(fā)布模塊獲取PLC響應報文,并利用狀態(tài)控制模塊調(diào)用格式解析模塊對響應報文進行解析,最后將解析結果反饋給公有協(xié)議模糊測試用例生成模塊,用以指導下一個模糊測試用例的生成。
圖1 Modbus TCP協(xié)議模糊測試系統(tǒng)架構圖
在進行Modbus TCP協(xié)議模糊測試實驗時,本文對兩款支持Modbus TCP協(xié)議的國內(nèi)外廠商的PLC進行了模糊測試,實驗結果如表1所示。在對信捷XG1-16T4 PLC進行模糊測試實驗時發(fā)現(xiàn)了一個0-Day漏洞,該漏洞在提交國家信息安全漏洞共享平臺(China National Vulnerability Database,CNVD)后,獲得一個原創(chuàng)CNVD漏洞編號;在對施耐德M241 PLC進行模糊測試實驗時,成功挖掘到一個拒絕服務漏洞,下面將分別介紹兩次實驗。
表1 公有協(xié)議模糊測試實驗結果
1)實驗1
實驗1中的被測工控設備是信捷XG1-16T4 PLC,這款PLC是無錫信捷電氣股份有限公司的一款中型PLC,支持Ethernet通訊、X-NET現(xiàn)場總線、MODBUS通訊等功能。在對信捷XG1-16T4 PLC進行模糊測試時,發(fā)現(xiàn)了一個原創(chuàng)CNVD漏洞,漏洞編號CNVD-2020-04095。攻擊者可利用該漏洞向502端口發(fā)送過長的數(shù)據(jù)包,會導致502端口拒絕服務,須斷電重啟才能恢復PLC正常工作。
圖2 信捷正常運行與拒絕服務
如圖2所示,初始時信捷XG1-16T4 PLC正常運行,有PWR和RUN指示燈亮綠燈。在經(jīng)模糊測試觸發(fā)異常后,信捷XG1-16T4 PLC拒絕服務,此時PWR指示燈亮綠燈,ERR指示燈亮紅燈。拒絕服務后需要將其斷電重啟才能恢復工作。圖3為信捷PLC拒絕服務后通過Peach的監(jiān)控窗口監(jiān)控到的信息。因為信捷該型號PLC的固件被加密,所以無法通過逆向分析固件準確地定位漏洞的位置。
2)實驗2
實驗2中的被測工控設備是施耐德M241,該款PLC支持以太網(wǎng)、CANOpen和串行通訊。在使用本文提出方法對施耐德M241進行實驗時,模糊測試大約2h,觸發(fā)異常,該異常導致施耐德M241拒絕服務,須斷電重啟才能恢復工作。具體原因還在分析中。
圖3 觸發(fā)崩潰
為驗證本文提出的公有協(xié)議模糊測試方法具有更高的模糊測試效率,本文在上位機上部署Peach[13]與 Sulley[14],對相同的工控設備進行模糊測試,并對三種方法的模糊測試結果進行比對。
表2 模糊測試工具對比結果
圖4 測試用例接收率
根據(jù)表2中結果可知,與已有模糊測試工具Peach和Sulley相比,在使用本文提出方法進行實驗時,雖然生成的模糊測試用例數(shù)比Peach和Sulley少,且模糊測試時間比Peach和Sulley短,但是卻成功觸發(fā)兩個拒絕服務漏洞。將本文所提出方法、Peach和Sulley三者進行生成測試用例接收率進行比較,如圖4所示,可見截取的前一個小時里本文所提出方法的測試用例接受收率遠高于Peach和Sulley的測試用例接受收率。因此,通過表2和圖4的結果可知,本文提出方法能有效提高針對Modbus TCP協(xié)議的模糊測試效率。
本文提出了基于遺傳算法的Modbus TCP協(xié)議模糊測試方法,在使用遺傳算法生成Modbus TCP協(xié)議的模糊測試用例時,建立了一個種子隊列用于存儲遺傳算法生成的測試用例和測試用例的異常碼,之后從相似度和異常碼兩個方面來計算生成個體的適應度值,以調(diào)整生成測試用例的方向,最后本文將實驗結果與已有同類工具從挖掘到的漏洞數(shù)量、所需的時間、發(fā)送模糊測試用例數(shù)和測試用例接收率四個方面進行比較,比較結果驗證了本文所提方法的有效性。