賀晉宏 馮楠 付強 付敏 羅義釗



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