陳 岑,呂 卓,郭志民,李暖暖
(國網(wǎng)河南省電力公司電力科學(xué)研究院,河南 鄭州 450052)
面向電力工控協(xié)議分析的脆弱性分析技術(shù)包含靜態(tài)和動態(tài)兩個方面[1]。靜態(tài)分析方面,在不運(yùn)行電力工控協(xié)議實(shí)現(xiàn)程序的前提下,分析軟件程序中可能存在的漏洞,主要研究軟件或固件逆向解析、中間語言分析、模擬執(zhí)行數(shù)據(jù)流分析和智能缺陷識別等工控協(xié)議的靜態(tài)漏洞挖掘及分析技術(shù)。此外,通過分析工控協(xié)議實(shí)現(xiàn)程序的詞法、語法、語義,檢測軟件中存在的弱安全函數(shù)調(diào)用和缺陷代碼片段,并以中間表示語言為基礎(chǔ),進(jìn)一步分析函數(shù)控制流圖和模塊函數(shù)調(diào)用圖,挖掘電力工控協(xié)議實(shí)現(xiàn)過程中的安全漏洞[2-5]。但是,靜態(tài)分析方法未考慮外界因素對待測系統(tǒng)安全性的影響,因此可以通過研究電力工控協(xié)議脆弱性動態(tài)分析進(jìn)一步挖掘電力工控協(xié)議漏洞。電力工控協(xié)議脆弱性動態(tài)分析技術(shù)是在待測系統(tǒng)實(shí)際運(yùn)行的前提下,通過觀察待測系統(tǒng)執(zhí)行過程中程序的運(yùn)行狀態(tài)、內(nèi)存使用狀況、寄存器的值以及協(xié)議數(shù)據(jù)處理情況等發(fā)現(xiàn)潛在問題。
針對電力工控協(xié)議實(shí)現(xiàn)的脆弱性,主要從兩個層面進(jìn)行動態(tài)分析。系統(tǒng)層面,研究面向工控協(xié)議數(shù)據(jù)的動態(tài)污點(diǎn)分析技術(shù),跟蹤工控協(xié)議數(shù)據(jù)流的傳播,針對特定的控制指令做出安全性斷言[6-7]。網(wǎng)絡(luò)層面,研究雙向Fuzzing測試技術(shù),構(gòu)造模糊測試指令集,同時監(jiān)視協(xié)議服務(wù)器端和客戶端的測試過程和返回結(jié)果,以驗(yàn)證待測系統(tǒng)協(xié)議實(shí)現(xiàn)的正確性[8-9]。通過分析系統(tǒng)和網(wǎng)絡(luò)兩個層面的測試結(jié)果,發(fā)現(xiàn)了工控協(xié)議存在的安全漏洞。研究步驟如圖1所示。
圖1 電力工控協(xié)議脆弱性動態(tài)分析技術(shù)研究步驟
污點(diǎn)數(shù)據(jù)指來自不可信數(shù)據(jù)源的數(shù)據(jù)或通過工控協(xié)議讀入的數(shù)據(jù)。利用動態(tài)污點(diǎn)分析技術(shù)挖掘工控協(xié)議漏洞的基本原理如下。工控系統(tǒng)運(yùn)行過程中,監(jiān)控可以改變程序流程的數(shù)據(jù),而這些數(shù)據(jù)往往來自可信的數(shù)據(jù)源。但是,如果攻擊利用協(xié)議漏洞修改了這些數(shù)據(jù)的值,便可以控制程序的運(yùn)行。比如,跳轉(zhuǎn)指令(Jmp)的目的地址參數(shù)通常來自程序本身(即來源于可信的數(shù)據(jù)源),而非外部輸入數(shù)據(jù)(如通過工控協(xié)議傳入的數(shù)據(jù))。然而,攻擊者可以利用工控協(xié)議實(shí)現(xiàn)過程中的漏洞,復(fù)寫跳轉(zhuǎn)指令的目的地址,從而實(shí)現(xiàn)控制工控系統(tǒng)運(yùn)行流程的目的。
為了檢測引起工控系統(tǒng)運(yùn)行流程異常的污點(diǎn)數(shù)據(jù),需經(jīng)過標(biāo)識污點(diǎn)數(shù)據(jù)、監(jiān)控污點(diǎn)數(shù)據(jù)傳播路徑、判斷污點(diǎn)數(shù)據(jù)是否會引起系統(tǒng)異常三個步驟。如圖2所示,基于動態(tài)污點(diǎn)分析的工控協(xié)議動態(tài)漏洞挖掘與分析方法可以劃分為三個功能組件。
圖2 基于動態(tài)污點(diǎn)分析的工控協(xié)議動態(tài)漏洞挖掘與分析方法功能組件
1.1.1 指令識別與污點(diǎn)數(shù)據(jù)標(biāo)識組件
指令識別與污點(diǎn)數(shù)據(jù)標(biāo)識組件將來源于不可信的數(shù)據(jù)標(biāo)識為污點(diǎn)數(shù)據(jù)。因?yàn)榫W(wǎng)絡(luò)數(shù)據(jù)中可能包含多種攻擊向量,所以來源于網(wǎng)絡(luò)的工控協(xié)議數(shù)據(jù)默認(rèn)為不可信數(shù)據(jù)。此外,可以通過配置,將來源于文件和標(biāo)準(zhǔn)輸入的數(shù)據(jù)認(rèn)為是不可信數(shù)據(jù)。這是由于部分系統(tǒng)支持工控協(xié)議數(shù)據(jù)錄播和回放,此時包含攻擊向量的數(shù)據(jù)可能被文本化后輸入工控系統(tǒng)。
電力工控指令具有不同安全等級屬性。例如,與“讀”指令相比,“寫”指令往往會造成物理世界的變化,因此“寫”指令具有更高的安全性屬性。針對高安全屬性的指令,需要設(shè)置更多的檢測點(diǎn),以便做出更加縝密的安全性斷言。此外,指令識別與污點(diǎn)數(shù)據(jù)標(biāo)識組件應(yīng)識別電力工控指令,標(biāo)識不同的安全屬性。
工控系統(tǒng)包括通用寄存器和堆棧在內(nèi)的存儲器,且每個字節(jié)對應(yīng)一個污點(diǎn)標(biāo)識結(jié)構(gòu)。如果不可信數(shù)據(jù)源的數(shù)據(jù)進(jìn)入系統(tǒng),存儲空間對應(yīng)的污點(diǎn)標(biāo)識結(jié)構(gòu)被置位,信息就會被污點(diǎn)數(shù)據(jù)傳播路徑跟蹤模塊和安全性斷言模塊使用。
1.1.2 污點(diǎn)數(shù)據(jù)傳播路徑跟蹤組件
污點(diǎn)數(shù)據(jù)傳播路徑跟蹤組件,通過跟蹤每條X86指令的運(yùn)行效果,決定污點(diǎn)數(shù)據(jù)的傳播路徑。
所有指令可以分為三類:
(1)數(shù)據(jù)移動指令,包括Load、Store、Move、Push、Pop等指令;
(2)數(shù)學(xué)運(yùn)算指令,包括Add、Sub、Xor等指令;(3)無影響指令,包括Nop、Jmp等指令。
對數(shù)據(jù)移動指令而言,當(dāng)且僅當(dāng)源地址的數(shù)據(jù)為污點(diǎn)數(shù)據(jù)時,目的地址的數(shù)據(jù)被標(biāo)識為污點(diǎn)數(shù)據(jù)。對數(shù)學(xué)運(yùn)算指令而言,如果任何一個源操作數(shù)為污點(diǎn)數(shù)據(jù),運(yùn)行結(jié)果就會被標(biāo)識為污點(diǎn)數(shù)據(jù)。對無影響指令而言,源操作數(shù)的污點(diǎn)屬性不會影響目的操作數(shù)的污點(diǎn)屬性。對數(shù)據(jù)移動指令和數(shù)學(xué)運(yùn)算指令而言,因?yàn)榱⒓磾?shù)往往來自程序內(nèi)部,所以立即數(shù)被認(rèn)為是非污點(diǎn)數(shù)據(jù)。
為了跟蹤數(shù)據(jù)移動指令和數(shù)學(xué)運(yùn)算指令,需要在每一條數(shù)據(jù)移動指令和數(shù)學(xué)運(yùn)算指令之前或之后增加記錄指令,以修改源操作數(shù)或目的操作數(shù)的污點(diǎn)屬性。
1.1.3 安全性斷言組件
安全性斷言組件可判斷污點(diǎn)數(shù)據(jù)被非法使用,即污點(diǎn)數(shù)據(jù)被敏感指令或函數(shù)作為參數(shù)使用。敏感CPU指令/函數(shù)主要包括四類。
(1)跳轉(zhuǎn)指令,安全性斷言模塊檢測污點(diǎn)數(shù)據(jù)是否被用作調(diào)轉(zhuǎn)指令的目的地址,如返回地址、函數(shù)指針地址、函數(shù)指針偏移量等,而許多攻擊者試圖通過復(fù)寫上述地址實(shí)現(xiàn)操縱工控系統(tǒng)運(yùn)行流程的目的。
(2)字符串格式化指令/函數(shù),安全性斷言模塊檢測污點(diǎn)數(shù)據(jù)是否被用作字符串格式化指令/函數(shù)的參數(shù)。例如,污點(diǎn)數(shù)據(jù)被用作C庫中printf函數(shù)的參數(shù),而攻擊者通常試圖利用惡意參數(shù)控制字符串格式化指令/函數(shù),并將特定的數(shù)據(jù)寫入特定的地址。
(3)系統(tǒng)調(diào)用,安全性斷言模塊檢測污點(diǎn)數(shù)據(jù)是否被用作關(guān)鍵系統(tǒng)調(diào)用的參數(shù)。例如,Linux系統(tǒng)的execve系統(tǒng)調(diào)用,而攻擊者可以通過復(fù)寫execve的參數(shù)實(shí)現(xiàn)加載指定程序的目的。
(4)應(yīng)用接口,通過配置可以使安全性斷言模塊檢測污點(diǎn)數(shù)據(jù)是否被用作特定應(yīng)用程序接口的參數(shù)。為了增強(qiáng)系統(tǒng)的功能,電力工控系統(tǒng)的上位機(jī)軟件往往會留有第三方開發(fā)接口,故此類應(yīng)用程序接口成為了攻擊者發(fā)動攻擊的首要目標(biāo)。
上述的每一類敏感CPU指令和函數(shù)都附有安全等級標(biāo)簽,且安全等級標(biāo)簽與電力工控指令的安全屬性相對應(yīng)。如果高安全屬性的電力工控指令被用作高安全等級標(biāo)簽的CPU指令和函數(shù)參數(shù),就會做出帶有警告的安全性斷言。
針對電力工控系統(tǒng)的Fuzzing測試框架,如圖3所示。首先,將電力工控協(xié)議抽象為協(xié)議結(jié)構(gòu)描述。其次,安全協(xié)議的結(jié)構(gòu)描述生成模糊測試數(shù)據(jù)集,且模糊測試數(shù)據(jù)集在測試引擎的調(diào)度下,通過測試代理向被測系統(tǒng)發(fā)送變異的協(xié)議數(shù)據(jù)包。最后,被測系統(tǒng)的狀態(tài)通過目標(biāo)監(jiān)控反饋給測試引擎,以指導(dǎo)后續(xù)的調(diào)度策略。
圖3 面向電力工控系統(tǒng)Fuzzing測試系統(tǒng)架構(gòu)圖
(1)協(xié)議結(jié)構(gòu)識別
協(xié)議結(jié)構(gòu)識別主要通過智能算法,結(jié)合生物信息學(xué)思想和電力工控協(xié)議的結(jié)構(gòu),提取數(shù)據(jù)包結(jié)構(gòu)中的常量,并標(biāo)注包的數(shù)據(jù)區(qū)域,生成協(xié)議結(jié)構(gòu)描述,從而逐步完善協(xié)議的語義結(jié)構(gòu)和數(shù)據(jù)包結(jié)構(gòu)。
協(xié)議結(jié)構(gòu)識別的過程主要包括以下幾點(diǎn)。首先采用類型匹配,即提取不同網(wǎng)絡(luò)流量數(shù)據(jù)文件(PCAP)中同類型的報(bào)文序列,并將其作為一個報(bào)文組。其次,多序列比對報(bào)文組合,并分離不變域和可變域,以初步劃分報(bào)文域。最后,識別報(bào)文區(qū)域,進(jìn)一步得到ANSII字符串域,從而生成較準(zhǔn)確的報(bào)文格式和測試數(shù)據(jù)。具體過程如圖4所示。
圖4 基于網(wǎng)絡(luò)報(bào)文進(jìn)行協(xié)議結(jié)構(gòu)識別
(2)測試數(shù)據(jù)生成
在理解和解釋目標(biāo)應(yīng)用輸入數(shù)據(jù)的協(xié)議規(guī)約和文件定義基礎(chǔ)上,創(chuàng)建一個描述協(xié)議規(guī)約如何工作的文法,并根據(jù)文法生成測試數(shù)據(jù)。然后,測試協(xié)議中最有可能引起異常的部分,且完成針對指令級的安全脆弱性測試。
一般情況下,除測試用例執(zhí)行外,F(xiàn)uzzing測試包括協(xié)議解析、測試用例生成、異常捕獲和定位三個步驟,如圖5所示。協(xié)議解析是通過公開資料或者分析網(wǎng)絡(luò)數(shù)據(jù)流量,理解待測協(xié)議的層次、包字段結(jié)構(gòu)、會話過程等信息,為后續(xù)測試用例的生成打下基礎(chǔ)。測試用例生成依據(jù)上階段整理的字段結(jié)構(gòu),采用變異的方式生成畸形測試用例,并發(fā)送給待測對象。異常捕獲和定位是通過多種探測手段發(fā)現(xiàn)由測試用例觸發(fā)的異常,且保存異常數(shù)據(jù)信息,為后續(xù)異常的定位和重現(xiàn)提供依據(jù)。
圖5 Fuzzing測試的通用流程
實(shí)踐中,采用基于文法的Fuzzing測試用例生成技術(shù),極大地降低了測試用例的數(shù)量,提高了測試效率。
(3)測試引擎
目前,電力工控系統(tǒng)中,PLC、RTU、DCS扮演的角色是協(xié)議Server端,而中心站充當(dāng)協(xié)議Client端。測試引擎用于調(diào)用程序,并可手動設(shè)置測試模式,測試Client端和Server端,或者同時雙向測試Client端和Server端。此外,它可以根據(jù)接收的數(shù)據(jù)包自動識別Client端和Server端發(fā)送的數(shù)據(jù)包,并自動調(diào)節(jié)調(diào)用的程序模塊,實(shí)現(xiàn)Client端和Server端的雙向自動化測試。
測試引擎根據(jù)被測系統(tǒng)的不同,自適應(yīng)選擇測試數(shù)據(jù)調(diào)度策略。測試數(shù)據(jù)調(diào)度策略包括順序調(diào)度、隨機(jī)調(diào)度、代碼覆蓋率優(yōu)先調(diào)度等。此外,針對電力工控協(xié)議的特點(diǎn),設(shè)計(jì)基于電力工控協(xié)議狀態(tài)機(jī)的調(diào)度算法,優(yōu)化雙向測試的效率。
(4)測試代理
測試代理用于調(diào)用程序監(jiān)控模塊、日志模塊、分析模塊等,并調(diào)整不同的被測系統(tǒng),記錄、分析測試過程中的日志。如果被測系統(tǒng)出現(xiàn)異常,則停止相應(yīng)的模塊調(diào)用。
(5)測試目標(biāo)監(jiān)控
測試目標(biāo)監(jiān)控用于分析錯誤現(xiàn)場保持、異常定位和漏洞類型。錯誤現(xiàn)場保持指如果系統(tǒng)出現(xiàn)異常,則立即停止測試,并保持異常情況的現(xiàn)場。異常定位是通過多種探測手段發(fā)現(xiàn)由測試用例觸發(fā)的異常,保存異常相關(guān)數(shù)據(jù)信息,為后續(xù)異常的定位和重現(xiàn)提供依據(jù)。漏洞類型是根據(jù)測試的異常情況和導(dǎo)致此異常的測試用例初步分析漏洞類型。
本文針對電力工控協(xié)議動態(tài)脆弱性分析的研究,可應(yīng)用于電力工控系統(tǒng)的常態(tài)脆弱性分析和攻擊滲透工作。此外,將系統(tǒng)的安全威脅分析與電力工控實(shí)際業(yè)務(wù)深度結(jié)合,深層次識別系統(tǒng)協(xié)議層面的安全威脅,對實(shí)現(xiàn)電力工控系統(tǒng)規(guī)約和指令級的安全防護(hù)具有重要的指導(dǎo)意義。