王 寧,王振邦,田石剛,李冶天,孫 迪,李 兵
(國網(wǎng)黑龍江省電力有限公司電力調(diào)度控制中心,黑龍江 哈爾濱 150090)
電力工控系統(tǒng),特指應(yīng)用于電力生產(chǎn)和供應(yīng)過程的工業(yè)控制系統(tǒng),如調(diào)度側(cè)的智能電網(wǎng)調(diào)度技術(shù)支持系統(tǒng)、變電站側(cè)的綜合自動(dòng)化系統(tǒng)以及發(fā)電廠側(cè)的分散控制系統(tǒng)等,是關(guān)系到電網(wǎng)安全穩(wěn)定運(yùn)行的重要領(lǐng)域。電力工控系統(tǒng)一般不公開其內(nèi)部函數(shù)邏輯調(diào)用關(guān)系及私有化通信協(xié)議,具有閉源特性。同時(shí),由于缺少攻擊數(shù)據(jù)樣本,難以實(shí)現(xiàn)殺毒引擎的構(gòu)建,導(dǎo)致傳統(tǒng)基于特征庫匹配的網(wǎng)絡(luò)安全技術(shù)不適用于電力工控系統(tǒng)。
數(shù)據(jù)采集與監(jiān)視控制系統(tǒng)(Supervisory Control And Data Acquisition,SCADA)作為下發(fā)遙控指令的核心組件,是攻擊者的主要目標(biāo)。2010年,受“震網(wǎng)”病毒影響的系統(tǒng)包括SCADA 和可編程邏輯控制器(Programmable Logic Controller,PLC)[1]。文獻(xiàn)[2]和文獻(xiàn)[3]介紹了SCADA 和能量管理系統(tǒng)已有的具體漏洞。文獻(xiàn)[4]演示了一個(gè)攻擊示例,攻擊者可以通過修改GOOSE 數(shù)據(jù)包來實(shí)現(xiàn)跳閘操作,觸發(fā)一系列級聯(lián)事件,從而導(dǎo)致災(zāi)難性的電網(wǎng)事故。文獻(xiàn)[5] 針對SCADA 系統(tǒng)的入侵防護(hù),提出了基于異常行為檢測的SCADA 系統(tǒng)防護(hù)方法。Morris 等人[6]對遠(yuǎn)程終端單元(Remote Terminal Unit,RTU)攻擊類型進(jìn)行分析,提取了通信協(xié)議的異常行為檢測特征。文獻(xiàn)[7]面對電力系統(tǒng)自動(dòng)化領(lǐng)域唯一的全球通用標(biāo)準(zhǔn)——IEC61850 協(xié)議,開展了分析研究,并給出了IEC61850 靜態(tài)及動(dòng)態(tài)特征檢測方法。
在安全防護(hù)異常檢測方面,文獻(xiàn)[8]研究了工控系統(tǒng)異常行為發(fā)現(xiàn)方法。文獻(xiàn)[9]給出了一種面向工業(yè)控制網(wǎng)絡(luò)的異常流量檢測方法,該方法采用自回歸移動(dòng)平均模型(Autoregressive Integrated Moving Average Model,ARIMA)對正常流量進(jìn)行建模分析,并以此模型對網(wǎng)絡(luò)正常流量進(jìn)行預(yù)測,從而檢測異常流量。密西西比州立大學(xué)針對電力系統(tǒng),提出了基于K-means 聚類的無監(jiān)督學(xué)習(xí)異常檢測方法[10]。羅耀峰等人在模糊聚類算法中引入了異常檢測方法,面向差異化多層網(wǎng)絡(luò),研究了深度異常檢測方法[11]。
考慮工控系統(tǒng)網(wǎng)絡(luò)的復(fù)雜性,單一的異常檢測方法難以滿足實(shí)際環(huán)境下的檢測精度要求。對此,有研究者為提高工控系統(tǒng)異常行為檢測能力,嘗試將多種檢測方法進(jìn)行復(fù)合或加權(quán)組合。Aburomman 等人[12]提出了一種SVM-KNN-PSO組合方法,利用粒子群優(yōu)化算法(Particle Swarm Optimization,PSO)進(jìn)行權(quán)重優(yōu)化,并結(jié)合支持向量機(jī)(Support Vector Machine,SVM)和K 近鄰法(K-Nearest Neighbor,KNN)的分類優(yōu)勢,用以開展系統(tǒng)異常檢測,結(jié)果表明,與單一方法相比,組合方法的檢測精度有一定程度的提高。
本文基于國家電網(wǎng)公司建立的“安全分區(qū)、網(wǎng)絡(luò)專用、橫向隔離、縱向認(rèn)證”安全防護(hù)體系,重點(diǎn)考慮工控系統(tǒng)底層數(shù)據(jù)及運(yùn)行機(jī)制的封閉性(閉源性)特點(diǎn),利用逆向分析技術(shù),從系統(tǒng)底層運(yùn)行狀態(tài)學(xué)習(xí)方法、安全防御模型構(gòu)建等方面,設(shè)計(jì)構(gòu)造不依賴特征庫比對的工控系統(tǒng)安全防御體系架構(gòu),解決未知惡意行為和惡意代碼潛伏問題,為閉源電力工控系統(tǒng)安全防御問題提供技術(shù)解決路線。
電力工控系統(tǒng)是一個(gè)有機(jī)整體,分析其安全防御模型,首先需要分析電力工控系統(tǒng)各業(yè)務(wù)場景及應(yīng)用模式。充分考慮在系統(tǒng)封閉、代碼非開源、協(xié)議私有化等閉源條件下,進(jìn)行安全防護(hù)的技術(shù)難點(diǎn)。最終確定適用于電力工控系統(tǒng)安全防御業(yè)務(wù)的應(yīng)用模式。
本文所設(shè)計(jì)的安全防御架構(gòu)如圖1所示。從站端監(jiān)測、主站管控、云端分析3 個(gè)方面增強(qiáng)安全防御體系。其中,站端監(jiān)測是通過數(shù)據(jù)采集模塊,采集工控系統(tǒng)的底層數(shù)據(jù),感知閉源系統(tǒng)在多個(gè)階段產(chǎn)生的數(shù)據(jù)信息,解析系統(tǒng)底層運(yùn)行機(jī)理。主站管控是通過部署在網(wǎng)絡(luò)安全管理平臺(tái)的防御模型,對站端監(jiān)測到的數(shù)據(jù)進(jìn)行異常判斷,并依據(jù)該判斷結(jié)果進(jìn)行告警及威脅處置。云端分析是利用調(diào)控云平臺(tái)中的模型訓(xùn)練模塊,增加算力并計(jì)算異常判斷依據(jù),訓(xùn)練完畢的結(jié)果反向下發(fā)至主站防御模型中。
如圖1所示,底層數(shù)據(jù)提取模塊部署在廠站閉源電力工控系統(tǒng)中,實(shí)現(xiàn)系統(tǒng)程序進(jìn)程中各模塊、函數(shù)之間調(diào)用狀態(tài)的實(shí)時(shí)采集,實(shí)現(xiàn)函數(shù)調(diào)用關(guān)系與關(guān)鍵參數(shù)提取。采集的底層數(shù)據(jù)通過Agent、網(wǎng)絡(luò)安全監(jiān)測裝置,發(fā)送給網(wǎng)絡(luò)安全管理平臺(tái)防御模型。
主站安全防御模型采用機(jī)器學(xué)習(xí)的方法對數(shù)據(jù)進(jìn)行智能分析,生成模型判斷依據(jù)的參數(shù),形成安全穩(wěn)定運(yùn)行基線,實(shí)現(xiàn)對廠站終端底層信息的實(shí)時(shí)監(jiān)測和告警。
模型訓(xùn)練模塊部署在調(diào)控云平臺(tái)中,目的是為構(gòu)建防御模型提供充足的計(jì)算資源,并實(shí)時(shí)分析、驗(yàn)證,不斷完善防御模型。完成階段性學(xué)習(xí)后,防御模型向廠站下發(fā)指令,實(shí)現(xiàn)對終端底層信息的實(shí)時(shí)監(jiān)測和告警等處置方法。
系統(tǒng)底層數(shù)據(jù)提取模塊主要用于提取閉源電力工控系統(tǒng)底層運(yùn)行數(shù)據(jù),主要涉及內(nèi)部函數(shù)調(diào)用邏輯及參數(shù)逆向技術(shù)。系統(tǒng)內(nèi)部函數(shù)調(diào)用邏輯及參數(shù)逆向是用來分析閉源軟件的技術(shù),目的是獲取一些難以獲得的軟件信息、算法、被隱藏的許可密碼或是文件采用的加密方式等有用信息。具體包含兩部分,即軟件關(guān)鍵模塊定位技術(shù)和函數(shù)執(zhí)行軌跡特征提取技術(shù)。軟件關(guān)鍵模塊的獲取可以使用動(dòng)態(tài)插樁的方法,定位關(guān)鍵模塊可有效減少冗余的函數(shù)執(zhí)行軌跡,更利于分析計(jì)算。函數(shù)執(zhí)行軌跡特征提取則針對關(guān)鍵模塊實(shí)施動(dòng)態(tài)鏈接庫劫持,記錄關(guān)鍵模塊函數(shù)調(diào)用信息。
可執(zhí)行程序在完成其功能的過程中,需要執(zhí)行多個(gè)相應(yīng)的程序代碼,并且執(zhí)行過程具有一定順序,這種順序即程序執(zhí)行軌跡。依據(jù)不同的分析粒度,軟件執(zhí)行軌跡主要分為模塊級執(zhí)行軌跡和函數(shù)級執(zhí)行軌跡(如圖2、圖3所示)。
本文采用函數(shù)級執(zhí)行軌跡覆蓋度的方法進(jìn)行關(guān)鍵模塊定位。主要流程為:(1)確定所要分析的應(yīng)用程序具體功能;(2)采集該功能在正常運(yùn)行過程中的函數(shù)執(zhí)行軌跡,采集執(zhí)行過程中各個(gè)函數(shù)的調(diào)用次數(shù)和函數(shù)所屬模塊;(3)按模塊逐一統(tǒng)計(jì)函數(shù)調(diào)用總量次數(shù),得到各個(gè)模塊的函數(shù)執(zhí)行軌跡覆蓋度;(4)根據(jù)覆蓋度數(shù)值,從高到低選擇部分模塊,作為關(guān)鍵模塊。
函數(shù)執(zhí)行軌跡特征提取是關(guān)鍵模塊定位的前提條件。其過程主要包含函數(shù)棧幀分析和動(dòng)態(tài)連接庫劫持兩個(gè)部分。
(1)函數(shù)棧幀分析。首先,需要對函數(shù)棧幀進(jìn)行初步分析,確定相關(guān)函數(shù)參數(shù)。之后根據(jù)參數(shù)在相應(yīng)函數(shù)中傳遞過程、計(jì)算量等信息,初步判斷各參數(shù)在相應(yīng)函數(shù)中的作用,進(jìn)而判斷相應(yīng)函數(shù)的具體類型。其次,需要進(jìn)行函數(shù)棧幀監(jiān)控(可以使用具體的插樁工具開展)。通過監(jiān)控,可以確定所分配的函數(shù)參數(shù)和變量大小,也可以通過識(shí)別push ebp/mov ebp, esp 的使用情況,確定幀指針的使用情況以及棧幀參數(shù)和變量的內(nèi)存引用情況。用WinCC50.dll 舉例說明,該DLL文件中的函數(shù)(CCGetWinCCIniPath)棧幀如圖4所示。從圖4中可知,黑色框線內(nèi)的函數(shù)中包含arg_0 和arg_4 兩個(gè)參數(shù),對應(yīng)的是ebp+8h 和ebp+0Ch 位置,其中,arg_0 上面的相關(guān)參數(shù)為相應(yīng)的局部變量。
(2)動(dòng)態(tài)連接庫劫持。關(guān)鍵模塊定位之后,為了獲取模塊相關(guān)函數(shù)調(diào)用過程,需要采用動(dòng)態(tài)鏈接庫劫持技術(shù)(又稱為動(dòng)態(tài)鏈接庫Hooking)。動(dòng)態(tài)鏈接庫劫持技術(shù)可以有選擇性地劫持動(dòng)態(tài)鏈接庫內(nèi)用戶自定義的函數(shù)。其過程如圖5所示,在軟件和目標(biāo)DLL 文件之間,設(shè)置同名的偽裝DLL 文件。每當(dāng)程序調(diào)用關(guān)鍵DLL 文件中的具體函數(shù)時(shí),會(huì)被偽裝的同名DLL 文件劫持,由于該偽裝DLL 文件是被修改過的,因此可以將程序調(diào)用的具體函數(shù)記錄下來,進(jìn)而截獲相關(guān)函數(shù)調(diào)用過程。
安全防御模型構(gòu)建過程可分為數(shù)據(jù)集構(gòu)建和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)訓(xùn)練過程。原始數(shù)據(jù)主要從廠站工控系統(tǒng)或裝置中采集提取,并對每條數(shù)據(jù)標(biāo)記時(shí)間戳,對采集到的原始數(shù)據(jù)進(jìn)行數(shù)據(jù)處理,生成機(jī)器學(xué)習(xí)可識(shí)別的訓(xùn)練數(shù)據(jù)。訓(xùn)練數(shù)據(jù)應(yīng)包含正常樣例和異常樣例,但是異常樣例難以獲取,因此需要采用主動(dòng)觸發(fā)設(shè)備異常的方式生成數(shù)據(jù)。數(shù)據(jù)收集完成后采用隨機(jī)抽樣的方法將訓(xùn)練數(shù)據(jù)劃分為訓(xùn)練集和測試集,訓(xùn)練集用于調(diào)整模型,測試集用于測試模型效果。
主站安全防御模型可采用CNN 構(gòu)建。CNN主要包含網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)和反向傳播算法設(shè)計(jì)兩個(gè)部分。
CNN 主要由卷積層、池化層和全連接層構(gòu)成,分別設(shè)計(jì)各層,然后將各層疊加,即可構(gòu)建完整的CNN。
(1)卷積層。卷積層是CNN 的核心層,大部分計(jì)算工作是在該層完成。在卷積層,處理后的訓(xùn)練數(shù)據(jù)經(jīng)過相關(guān)卷積計(jì)算,利用激活函數(shù)將輸入數(shù)據(jù)映射到輸出端,即可得到相應(yīng)的輸出特征,多個(gè)輸出特征再次進(jìn)行卷積,即可得到多個(gè)特征的組合值,定義xli為第l卷積層的第i個(gè)特征輸出值:
其中,nf()為激活函數(shù),是在CNN 神經(jīng)元上運(yùn)行的函數(shù),負(fù)責(zé)將神經(jīng)元的輸入映射到輸出端。為第l層第i個(gè)輸出的激活值,其是將上層特征輸出值與核矩陣的卷積結(jié)果進(jìn)行累加,再疊加特征偏置量bil得到的,如式(2)所示:
(2)池化層。在連續(xù)的卷積層之間,需插入一個(gè)池化層,以有效控制過擬合情況的發(fā)生,并且可以降低數(shù)據(jù)空間的大小,減少網(wǎng)絡(luò)參數(shù)數(shù)量,降低計(jì)算資源消耗,定義ui′l為池化層第l層第i個(gè)輸出的激活值,如式(3)所示:
其中,down()定義為池化函數(shù),將上層特征值輸出值劃分為多個(gè)n×n塊,取該n×n塊中的平均特征值作為輸出,即有效降低了數(shù)據(jù)空間維度。β為權(quán)重系數(shù),bil為特征偏置量。
(3)全連接層。全連接層在CNN 中起著“分類器”的作用,將學(xué)習(xí)到的所有特征值映射到“分類器”上。該全連接層的權(quán)重w是一個(gè)巨大的矩陣,除特定塊外,其他部分都是零。在該層,二維特征值將會(huì)轉(zhuǎn)化為一維特征值并作為該層的輸入。對輸入進(jìn)行加權(quán)求和,經(jīng)過激活后得到第l卷積層的輸出為:
其中,wl為權(quán)重系數(shù),bl為特征偏置量。
對于“分類器”的多分類問題,可將輸出期望與實(shí)際輸出做負(fù)對數(shù)似然,得到訓(xùn)練總誤差:
其中,tn為樣本n的真值,yn為網(wǎng)絡(luò)輸出值。
反向傳播算法主要用于計(jì)算梯度下降,是訓(xùn)練神經(jīng)網(wǎng)絡(luò)的常用算法。其思想是:訓(xùn)練數(shù)據(jù)經(jīng)神經(jīng)網(wǎng)絡(luò)輸出側(cè)輸出結(jié)果,是前向傳播過程,計(jì)算前向傳播輸出結(jié)果與實(shí)際結(jié)果誤差,并將該誤差從輸出側(cè)向輸入側(cè)反向傳播,在反向傳播過程中,根據(jù)誤差,調(diào)整各參數(shù)值,不斷迭代直至收斂。
定義δl為卷積層l的靈敏度,其表示總誤差E隨第l層激活值ul變化的程度:
卷積層靈敏度大于池化層靈敏度,因此為計(jì)算第l層的靈敏度,需要利用上采樣方法,對l+1 池化層靈敏度進(jìn)行提升,以達(dá)到和第l卷積層靈敏度同量級的程度,通過鏈?zhǔn)角髮?dǎo)可得第l層第j個(gè)通道靈敏度δlj為:
其中,u p(x)=x?ln×n,up()表示一個(gè)上采樣操作,將每個(gè)特征值在二維方向上進(jìn)行n次復(fù)制n×n,即可提升l+1 層靈敏度。
總誤差E對偏移量的偏導(dǎo),可通過累加l層所有節(jié)點(diǎn)靈敏度得到:
總誤差E對卷積核參數(shù)的偏導(dǎo),可通過累加所有特征元素得到:
全連接層參數(shù)可用式(10)更新:
其中,全連接層的權(quán)重w是一個(gè)巨大的矩陣,在l層,定義η為學(xué)習(xí)率,若其過小,則CNN整體訓(xùn)練速度會(huì)過慢;若其過大,則系統(tǒng)運(yùn)行將不可收斂。通過調(diào)整學(xué)習(xí)率,調(diào)整整體訓(xùn)練時(shí)間;通過調(diào)整CNN 各項(xiàng)參數(shù),不斷迭代直至收斂后,可以得到CNN 運(yùn)行收斂的具體參數(shù)。
整個(gè)訓(xùn)練過程是:對數(shù)據(jù)進(jìn)行上述處理,產(chǎn)生的特征向量作為輸入數(shù)據(jù)對CNN 進(jìn)行訓(xùn)練。在CNN 訓(xùn)練過程中采用若干個(gè)卷積核對特征向量拼接成的矩陣進(jìn)行掃描、池化和全連接。訓(xùn)練過程則是使用BP 算法修改神經(jīng)網(wǎng)絡(luò)中每條鏈接的權(quán)值。訓(xùn)練的過程實(shí)際上是對模型的極大似然估計(jì),即最大化L=log(y|X,θ),其中,X為樣本,y是樣本標(biāo)簽,θ為模型參數(shù),因此訓(xùn)練過程就是已知X和y的情況下,通過優(yōu)化θ,使得L最大化。
在安全防御模型構(gòu)建中,訓(xùn)練數(shù)據(jù)應(yīng)包含正常樣例和異常樣例,但是異常樣例難以獲取,因此做出如下定義:正常運(yùn)行是指通過軟件提供的修改方法正常修改變量數(shù)據(jù);非正常運(yùn)行則是指除正常運(yùn)行外任何可能的行為。
模型訓(xùn)練過程可視為將模型擬合數(shù)據(jù)的過程,定義C(x,θ)為機(jī)器學(xué)習(xí)模型,其中,x為輸入數(shù)據(jù),θ為模型參數(shù)=C(x,θ) 為模型對輸入數(shù)據(jù)x的預(yù)測結(jié)果。定義損失函數(shù)LOSS=(,y)表示模型預(yù)測的誤差,其中y為樣本標(biāo)簽,即當(dāng)x為正常數(shù)據(jù)時(shí),y=0;當(dāng)x為異常數(shù)據(jù)時(shí),y=1。模型的訓(xùn)練過程是:通過尋找合適的模型參數(shù)θ,使得預(yù)測誤差LOSS=(,y)最小。因此訓(xùn)練過程是解決優(yōu)化問題,如式(11)所示:
本文采用卷積神經(jīng)網(wǎng)絡(luò)模型,損失函數(shù)LOSS(C(x,θ),y)可導(dǎo),可利用隨機(jī)梯度下降技術(shù)解決該優(yōu)化問題,完成對神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練。在訓(xùn)練結(jié)束后,模型參數(shù)θ可作為工控系統(tǒng)是否存在異常的依據(jù),從而獲得安全穩(wěn)定運(yùn)行基線。在訓(xùn)練過程中,從訓(xùn)練集中隨機(jī)抽取部分?jǐn)?shù)據(jù),定期檢驗(yàn)預(yù)測正確率,驗(yàn)證訓(xùn)練階段性成果。當(dāng)訓(xùn)練成果達(dá)到預(yù)期時(shí),停止訓(xùn)練,使用測試集測試,當(dāng)測試效果達(dá)到預(yù)期時(shí),結(jié)束模型構(gòu)建過程。
本文提出的安全防御模型構(gòu)建流程如圖6所示。
選取數(shù)據(jù)庫中124 個(gè)正常修改樣例和154個(gè)非正常修改樣例,以6∶4 的比例構(gòu)建訓(xùn)練集和測試集,計(jì)算召回率,最終結(jié)果如表1所示。
表1 不同核函數(shù)下召回率實(shí)驗(yàn)結(jié)果
對于正常修改樣例的檢測結(jié)果而言,各種核函數(shù)都具有優(yōu)秀的表現(xiàn),尤其是多項(xiàng)式核函數(shù)的召回率達(dá)到了100%;對于非正常樣例的檢測結(jié)果而言,各種核函數(shù)差異較大,其中,多項(xiàng)式核函數(shù)的召回率最低,其次是徑向基核函數(shù);線性核函數(shù)的召回率最高。在特征數(shù)遠(yuǎn)大于樣本數(shù)的情況下,通常選用線性核函數(shù)的經(jīng)驗(yàn)知識(shí)。在正常修改狀態(tài)下,線性核函數(shù)召回率達(dá)到了98.3%,非正常修改狀態(tài)下的召回率也達(dá)到了93.5%。
本文以提高電力工控系統(tǒng)安全穩(wěn)定運(yùn)行為目的,面向當(dāng)前電力工控系統(tǒng)閉源性及攻擊樣本少的特點(diǎn),設(shè)計(jì)了面向閉源電力工控系統(tǒng)的安全防御體系架構(gòu),為閉源電力工控系統(tǒng)安全防御問題提供了技術(shù)解決路線。針對閉源特性問題,分析并給出了用于提取閉源電力工控系統(tǒng)底層運(yùn)行數(shù)據(jù)的函數(shù)調(diào)用邏輯及參數(shù)逆向技術(shù);針對攻擊樣本少,無法構(gòu)建特征庫的問題,提出了基于卷積神經(jīng)網(wǎng)絡(luò)的主站安全防御模型構(gòu)建方法,給出了不依賴特征庫的系統(tǒng)安全運(yùn)行訓(xùn)練方法;最后以示例的方式,給出了安全防御流程架構(gòu)。