工業控制系統(Industrial Control Systems,ICS)是工業生產的基礎,ICS的安全直接關系到經濟、社會發展的穩定和國家安全。與其他計算機系統不同,工業控制系統中存在著大量的私有非標準非公開協議[1],而通信協議作為工控設備間信息交互的基礎,其安全性是工控系統安全的重要組成部分,研究工控協議解析技術對提高工業控制系統安全性具有重要意義。
傳統的協議逆向分析方法需要耗費大量的時間和人力。目前,協議自動化逆向解析領域主要有兩種方法:一種是基于網絡報文序列分析的方法,另一種是基于程序執行軌跡的方法。基于網絡報文序列分析的方法對于文本協議處理效果比較好,但是缺乏針對性對協議的語義分析[2],尤其在面對工業控制環境中普遍存在的多層封裝的應用層協議時有些力不從心;而基于執行軌跡方法以動態二進制程序分析為基礎,包括Polyglot、AutoFormat、Tupni、Prospex等方法,這些方法要求樣本的覆蓋率,需要對程序反復地運行調試[3],但調試過程中對代碼的直接修改嚴重破壞了工控系統的穩定性,雖然這種方法解析結果更為準確,但并不適合工業控制系統要求高穩定、高實時的實際情況。
針對以上問題,本文提出了一種基于靜態二進制分析的工控協議解析方法,此方法以只讀的方式訪問二進制文件,既能獲取協議語義,又能保證不破壞工控系統的穩定性。分析的結果除提供協議信息以外,還可以在通信協議健壯性測試平臺中作為fuzzing測試模塊的輸入,解決普通的fuzzing系統在面對私有協議時無法有針對性地構造測試樣本的問題。
1
總體設計
本文將此工控協議解析方法作為工業控制系統健壯性測試平臺的一個子系統來加以介紹,協議健壯性測試平臺結構如圖1所示。
當今的ICS中越來越廣泛地使用了基于x86平臺的Windows操作系統,故本文中的方法在實現時主要針對Windows操作系統,反匯編引擎使用Hex-Rays公司的IDA Pro。IDA Pro是一款強大的靜態二進制分析工具,能夠提供功能豐富的IDC函數庫(IDA Pro的一種原生腳本語言)和軟件開發包(Software Development Kit,SDK)[4]。
協議解析子系統主要包括以下子模塊:文件掃描子模塊、協議提取子模塊和格式化處理子模塊。其中,協議解析模塊包括數據預處理階段、交叉引用分析階段、協議幀重構階段、語義提取階段;格式化處理模塊的輸出既可以作為測試平臺模糊測試模塊的輸入,為模糊測試樣本數據的構造提供參考,又可以作為測試平臺交互模塊的輸入,為用戶提供圖形化的結果展現。協議解析模塊的子模塊結構如圖2所示。
2
文件掃描模塊
掃描模塊的掃描目標是組態軟件等運行于通用計算機的工控軟件。通常,工控軟件體積較為龐大,由眾多功能模塊構成,但協議分析只需要其中的通信模塊,對ICS軟件的所有功能模塊執行協議解析算法不但會增加時間開銷,也會降低分析的準確度。掃描模塊的主要作用就是定位協議分析的對象,為協議分析模塊過濾掉與通信無關的操作。
文件掃描子模塊有兩種實現方式,一種是遠程掃描,掃描進程運行于測試平臺,通過遠程讀取工程師站或操作員站上的ICS軟件可執行文件并進行分析來實現過濾操作;另一種是以硬件插卡的方式通過USB接口在工控機本地執行掃描進程,并收集掃描結果反饋給測試平臺。這兩種實現方式的區別在于掃描進程的運行位置不同,遠程掃描對工控機沒有性能影響,但需要工控機打開文件訪問權限;本地掃描在掃描過程中可能會占用一定的CPU時間,但不需要額外的權限,其具體差異如表1所示。
以上兩種實現方法在算法本質上是沒有區別的,都是通過讀取動態鏈接庫(Dynami Link Library,DLL)文件的導入表和導入函數表來查找和預測DLL涉及到的操作。一般來講,涉及到TCP協議通信則需要導入WS2_32.dll中的send和recv函數,UDP協議則需要導入WS2_32.dll中的sendto和recvfrom函數[5],通過掃描模塊搜索到的某協議通信模塊的導入表以及導入函數如圖3所示。另外,通過掃描并過濾WriteFile等系統調用還可以找到ICS軟件自己封裝的一些發包和封包函數,通過這些函數還可以解析那些不基于TCP/IP的工控協議,如基于COM串口的工控協議,這是基于網絡流量的協議分析方法無法做到的。
3
協議提取模塊
協議解析模塊基于IDA Pro的IDC腳本和SDK來實現,以IDA腳本或IDA插件的形式提供協議解析服務。
3.1 數據預處理
ICS使用的軟件種類繁雜,在實現結構上也是千差萬別,有些廠商在設計軟件時并沒有嚴格地遵循模塊化設計的原則,軟件通信模塊沒有獨立地封裝在DLL中,而是與其他的功能代碼混雜在一起放入DLL,甚至分散在多個DLL中。數據預處理針對這種情況,通過讀取IDA Pro反匯編后的匯編代碼,對DLL中的函數進行標記處理,剔除與通信過程無關的函數。對于無法確定的函數,則選擇保留處理。
篩選算法同時使用兩種標準,第一種標準的依據是向上的代碼交叉引用,利用了函數調用的層次結構;第二種標準的思想源自于動態二進制逆向分析中常用的污點算法,經過修改后基于數據交叉引用實現,用于此處的靜態二進制分析場景[6]。
定義 二元組f(N,F)表示DLL中的一個函數,其中,N為函數名,F為標記,取值從UNKNOW、STAY、DELETE中枚舉。
篩選算法的基本流程如下:
(1)將目標DLL中的函數(包括DllMain、導出函數和內部函數)f加入到函數集合S中初始的標記F均為DELETE。
(2)使用第一種標準,以發送、接收數據包的函數地址為底層起點,使用IDC函數Rfirst和Rnext訪問其所有的引用函數fn(N,F),并將fn(N,F)的標記F置為STAY。
(3)迭代執行步驟(2),直至所有引用了起點函數的函數標記均被置為STAY。
(4)使用第二種標準,以步驟(2)中底層函數的參數中使用的內存緩沖區為污點源,逆序搜索被標記為污點的內存區域的訪問位置,如果有fn(N,F)中引用了污點內存區域,則將fn(N,F)的標記F置為STAY;如果代碼中存在以污點內存為左值的賦值操作,則將作為右值的內存區域也標記為污點內存,并記錄污點傳播的關系,系統為S中的每個fn(N,F)維護一個污點關系數據結構func_pollut,數據結構內容如表2所示;如果函數fn(N,F)沒有顯示地引用污點內存區域且其引用的其他內存位置無法直接判斷是否與污點內存有關,則將fn(N,F)的標記F置為UNKNOW。
(5)迭代執行步驟(4)。枚舉集合S中的函數,刪除所有標記F為DELETE的函數元素,此時的集合S則為待處理的目標集合。
3.2 交叉引用分析
從軟件逆向工程的角度來看,被不同的上層函數引用次數越多的底層函數通用性越好,封裝程度越高,在設計協議封裝和解析的軟件模塊中,則往往表現為在函數中處理了某一類通用性較強的幀結構,比如攜帶數據載荷的幀和心跳幀;而被不同的上層函數引用次數較少,甚至僅在某一處有過引用的函數,在協議封裝和解析的軟件模塊中往往完成一些連接建立、通信對端認證等控制類的操作,這一類幀屬于控制幀。
協議解析系統在交叉引用分析階段的主要工作是調用IDC函數獲取交叉引用信息并將信息歸類存儲在數據結構func_info中,某協議的函數依賴關系如圖4所示。通過對獲得的引用數據進行統計來推斷函數類型,并將推斷結果作為協議幀分類階段的輸入。結構func_info的內容如表2所示。
函數類型推斷使用的分界值與協議的復雜度有關,一般來說,與控制幀相關的函數與底層函數間的距離短,被調用的次數少,調用底層函數的次數多。經過實驗對比,具體的分界點取值為距底層函數的距離為2、被調用次數為1、調用底層函數次數為3~5時,系統具有較高準確度,系統在此處預留配置接口,用戶可以根據協議復雜度指定分界點取值。另外,通過IDA Pro自帶的WinGraph32應用程序系統可以獲得較為直觀的函數依賴圖形,依賴圖直接作為模塊的一項輸出結果呈現給用戶,用戶可以根據自己的判斷為系統指定重點分析的模塊或校正系統的推測結果,提高解析精準度。
3.3 協議幀重構
協議幀重構階段以前兩個階段中獲得的函數依賴關系和對函數類型的推定為參考,判斷函數代碼特征,對目標協議中存在的幀進行重構與分類。算法中涉及到的函數代碼特征主要包括距底層函數的距離是否為1、是否存在較多的幻數賦值操作、是否定長等。一個典型的控制幀組幀操作如圖5所示,可以看到明顯存在較多的幻數賦值操作。
幀重構的算法流程如下:
(1)將幀集合A初始化為空集,將函數集合S中標記F為STAY和UNKNOW的函數按照上一階段獲取的func_info結構的route_len域值升序排列,存儲到順序表D中。
(2)從順序表D中取出一個函數fn(N,F),如果fn(N,F)的函數距為1,檢查底層函數調用參數,并在本函數的代碼中檢索緩沖區長度參數的數據引用,如果緩沖區長度為定值,且該值與集合A中所有定長幀的幀長都不相同,則創建一個定長幀,幀長度為緩沖區長度,并將該幀加入到集合A中。
(3)如果步驟(2)中無法確定緩沖區長度為定值,則創建一個不定長幀,將該幀加入到集合A中。
(4)針對步驟(2)或步驟(3)中新加的幀,從底層函數調用地址處向上檢索代碼,直至函數頭或另一次底層函數調用,對所有的幻數賦值操作,直接將字段長度和幻數值記錄到新加的幀的對應結構中;對于變量賦值操作,記錄字段長度后字段值暫時以符號代替。統計幻數賦值數量H和變量賦值數量B,如果H>2B,則將此幀標記為控制幀,否則標記為數據幀。
(5)如果fn(N,F)的函數距不為1,檢索函數代碼,記錄所有的對污點內存區塊的幻數賦值操作,檢索完畢后訪問其func_pollut結構,通過污染源所在的函數編號在集合A中檢索對應的幀結構,并以幻數值替代幀結構中相應位置的符號。
(6)重復執行步驟(2),直到順序表D中的所有函數均被訪問。
算法執行完畢后,集合A中的幀即是經過初步構造后的協議幀,此時的幀結構記錄了初步字段結構和常量字段值。
3.4 語義提取
協議的語義信息主要包括分隔符、關鍵字、校驗域、長度域、指示域等,通過檢索處理協議幀的字段的二進制代碼是否存在相關的特征,可以提取到協議幀的語義信息[7]。例如:校驗域通常伴隨著大量的移位運算;關鍵字和分隔符會涉及到常量賦值操作,它們的主要區別在于關鍵字通常為一般數據,分隔符的值通常可以映射成ASCII表中的的特定字符;長度域也會涉及到常量賦值操作,但對于同一類幀結構來說,不同的調用點常量值一般不同。
對于一些無法提取比較顯著的特征的代碼段,系統選擇的策略是直接提取相關的二進制代碼,轉儲到文件后在數據結構中記錄該二進制代碼段與對應的協議字段的關聯關系。
3.5 格式化處理
以上過程處理得到的協議格式有可能存在冗余,同一種變長幀由于個別字段值不同而被記錄為兩種或多種幀,另外,幀之間的邏輯關系信息也不完整。在格式化處理模塊,系統通過比對集合中幀的已知語義來實現去冗余,不定長幀之間雖然長度和某些字段值不完全相同,但只要通過語義對比發現已知語義重復率超過閥值,就判定兩種幀應是同一種幀,對二者執行合并操作。
最后,系統通過對集合中的幀進行格式化處理,將協議信息以一種標準的格式輸出到結果文件。模糊測試模塊通過讀取文件獲取協議的幀結構和語義等信息,并針對協議結構構造測試用例。
4
實驗與分析
協議解析系統的主體部分、語義提取和格式化處理通過C語言實現,數據預處理和交叉引用分析通過IDC腳本實現,協議幀重構通過C語言調用IDA Pro SDK實現。
在實驗中,將獨立實現的系統應用于分析組態王軟件提供的某私有協議的驅動程序,成功獲取了部分協議格式,利用得到的協議格式可以實現與設備的簡單互通,證明了方法的正確性和有效性。經解析,該協議在連接建立時考慮了協議版本的識別,實驗分析得到的協議幀如圖6所示。
另外,在對某DCS系統進行滲透測試的項目中,本協議解析系統作為協議健壯性測試平臺的一個模塊,為模糊測試模塊提供了參考。模糊測試模塊以協議解析系統的輸出作為輸入,根據解析結果,針對此DCS系統的應用層協議生成了80組測試用例,在測試過程中多次造成了目標系統的通信異常,證明了該方法的實用性。模糊測試結果示例如圖7所示,圖中的曲線為系統心跳幀攜帶的正弦數據流,測試開始后可明顯觀測到心跳幀發生中斷和錯序。
5
結束語
本文介紹了一種通信協議逆向解析方法,該方法結合靜態二進制代碼分析工具,將動態污點算法思想應用于靜態二進制分析過程,實現了對工控協議的逆向解析并為模糊測試提供了參考,實驗結果證明了方法的有效性。該方法具有對被測系統影響小、針對性較強的特點,適用于工業控制環境,具有較強的實用價值。
-
通信協議
+關注
關注
28文章
911瀏覽量
40428 -
二進制
+關注
關注
2文章
796瀏覽量
41750
原文標題:【學術論文】基于靜態二進制分析的工控協議逆向解析
文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論