周宇,鄭榮鋒,劉嘉勇
(1.四川大學電子信息學院,成都 610065;2.四川大學網(wǎng)絡(luò)空間安全學院,成都610065)
在工業(yè)控制系統(tǒng)ICS發(fā)展過程中,采取的是封閉隔離形式,具有固定的業(yè)務(wù)流程,是自動閉環(huán)的處理方式,并采用大量私有協(xié)議,但是隨著ICS開放性的提升和協(xié)議逆向技術(shù)的發(fā)展,安全的私有協(xié)議漸漸變成暴露在網(wǎng)絡(luò)上極易受到攻擊的公有協(xié)議。
ICS需要符合其特殊性的入侵檢測系統(tǒng),Golden?berg和Wool分別提出了針對Modbus和S7協(xié)議的基于狀態(tài)機的入侵檢測方法[1-2],但只是在HMI到PLC方向的下行信道建立DFA(有限狀態(tài)自動機),不能檢測PLC到HMI方向的數(shù)據(jù)。Zhang J[3]等人提出了基于工控流量數(shù)據(jù)周期性的特點進行異常檢測,并將請求數(shù)據(jù)的響應(yīng)時間也加入?yún)⒖紬l件,但并沒有檢測上行信道的數(shù)據(jù)。Xu J、Feng D[4]提出了SF-FSM模型(包含響應(yīng)參數(shù)的有限狀態(tài)機)將下行信道PLC響應(yīng)HMI的數(shù)據(jù)作為狀態(tài)機的參數(shù),但如果通過中間人構(gòu)造響應(yīng)數(shù)據(jù),則此狀態(tài)機就會失效。
針對上述的問題,提出了R-DFA模型,R-DFA模型是特殊的有限自動機,其輸入?yún)?shù)包含請求數(shù)據(jù)信息,響應(yīng)數(shù)據(jù)信息和響應(yīng)時間信息三元組。最后為了彌補一般自動機的狀態(tài)轉(zhuǎn)移只依賴前一個狀態(tài)的缺點,在R-DFA模型后面添加周期狀態(tài)序列模型以提高準確率??紤]到S7協(xié)議語義公開,便于提取特征,本文實驗環(huán)境基于S7協(xié)議的工控系統(tǒng),實驗結(jié)果表明R-DFA模型具有較高的準確率,也能夠有效的對上行異常流量進行檢測。
本文將工控系統(tǒng)的一個PLC和一個上位機的通信稱為一個信道,R-DFA模型異常流量檢測是建立在單一信道中。數(shù)據(jù)預(yù)處理有兩個目的,一是獲得所有信道信息,建立信道白名單模型,過濾異常的信道,二是提取出單一信道,并從單一信道中提取次信道的工控規(guī)則信息數(shù)據(jù),為后續(xù)訓練R-DFA模型。
數(shù)據(jù)預(yù)處理分為二步:
(1)通過三元組(s_port,m_IP,s_IP)分離通信信道。其中s_port為S7協(xié)議的端口號,s_IP為PLC的IP,m_IP為上位機的IP,并將正常信道的三元組進行記錄,組建會話白名單;
(2)在一個信道會話中提取會話規(guī)則,過濾掉對規(guī)則無用的包,例如心跳包(PLC定時對HMI發(fā)送的工控現(xiàn)場實時的數(shù)據(jù),ROSCTR為0x07)等,過濾這些包根據(jù)S7 PDU的Header中的ROSCTR字段來過濾,僅僅保留 ROSCTR字段為 0x01(JOB packet)和 0x03(ACK packet)的數(shù)據(jù)包。
先對S7協(xié)議字段和語義進行分析,根據(jù)先驗知識確定S7協(xié)議中的關(guān)鍵字段來作為特征,提取出一個能代表這個數(shù)據(jù)包和PLC狀態(tài)的唯一特征,并記錄。
圖1 S7協(xié)議PDU結(jié)構(gòu)
本文將S7協(xié)議的數(shù)據(jù)包特征定義為S7 PDU除去Header字段包含的Protol Data Unit Reference字段的其他所有數(shù)據(jù)的集合。提取后數(shù)據(jù)包字段特征進行md5產(chǎn)生一個32位的數(shù)據(jù),本文稱為特征指紋,用特征指紋來代替原始的特征數(shù)據(jù),這樣既能夠用特征指紋表現(xiàn)出不同數(shù)據(jù)包的唯一性,也能夠忽略請求數(shù)據(jù)包和響應(yīng)數(shù)據(jù)包的不同所表現(xiàn)出來的特征長度的區(qū)別。
工業(yè)控制系統(tǒng)網(wǎng)絡(luò)一般具有明顯的規(guī)律性,可以將工控系統(tǒng)一個信道的工作流程定義為一個有限自動機,R-DFA和普通的DFA一樣定義一個五元組(S,s0,∑,δ,F(xiàn))。
S是一個有限非空的狀態(tài)集合,需要用PLC的實際狀態(tài)來定義,第二個參數(shù)s0為狀態(tài)機的初始狀態(tài),是S的一個元素,所以S為:
∑為輸入的信號,是本文狀態(tài)機的特點,一般的工控系統(tǒng)的狀態(tài)機的輸入信號都是單向的請求(JOB)數(shù)據(jù)包,這樣不能檢測出由PLC向上位機HMI的注入攻擊,例如響應(yīng)注入攻擊?!频脑亍苅是一個三元組為(Preq,i,Presp,i,ΔTi),因此S為:
Preq是從JOB(request)數(shù)據(jù)包中提取的特征指紋,Presp是從ACK(response)數(shù)據(jù)包中提取的特征指紋。ΔT是JOB包和ACK包的到達時間差,稱為響應(yīng)時間。使用信道流量上下行的特征作為輸入信號,能夠建立一個信道上下行的關(guān)系,有效的檢測出響應(yīng)注入攻擊,響應(yīng)時間ΔT的加入是為了防止攻擊者構(gòu)造響應(yīng)數(shù)據(jù)包,從而欺騙上位機HMI。
δ為狀態(tài)轉(zhuǎn)移函數(shù),能夠通過現(xiàn)在的狀態(tài)si,三維輸入?yún)?shù)Si,轉(zhuǎn)移到下個狀態(tài)si+1。F為狀態(tài)機的最后一個狀態(tài)。
定義了狀態(tài)機的各項參數(shù)后,開始建立狀態(tài)機模型。建立一個二維的狀態(tài)轉(zhuǎn)換表,第一行為前一個狀態(tài),第一列為后一個狀態(tài),如果兩個狀態(tài)能夠轉(zhuǎn)化則對應(yīng)表中位置寫入輸入信號參數(shù),異常檢測模型根據(jù)狀態(tài)轉(zhuǎn)換表來確定狀態(tài)轉(zhuǎn)換是否異常。
例如假設(shè)一共有三種狀態(tài),建立的狀態(tài)轉(zhuǎn)換表如表1所示。
表1 狀態(tài)轉(zhuǎn)換表
可以看出,s1可以通過三維輸入信號(Preq,2,Presp,2,ΔT)轉(zhuǎn)換為s2,且s1只能轉(zhuǎn)換為s2狀態(tài),如果s1收到其他輸入信號,會觸發(fā)異常狀態(tài)轉(zhuǎn)化函數(shù),從而報出異常。s1狀態(tài)轉(zhuǎn)化為穩(wěn)定的s2狀態(tài)過程如圖2所示。
圖2 s1到s2穩(wěn)定狀態(tài)轉(zhuǎn)換過程
異常狀態(tài)轉(zhuǎn)化函數(shù)能夠根據(jù)不同的錯誤輸入信號觸發(fā)不同的異常狀態(tài),例如Preq錯誤則報請求異常,Presp和DT錯誤,則報響應(yīng)異常。此狀態(tài)機模型理論上能夠有效檢測出以往的工控狀態(tài)機模型無法檢測的響應(yīng)注入攻擊。
狀態(tài)機模型雖然能夠檢測出異常攻擊,但狀態(tài)機的狀態(tài)轉(zhuǎn)換是依賴于上一個狀態(tài)的,因此狀態(tài)機模型有一定的局限性,當發(fā)生圖3情況時,狀態(tài)機模型可能會出錯。
圖3 狀態(tài)機模型無法檢測的狀態(tài)順序
在圖4中,s2和s3都能轉(zhuǎn)化為s1狀態(tài)或者從s1轉(zhuǎn)化而來,都保存在了狀態(tài)轉(zhuǎn)化表中。只使用狀態(tài)機模型進行異常檢測,則上圖中錯誤的順序也會被狀態(tài)機認為是正確的,產(chǎn)生漏報。為了解決這種問題,完善異常檢測模型,本文又在狀態(tài)機模型之后添加了周期狀態(tài)序列模型。
周期狀態(tài)序列模型由下面步驟建立。
(1)找到單一信道中工控數(shù)據(jù)流量的最小正周期n,根據(jù)JOB數(shù)據(jù)包的特征指紋順序建立一個周期內(nèi)的狀態(tài)序列模型;
(2)周期狀態(tài)序列模型會在一開始進行檢測時進行計數(shù)標記,確保預(yù)測的狀態(tài)和狀態(tài)機模型將要正確轉(zhuǎn)化的下一個狀態(tài)一致;
(3)當狀態(tài)機模型轉(zhuǎn)化為下一個狀態(tài)時,就會與當前周期狀態(tài)序列模型所預(yù)測的狀態(tài)進行比對,以確保當前轉(zhuǎn)化狀態(tài)的正確性。
周期狀態(tài)序列模型的位于狀態(tài)機模型后面,當一個周期的狀態(tài)預(yù)測完成后,周期狀態(tài)序列模型又會從周期初始狀態(tài)開始預(yù)測,循環(huán)反復,減低了異常檢測系統(tǒng)的負擔。
如果只用周期狀態(tài)序列模型進行異常檢測,無法確定工控系統(tǒng)即時的狀態(tài),而且少了輸入信號量的檢測,模型檢測不出響應(yīng)注入等攻擊。將狀態(tài)機模型和周期狀態(tài)序列模型結(jié)合起來,能夠避免圖3的漏報,也能夠有效地提高異常檢測系統(tǒng)的準確性。
圖4 周期狀態(tài)序列的檢測
以R-DFA為核心的異常檢測系統(tǒng)由以下步驟建立:
(1)通過正常流量建立會話白名單,提取目標信道的數(shù)據(jù)包,過濾掉其中的心跳包。
(2)提取目標信道上下行流量的特征,根據(jù)目標信道的通信規(guī)則建立狀態(tài)轉(zhuǎn)換表,訓練R-DFA模型。
(3)根據(jù)目標信道通信規(guī)則,提取出周期,建立周期序列模型。
(4)將以上的模型按照圖5順序組合起來,對實時的流量進行檢測,對不正常的行為發(fā)出警告。
圖5 異常流量檢測系統(tǒng)
異常警告可以告知檢測出的異常行為發(fā)生在異常檢測系統(tǒng)的哪個階段,也能將對應(yīng)的異常的行為記錄。這樣能夠通過異常警告的記錄獲得流量中異常行為個數(shù),從而驗證本文異常檢測系統(tǒng)的性能。表2為異常警告階段會記錄的異常行為及其階段。
表2 異常警告記錄的行為和對應(yīng)階段
為了檢測以上方法的可行性,在本地搭建一個小型的工控系統(tǒng)仿真環(huán)境進行實驗。本文的實驗場景如圖5示的西門子工控實驗平臺的網(wǎng)絡(luò)拓撲圖。現(xiàn)場設(shè)備包含兩個S7-200和一個S7-300的PLC。S7-300控制發(fā)電機的轉(zhuǎn)速,S7-200控制蜂鳴器。其中工程師站能夠根據(jù)設(shè)定的流程邏輯編寫PLC對應(yīng)的程序。
在控制設(shè)備和現(xiàn)場設(shè)備之間有換機,能夠鏡像工控網(wǎng)絡(luò)中的流量到工控異常檢測服務(wù)器中,并用抓包工具捕獲PLC與HMI的實時數(shù)據(jù)。
實驗先通過正常的工控流量數(shù)據(jù)在服務(wù)器中訓練出本文提出的異常檢測模型,然后將訓練完成的異常檢測模型監(jiān)聽鏡像端口的實時數(shù)據(jù),驗證異常檢測模型的效果。
圖6 工控網(wǎng)絡(luò)仿真拓撲圖
在本次實驗中,選取S7-300與上位機的通信信道,此信道能夠體現(xiàn)出工控系統(tǒng)的流量數(shù)據(jù)的特征。
本文實驗數(shù)據(jù)是通過Python的Scapy庫嗅探正常流量和異常的攻擊流量,使用正常流量來建立模型,使用惡意的攻擊流量驗證異常流量檢測系統(tǒng)的性能。本文使用以下的攻擊方式進行攻擊,并捕獲異常流量,表3為獲取實驗數(shù)據(jù)集,數(shù)量和實際攻擊的單位都是數(shù)據(jù)包個數(shù)。
序列攻擊:修改數(shù)據(jù)包的傳送順序,導致工控邏輯出現(xiàn)異常,從而影響正常的工控系統(tǒng)的運作。
snap7連接:通過在工控網(wǎng)絡(luò)中用另外一臺設(shè)備編寫S7的程序,利用PLC不會對HMI設(shè)備認證的缺點,控制PLC達到攻擊的目的。
手動操作:手動的從HMI向PLC發(fā)送一些數(shù)據(jù)包,使其與正常情況的狀態(tài)不符合,例如在本實驗場景中,HMI向PLC發(fā)送的不正常的請求包。
響應(yīng)構(gòu)造:通過中間人攻擊,構(gòu)造PLC到HMI的響應(yīng)包,讓HMI誤以為PLC已經(jīng)改變狀態(tài),達到欺騙HMI的目的。
異常響應(yīng):直接通過中間人構(gòu)造異常的響應(yīng)數(shù)據(jù)包,從而從上行信道對HMI的主機進行攻擊。
表3 實驗數(shù)據(jù)集
利用表3的正常數(shù)據(jù)流,建立信道白名單模型,RDFA模型和周期序列模型,并將三者根據(jù)圖5串聯(lián)起來,形成異常檢測系統(tǒng),對表3的異常數(shù)據(jù)流進行檢測,本實驗使用工具是Python3。
其中R-DFA模型的三元輸入?yún)?shù)中的響應(yīng)時間DT需要一個可靠的取值范圍,在本文實驗環(huán)境中,正常的S7數(shù)據(jù)流量的響應(yīng)時間如圖7所示。
圖7 正常流量的響應(yīng)時間
可以看出在本文的實驗環(huán)境中工控數(shù)據(jù)響應(yīng)時間集中在0.002s到0.005s之間,但也會有些超過0.005s,這些響應(yīng)時間也是正常的,原因可能是網(wǎng)絡(luò)延遲。
為了規(guī)避正常的網(wǎng)絡(luò)延遲的情況,實驗使用核密度估計ΔT的概率密度估計,從而定義其取值范圍,核密度估計是一種用于估計概率密度函數(shù)的非參數(shù)方法,正常 n 個樣本點 Δ T1,Δ T2,…,Δ Tn為獨立同分布的,設(shè)其概率密度函數(shù)為f,則其核密度估計為:
K為核函數(shù),根據(jù)實驗,K選用Epanechnikov函數(shù),此核函數(shù)的均方誤差是最優(yōu)的。h為帶寬,根據(jù)實驗得出帶寬的最優(yōu)值為0.001。實驗使用Python 3的scikit-learn機器學習庫對圖6的正常響應(yīng)時間數(shù)據(jù)集進行訓練得出ΔT的核密度估計,如圖8所示,選用ΔT 的范圍為(0.0017,0.0095)。
圖8 響應(yīng)時間核密度估計
將每個異常數(shù)據(jù)集的數(shù)據(jù)包分為兩類,正常數(shù)據(jù)包(normol)和異常數(shù)據(jù)包(abnormol),經(jīng)過實驗后得到以下的數(shù)據(jù),TP為真陽性,即abnormol被識別為ab?normol;TN 為真陰性,即 normol被識別為 normol;FP 為假陽性,即normol被識別為abnormal;FN為假陰性,即abnormal被識別為normal。
本實驗采用精確召回率調(diào)和平均數(shù)(F)、召回率(Rec)、精確率(Pre)來衡量:
對異常數(shù)據(jù)集進行異常檢測實驗結(jié)果如表4所示,表5還包括此類攻擊被檢測到的階段和對應(yīng)的異常警報。
表4 異常攻擊流量檢測結(jié)果
根據(jù)表4的結(jié)果,可以看出基于R-FSM異常檢測系統(tǒng)性能良好,對常見的攻擊的異常檢測精確率Pre,召回率Rec和精確召回率調(diào)和平均數(shù)F都在90%以上,也能夠檢測出PLC對上位機方向上行行道的流量異常,也有很高的精確率Pre,召回率Rec和精確召回率調(diào)和平均數(shù)F。
本文在普通的DFA模型上添加了PLC到HMI的數(shù)據(jù)信息,能夠檢測出普通工控DFA模型無法檢測的響應(yīng)注入的問題,并在DFA模型后添加了周期狀態(tài)序列模型,解決了DFA狀態(tài)轉(zhuǎn)移僅僅依靠前一個狀態(tài)的不足。在本地基于S7協(xié)議仿真實驗中,異常檢測模型運行效果良好,能夠準確地識別出工控網(wǎng)絡(luò)的異常流量。另外此方法也應(yīng)該能夠用在不是S7協(xié)議的工業(yè)控制系統(tǒng)中,這需要后續(xù)的研究和確定。