賀晉宏 馮楠 付強 付敏 羅義釗
摘要:針對工控系統(tǒng)運行環(huán)境封閉帶來的傳統(tǒng)漏洞檢測無法導(dǎo)出系統(tǒng)組件進行分析的問題,根據(jù)工控網(wǎng)絡(luò)協(xié)議特征,結(jié)合測試用例變異因子,針對Modbus_TCP公開協(xié)議提出一種改進的電力工控系統(tǒng)漏洞測試挖掘方法。所提方法利用變異因子與工控協(xié)議特征依賴關(guān)系,改造協(xié)議測試用例。通過將測試用例的特征值和數(shù)據(jù)域的長度值因子及其數(shù)值的選擇進行合并,并做歸一化處理.進而簡化協(xié)議測試過程中變異因子的執(zhí)行次數(shù)。針對Modbus_TCP工控協(xié)議的模糊測試結(jié)果表明,改進后的Fuzzing測試表現(xiàn)出了更高的測試用例接收率和測試效率,測試樣例的平均接收率至少提高50。
關(guān)鍵詞:電力行業(yè);工業(yè)控制系統(tǒng);漏洞挖掘;Fuzzing測試;開源;異常分析和監(jiān)測;數(shù)據(jù)生成;變異率
中圖分類號:TM73 文獻標(biāo)志碼:A 文章編號:1000-1646(2024)01-0103-06
隨著自動化技術(shù)的高速發(fā)展,工業(yè)控制系統(tǒng)逐步與現(xiàn)代網(wǎng)絡(luò)互聯(lián),設(shè)備兼容需求的增大,數(shù)據(jù)共享也帶來了網(wǎng)絡(luò)漏洞的風(fēng)險。
電力作為國家的關(guān)鍵性基礎(chǔ)行業(yè),在發(fā)、變、輸、配電,以及綜合調(diào)度等多個環(huán)節(jié)均涉及設(shè)備應(yīng)用的工業(yè)控制系統(tǒng)。由于工業(yè)自動化設(shè)備集成度高、生產(chǎn)廠家眾多,開發(fā)主要考慮功能接口,而深入、安全、有效的健壯性測試和工控漏洞檢測尚有空缺,使得系統(tǒng)在接入公網(wǎng)后存有安全隱患。為了電網(wǎng)系統(tǒng)的安全有效運行,對電力工控系統(tǒng)的安全缺陷進行漏洞挖掘,使工控系統(tǒng)能及時得到完善,已成為當(dāng)下工控領(lǐng)域確保其安全運行的熱門研究方向。傳統(tǒng)漏洞挖掘技術(shù)主要有逆向分析和模糊測試兩種模式。由于工控系統(tǒng)環(huán)境封閉、系統(tǒng)組件導(dǎo)出困難,因此逆向分析難以奏效。近些年不少學(xué)者提出Fuzzing模糊化測試,從某種程度上推動了漏洞挖掘技術(shù)的發(fā)展。尤其是自2007年以來,較多開源和商業(yè)的Fuzzing工具被研制出來,并向產(chǎn)品化應(yīng)用轉(zhuǎn)化。然而,絕大多數(shù)Fuzzing技術(shù)與框架應(yīng)用于電力工控系統(tǒng)時仍存在較多問題,工控協(xié)議難以開展智能化漏洞挖掘。所以,為進一步提高電力工控系統(tǒng)所涉及的協(xié)議漏洞挖掘效率,本文利用Sulley開源測試軟件,將下位機層面工業(yè)控制器協(xié)議的漏洞挖掘作為研究重點。通過對軟件中的Fuzzing框架流程進行改進,提出了針對Modbus_TCP工控協(xié)議的漏洞挖掘策略。
1 基于Sulley的Fuzzing框架及改進
1.1 Fuzzing框架
Fuzzing是一款開源的通用網(wǎng)絡(luò)協(xié)議模糊測試框架,其在簡化數(shù)據(jù)表示、傳輸、測試用例執(zhí)行及目標(biāo)監(jiān)視方面均具有極強的優(yōu)越性,在計算機系統(tǒng)中,根據(jù)被分析數(shù)據(jù)的特點,模糊測試包括web頁面測試、協(xié)議測試、文件格式測試等,協(xié)議由5個基本模塊構(gòu)成,F(xiàn)uzzing模糊測試流程如下:
1)目標(biāo)識別。在識別目標(biāo)程序時,盡可能參考以往存在的安全漏洞以及研發(fā)者的研發(fā)習(xí)慣。
2)輸入識別。程序缺陷往往源自于對用戶輸入偏好的了解不足,這里輸入向量由文檔名稱、結(jié)構(gòu)和消息頭構(gòu)成。
3)模糊測試數(shù)據(jù)的產(chǎn)生。確定需要輸入的資料數(shù)據(jù)(輸入向量)。
4)模糊測試數(shù)據(jù)的解析。存在缺陷的數(shù)據(jù)輸入到被選定的目標(biāo)程序,如打開存有缺陷的文檔。
5)異常監(jiān)視。主要記錄引起崩潰的數(shù)據(jù)包以及目標(biāo)程序。
1.2 模糊測試器
Sulley作為一種模糊測試器,功能強大,不僅可以簡化數(shù)據(jù),還可以在程序崩潰時提供崩潰報告,其基本功能為:
1)數(shù)據(jù)生成。該模塊用于構(gòu)造測試用例所需的數(shù)據(jù)塊,包括:數(shù)據(jù)表示、塊定義、塊輔助函數(shù)以及積木等。
2)會話管理。該模塊的作用是將由數(shù)據(jù)生成的模塊產(chǎn)生一系列Request,連接成一個有向無環(huán)圖。在Fuzzing測試被啟動后,Sulley遍歷會話路徑,對每一節(jié)點Request依次做變異處理,以達到深度Fuzzing測試。
3)事后監(jiān)視。保存生成的變異數(shù)據(jù),監(jiān)視對應(yīng)結(jié)果變化。
基于Sulley進行Fuzzing流程,可實現(xiàn)數(shù)據(jù)生成、測試用例執(zhí)行及過程監(jiān)控自動化過程,但作為一種通用網(wǎng)絡(luò)協(xié)議模糊測試框架,將其直接應(yīng)用于電力工控系統(tǒng)協(xié)議測試時,存在協(xié)議格式解析代價大、測試用例相關(guān)性大、測試效率低等問題。
1.3 基于溯源的狀態(tài)數(shù)據(jù)改進分析
事實上,僅有成熟的Fuzzing框架不足以支持工控系統(tǒng)漏洞的發(fā)掘,而將Sulley植入到更強大的硬件系統(tǒng)才能更好地完成Fuzzing功能。因此,通過分析基于開源Sulley的Fuzzing框架在電力工控系統(tǒng)協(xié)議測試時存在的問題,本文將從兩個方面對基于Sulley的Fuzzing框架進行改進,具體如下:
1)傳統(tǒng)Fuzzing框架中,框架本身對數(shù)據(jù)包無追溯功能,這使得整個Fuzzing無法訪問指定的數(shù)據(jù)內(nèi)容,無法滿足數(shù)據(jù)回放。因此,將傳統(tǒng)一對一的受舉報收發(fā)方式修改為多對一的收發(fā)方式。
2)傳統(tǒng)Fuzzing框架不具備數(shù)據(jù)分析能力,因此需要在接收到上一數(shù)據(jù)包時,相應(yīng)地增加框架本身對協(xié)議中遇到的數(shù)據(jù)處理、失誤判斷、設(shè)備的存活響應(yīng)等狀態(tài)數(shù)據(jù)進行分析。
上述所提及改進部分將在Fuzzing流程執(zhí)行模塊中體現(xiàn),包括通信模塊的產(chǎn)生、流程設(shè)計和協(xié)議數(shù)據(jù)分析等。
2 基于改進Fuzzing框架的ModbusTCP協(xié)議漏洞挖掘策略
2.1 Modbus_TCP協(xié)議分析
Modbus_TCP的報文由報文頭、功能碼、數(shù)據(jù)三部分組成,如圖1所示。其中,MBAP報文頭按照標(biāo)識符內(nèi)容可分為事務(wù)、協(xié)議、長度及單元四個域。事務(wù)標(biāo)識符用于事務(wù)處理配對,保證Modbus_TCP通信數(shù)據(jù)包按序發(fā)送接收;協(xié)議標(biāo)識符用于系統(tǒng)內(nèi)的多路復(fù)用,默認(rèn)值為0;長度表示次字段域后數(shù)據(jù)包的字節(jié)數(shù);單元標(biāo)識符用于Modbus_TCP與Modbus串行鏈路,從設(shè)備的通信表示遠程從設(shè)備的識別碼。
Modbus_TCP協(xié)議按照報文類型分為3種:請求、響應(yīng)以及異常響應(yīng)。請求報文和響應(yīng)報文具有類似的協(xié)議數(shù)據(jù)單元(PDU),由功能碼和數(shù)據(jù)域構(gòu)成,數(shù)據(jù)域由功能碼決定,包括地址偏移、線圈數(shù)、寄存器數(shù)等信息。異常響應(yīng)報文的協(xié)議數(shù)據(jù)單元包含差錯碼和異常碼,其中請求功能碼的數(shù)值加上“0x80”即為差錯碼數(shù)值。
對Modbus_TCP協(xié)議進行模糊測試時,需要對其數(shù)據(jù)包進行析構(gòu),并基于Sulley框架生成相關(guān)測試數(shù)據(jù)。數(shù)據(jù)的定義是根據(jù)協(xié)議包格式中不同字段功能定義的,分別表達了該數(shù)據(jù)報文所包含的信息。基于Sulley對Modbus_TCP協(xié)議數(shù)據(jù)包的析構(gòu)方式,如表1所示。
根據(jù)上述拆分的數(shù)據(jù)包,指定、重整待發(fā)送內(nèi)容。例如對生成的Fuzzing數(shù)據(jù)進行分塊、劃分編號、對相關(guān)字段進行變換,然后發(fā)送指定編號范圍的數(shù)據(jù)塊。在發(fā)送數(shù)據(jù)之前,分析發(fā)送數(shù)據(jù)內(nèi)容格式,判斷其合法性。若判斷為合法,則根據(jù)待發(fā)送內(nèi)容,預(yù)生成期望的響應(yīng)內(nèi)容。將接收到的響應(yīng)數(shù)據(jù)與期望數(shù)據(jù)取值范圍進行對比,查看接收數(shù)據(jù)取值是否存在異常。若接收數(shù)據(jù)與預(yù)期數(shù)據(jù)功能碼或取值范圍不一致,則記錄相應(yīng)的異常報文信息,且根據(jù)記錄日志分析異常產(chǎn)生的原因、位置并進行顯示?;诟倪M的Fuzzing框架,Modbus_TCP數(shù)據(jù)分析過程流程圖,如圖2所示。
圖2中的數(shù)據(jù)分析部分具體包括:對事務(wù)處理標(biāo)識符、協(xié)議標(biāo)識符、長度字段、單元標(biāo)識符、功能碼合法性的分析。若數(shù)據(jù)正常,則要生成預(yù)期響應(yīng)數(shù)據(jù),生成標(biāo)準(zhǔn)如下:1)事務(wù)處理標(biāo)識符與發(fā)送端一致;2)協(xié)議標(biāo)識符設(shè)置為0;3)長度字段取值根據(jù)請求功能碼進行范圍設(shè)置;4)單元標(biāo)識符與發(fā)送端一致;5)依據(jù)功能碼對數(shù)據(jù)域格式范圍進行設(shè)置。
2.2 基于概率的變異因子取值選擇
工控協(xié)議的測試用例涉及協(xié)議特征值和數(shù)據(jù)域長度值,這兩個數(shù)值的生成與變異因子和變異因子數(shù)值的選擇相關(guān)。為減少選擇次數(shù),將數(shù)據(jù)域長度值的變異因子及其數(shù)值的選擇合并,進行歸一化處理。根據(jù)歸一化處理連續(xù)取值區(qū)間的特性,本文采用3層卷積神經(jīng)網(wǎng)絡(luò)計算變異因子的概率。具體過程如下:
1)假設(shè)首先輸入第i條報文Xi,i∈N,協(xié)議分析層根據(jù)卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)數(shù)值分布規(guī)律。
2)設(shè)概率用符號ρ表示,輸出卷積神經(jīng)網(wǎng)絡(luò)的概率關(guān)系矩陣,矩陣存儲257個數(shù)據(jù)值作為輸出值概率ρi,概率之和ρ0+ρ1+…+ρ256=1,概率模型矩陣為
2.3 關(guān)聯(lián)規(guī)則特征學(xué)習(xí)及測試用例策略生成
Modbus_TCP協(xié)議特征具有相互依賴的關(guān)系,長度域包含單元標(biāo)識、功能碼、數(shù)據(jù)域長度等信息。在模糊測試時,需構(gòu)造正常用例監(jiān)控被測對象狀態(tài)。首先從Modbus_TCP節(jié)點進行遍歷搜索,并采用協(xié)議特征生成變異因子,最后生成測試用例。其中,協(xié)議之間的依賴關(guān)系體現(xiàn)為字節(jié)關(guān)系。整個流程所涉及的關(guān)鍵點分析包括:葉子節(jié)點請求數(shù)據(jù)集的分析,可變字節(jié)間的強關(guān)聯(lián)規(guī)則挖掘,本文主要采用循環(huán)搜索和最小支持度的候選集和裁剪。
3 Modbus_TCP協(xié)議測試分析
基于上述提出的改進Fuzzing框架策略,對配電室電力工控系統(tǒng)中的PLC控制器進行Fuzzing測試,該控制器由HoneyWell廠商提供,實驗環(huán)境如圖3所示,型號為PLC S7-1500,本文使用S7-1500的CPU自帶端口部署Modbus_TCP協(xié)議。
通過與未改進的傳統(tǒng)網(wǎng)絡(luò)模糊測試器對比,在模糊測試過程中,共發(fā)現(xiàn)了3個協(xié)議漏洞,具體的請求響應(yīng)異常數(shù)據(jù)如表2所示。
Modbus協(xié)議中存在三種功能碼,已經(jīng)定義好的公共碼、自定義碼及預(yù)留碼。其中,公共碼對應(yīng)有開關(guān)量輸入和模擬量輸入。常見功能碼有:表示讀線圈的十進制功能碼為01,讀多個存儲器的十進制功能碼為03等,具體可參考Modbus_TCP公共協(xié)議說明書。此外,異常響應(yīng)是根據(jù)請求數(shù)據(jù)包內(nèi)容產(chǎn)生預(yù)期響應(yīng)數(shù)據(jù),并將兩者進行對比,當(dāng)出現(xiàn)異常時,即功能碼+0x80,表示為錯誤碼。表2中,前2個異常是寫單個線圈功能碼為0x05時,通過Modbus_TCP協(xié)議規(guī)約文檔,得到協(xié)議程序處理0x05功能碼的流程。若接收的輸出數(shù)據(jù)非0x00和0xFF00,則應(yīng)返回關(guān)于“讀保持寄存器”的異常碼0x03的響應(yīng),并顯示上位機請求數(shù)據(jù)出現(xiàn)異常。第3個異常情況是讀取線圈的0x01功能碼的過程,數(shù)據(jù)域顯示為空,對于該非合法數(shù)據(jù),Modbus_TCP協(xié)議規(guī)約應(yīng)返回異常功能碼為0x03,該用例可引發(fā)Modbus_TCP協(xié)議指針出現(xiàn)異常。由此可以看出,根據(jù)協(xié)議特征構(gòu)造的測試用例可檢測工控系統(tǒng)的協(xié)議漏洞,獲得系統(tǒng)異常信息。此外,實驗中寫寄存器功能碼還出現(xiàn)了拒絕服務(wù)風(fēng)險的警告,這說明該設(shè)備存在漏洞。
此外,實驗統(tǒng)計了5、10、15、20個樣本數(shù)據(jù)下改進Fuzzing和傳統(tǒng)Fuzzing測試方法生成的測試用例數(shù)量,如圖4所示。測試用例數(shù)是程序崩潰或樣本執(zhí)行完產(chǎn)生的樣例總數(shù)。
從圖4中可以看出,隨著樣本數(shù)量的增加,本文方法生成的測試數(shù)據(jù)明顯少于未改進算法生成的測試數(shù)據(jù)。另外,傳統(tǒng)Fuzzing生成的測試用例數(shù)會隨著樣本數(shù)量的增加而上升得更為平穩(wěn),這是由于傳統(tǒng)方法中用戶往往提供的樣本存在低質(zhì)量數(shù)據(jù),導(dǎo)致變異產(chǎn)生數(shù)據(jù)冗余,對輸入樣本進行了修剪。
改進Fuzzing和傳統(tǒng)Fuzzing測試方法在接收率方面的對比如圖5所示。由于本文所提的改進方法更依賴樣本數(shù)量,使得策略生成具有強關(guān)聯(lián)規(guī)則,因此產(chǎn)生的用例更具有針對性。結(jié)果顯示,實驗數(shù)據(jù)顯示的最大差距600s時約為60%,最小差距1200s時約為55%,平均接收率至少提高50%。
4 結(jié)束語
本文對Sulley開源Fuzzing框架原理及其模糊測試流程進行了分析,針對數(shù)據(jù)生成和測試方法進行拓展,提出了一種針對電力工控系統(tǒng)協(xié)議的Sulley改進Fuzzing框架,并設(shè)計了Modbus_TCP協(xié)議Fuzzing測試用例。該框架策略可用于電力工業(yè)控制系統(tǒng)中協(xié)議層的漏洞發(fā)掘,具有測試數(shù)據(jù)靈活、效率高等優(yōu)點,為協(xié)議Fuzzing的產(chǎn)品化應(yīng)用打下了基礎(chǔ)。
本文結(jié)合變異因子和協(xié)議特征構(gòu)造了工控網(wǎng)絡(luò)協(xié)議測試用例,提出了適合Modbus_TCP公開協(xié)議的模糊測試方法。根據(jù)變異因子和工控協(xié)議特征的依賴關(guān)系改進傳統(tǒng)Fuzzing測試,通過構(gòu)造協(xié)議測試用例,將協(xié)議測試用例的特征值和數(shù)據(jù)域長度值的變異因子及其數(shù)值的選擇合二為一,通過歸一化處理,簡化選擇操作,有效減少協(xié)議測試過程中變異因子的執(zhí)行次數(shù)。仿真實驗結(jié)果表明,對工控公有協(xié)議進行模糊測試,改進后Fuzzing測試顯示出更高的測試用例接收率:結(jié)合請求與響應(yīng)的協(xié)議特征關(guān)系,經(jīng)監(jiān)聽獲得了被測對象的3個異常信息,相比于未經(jīng)改進的Fuzzing測試檢測效率更高;而在測試樣例的接收率方面,平均接收率至少提高50%。下一步研究中可考慮采用多元聯(lián)動(即同時變換多個相關(guān)字段),引入數(shù)據(jù)行為和狀態(tài)機的方式來生成數(shù)據(jù)。一方面提高數(shù)據(jù)關(guān)聯(lián)性;另一方面可超越黑盒測試的限制,進一步提高數(shù)據(jù)的生成效率,從而解決隨機產(chǎn)生數(shù)據(jù)所帶來的狀態(tài)爆炸等問題。
(責(zé)任編輯:楊樹 英文審校:尹淑英)