周宇,鄭榮鋒,劉嘉勇
(1.四川大學電子信息學院,成都 610065;2.四川大學網絡空間安全學院,成都610065)
在工業控制系統ICS發展過程中,采取的是封閉隔離形式,具有固定的業務流程,是自動閉環的處理方式,并采用大量私有協議,但是隨著ICS開放性的提升和協議逆向技術的發展,安全的私有協議漸漸變成暴露在網絡上極易受到攻擊的公有協議。
ICS需要符合其特殊性的入侵檢測系統,Golden?berg和Wool分別提出了針對Modbus和S7協議的基于狀態機的入侵檢測方法[1-2],但只是在HMI到PLC方向的下行信道建立DFA(有限狀態自動機),不能檢測PLC到HMI方向的數據。Zhang J[3]等人提出了基于工控流量數據周期性的特點進行異常檢測,并將請求數據的響應時間也加入參考條件,但并沒有檢測上行信道的數據。Xu J、Feng D[4]提出了SF-FSM模型(包含響應參數的有限狀態機)將下行信道PLC響應HMI的數據作為狀態機的參數,但如果通過中間人構造響應數據,則此狀態機就會失效。
針對上述的問題,提出了R-DFA模型,R-DFA模型是特殊的有限自動機,其輸入參數包含請求數據信息,響應數據信息和響應時間信息三元組。最后為了彌補一般自動機的狀態轉移只依賴前一個狀態的缺點,在R-DFA模型后面添加周期狀態序列模型以提高準確率。考慮到S7協議語義公開,便于提取特征,本文實驗環境基于S7協議的工控系統,實驗結果表明R-DFA模型具有較高的準確率,也能夠有效的對上行異常流量進行檢測。
本文將工控系統的一個PLC和一個上位機的通信稱為一個信道,R-DFA模型異常流量檢測是建立在單一信道中。數據預處理有兩個目的,一是獲得所有信道信息,建立信道白名單模型,過濾異常的信道,二是提取出單一信道,并從單一信道中提取次信道的工控規則信息數據,為后續訓練R-DFA模型。
數據預處理分為二步:
(1)通過三元組(s_port,m_IP,s_IP)分離通信信道。其中s_port為S7協議的端口號,s_IP為PLC的IP,m_IP為上位機的IP,并將正常信道的三元組進行記錄,組建會話白名單;
(2)在一個信道會話中提取會話規則,過濾掉對規則無用的包,例如心跳包(PLC定時對HMI發送的工控現場實時的數據,ROSCTR為0x07)等,過濾這些包根據S7 PDU的Header中的ROSCTR字段來過濾,僅僅保留 ROSCTR字段為 0x01(JOB packet)和 0x03(ACK packet)的數據包。
先對S7協議字段和語義進行分析,根據先驗知識確定S7協議中的關鍵字段來作為特征,提取出一個能代表這個數據包和PLC狀態的唯一特征,并記錄。

圖1 S7協議PDU結構
本文將S7協議的數據包特征定義為S7 PDU除去Header字段包含的Protol Data Unit Reference字段的其他所有數據的集合。提取后數據包字段特征進行md5產生一個32位的數據,本文稱為特征指紋,用特征指紋來代替原始的特征數據,這樣既能夠用特征指紋表現出不同數據包的唯一性,也能夠忽略請求數據包和響應數據包的不同所表現出來的特征長度的區別。
工業控制系統網絡一般具有明顯的規律性,可以將工控系統一個信道的工作流程定義為一個有限自動機,R-DFA和普通的DFA一樣定義一個五元組(S,s0,∑,δ,F)。
S是一個有限非空的狀態集合,需要用PLC的實際狀態來定義,第二個參數s0為狀態機的初始狀態,是S的一個元素,所以S為:

∑為輸入的信號,是本文狀態機的特點,一般的工控系統的狀態機的輸入信號都是單向的請求(JOB)數據包,這樣不能檢測出由PLC向上位機HMI的注入攻擊,例如響應注入攻擊。∑的元素∑i是一個三元組為(Preq,i,Presp,i,ΔTi),因此S為:

Preq是從JOB(request)數據包中提取的特征指紋,Presp是從ACK(response)數據包中提取的特征指紋。ΔT是JOB包和ACK包的到達時間差,稱為響應時間。使用信道流量上下行的特征作為輸入信號,能夠建立一個信道上下行的關系,有效的檢測出響應注入攻擊,響應時間ΔT的加入是為了防止攻擊者構造響應數據包,從而欺騙上位機HMI。
δ為狀態轉移函數,能夠通過現在的狀態si,三維輸入參數Si,轉移到下個狀態si+1。F為狀態機的最后一個狀態。
定義了狀態機的各項參數后,開始建立狀態機模型。建立一個二維的狀態轉換表,第一行為前一個狀態,第一列為后一個狀態,如果兩個狀態能夠轉化則對應表中位置寫入輸入信號參數,異常檢測模型根據狀態轉換表來確定狀態轉換是否異常。
例如假設一共有三種狀態,建立的狀態轉換表如表1所示。

表1 狀態轉換表
可以看出,s1可以通過三維輸入信號(Preq,2,Presp,2,ΔT)轉換為s2,且s1只能轉換為s2狀態,如果s1收到其他輸入信號,會觸發異常狀態轉化函數,從而報出異常。s1狀態轉化為穩定的s2狀態過程如圖2所示。

圖2 s1到s2穩定狀態轉換過程
異常狀態轉化函數能夠根據不同的錯誤輸入信號觸發不同的異常狀態,例如Preq錯誤則報請求異常,Presp和DT錯誤,則報響應異常。此狀態機模型理論上能夠有效檢測出以往的工控狀態機模型無法檢測的響應注入攻擊。
狀態機模型雖然能夠檢測出異常攻擊,但狀態機的狀態轉換是依賴于上一個狀態的,因此狀態機模型有一定的局限性,當發生圖3情況時,狀態機模型可能會出錯。

圖3 狀態機模型無法檢測的狀態順序
在圖4中,s2和s3都能轉化為s1狀態或者從s1轉化而來,都保存在了狀態轉化表中。只使用狀態機模型進行異常檢測,則上圖中錯誤的順序也會被狀態機認為是正確的,產生漏報。為了解決這種問題,完善異常檢測模型,本文又在狀態機模型之后添加了周期狀態序列模型。
周期狀態序列模型由下面步驟建立。
(1)找到單一信道中工控數據流量的最小正周期n,根據JOB數據包的特征指紋順序建立一個周期內的狀態序列模型;
(2)周期狀態序列模型會在一開始進行檢測時進行計數標記,確保預測的狀態和狀態機模型將要正確轉化的下一個狀態一致;
(3)當狀態機模型轉化為下一個狀態時,就會與當前周期狀態序列模型所預測的狀態進行比對,以確保當前轉化狀態的正確性。
周期狀態序列模型的位于狀態機模型后面,當一個周期的狀態預測完成后,周期狀態序列模型又會從周期初始狀態開始預測,循環反復,減低了異常檢測系統的負擔。
如果只用周期狀態序列模型進行異常檢測,無法確定工控系統即時的狀態,而且少了輸入信號量的檢測,模型檢測不出響應注入等攻擊。將狀態機模型和周期狀態序列模型結合起來,能夠避免圖3的漏報,也能夠有效地提高異常檢測系統的準確性。

圖4 周期狀態序列的檢測
以R-DFA為核心的異常檢測系統由以下步驟建立:
(1)通過正常流量建立會話白名單,提取目標信道的數據包,過濾掉其中的心跳包。
(2)提取目標信道上下行流量的特征,根據目標信道的通信規則建立狀態轉換表,訓練R-DFA模型。
(3)根據目標信道通信規則,提取出周期,建立周期序列模型。
(4)將以上的模型按照圖5順序組合起來,對實時的流量進行檢測,對不正常的行為發出警告。

圖5 異常流量檢測系統
異常警告可以告知檢測出的異常行為發生在異常檢測系統的哪個階段,也能將對應的異常的行為記錄。這樣能夠通過異常警告的記錄獲得流量中異常行為個數,從而驗證本文異常檢測系統的性能。表2為異常警告階段會記錄的異常行為及其階段。

表2 異常警告記錄的行為和對應階段
為了檢測以上方法的可行性,在本地搭建一個小型的工控系統仿真環境進行實驗。本文的實驗場景如圖5示的西門子工控實驗平臺的網絡拓撲圖。現場設備包含兩個S7-200和一個S7-300的PLC。S7-300控制發電機的轉速,S7-200控制蜂鳴器。其中工程師站能夠根據設定的流程邏輯編寫PLC對應的程序。
在控制設備和現場設備之間有換機,能夠鏡像工控網絡中的流量到工控異常檢測服務器中,并用抓包工具捕獲PLC與HMI的實時數據。
實驗先通過正常的工控流量數據在服務器中訓練出本文提出的異常檢測模型,然后將訓練完成的異常檢測模型監聽鏡像端口的實時數據,驗證異常檢測模型的效果。

圖6 工控網絡仿真拓撲圖
在本次實驗中,選取S7-300與上位機的通信信道,此信道能夠體現出工控系統的流量數據的特征。
本文實驗數據是通過Python的Scapy庫嗅探正常流量和異常的攻擊流量,使用正常流量來建立模型,使用惡意的攻擊流量驗證異常流量檢測系統的性能。本文使用以下的攻擊方式進行攻擊,并捕獲異常流量,表3為獲取實驗數據集,數量和實際攻擊的單位都是數據包個數。
序列攻擊:修改數據包的傳送順序,導致工控邏輯出現異常,從而影響正常的工控系統的運作。
snap7連接:通過在工控網絡中用另外一臺設備編寫S7的程序,利用PLC不會對HMI設備認證的缺點,控制PLC達到攻擊的目的。
手動操作:手動的從HMI向PLC發送一些數據包,使其與正常情況的狀態不符合,例如在本實驗場景中,HMI向PLC發送的不正常的請求包。
響應構造:通過中間人攻擊,構造PLC到HMI的響應包,讓HMI誤以為PLC已經改變狀態,達到欺騙HMI的目的。
異常響應:直接通過中間人構造異常的響應數據包,從而從上行信道對HMI的主機進行攻擊。

表3 實驗數據集
利用表3的正常數據流,建立信道白名單模型,RDFA模型和周期序列模型,并將三者根據圖5串聯起來,形成異常檢測系統,對表3的異常數據流進行檢測,本實驗使用工具是Python3。
其中R-DFA模型的三元輸入參數中的響應時間DT需要一個可靠的取值范圍,在本文實驗環境中,正常的S7數據流量的響應時間如圖7所示。

圖7 正常流量的響應時間
可以看出在本文的實驗環境中工控數據響應時間集中在0.002s到0.005s之間,但也會有些超過0.005s,這些響應時間也是正常的,原因可能是網絡延遲。
為了規避正常的網絡延遲的情況,實驗使用核密度估計ΔT的概率密度估計,從而定義其取值范圍,核密度估計是一種用于估計概率密度函數的非參數方法,正常 n 個樣本點 Δ T1,Δ T2,…,Δ Tn為獨立同分布的,設其概率密度函數為f,則其核密度估計為:

K為核函數,根據實驗,K選用Epanechnikov函數,此核函數的均方誤差是最優的。h為帶寬,根據實驗得出帶寬的最優值為0.001。實驗使用Python 3的scikit-learn機器學習庫對圖6的正常響應時間數據集進行訓練得出ΔT的核密度估計,如圖8所示,選用ΔT 的范圍為(0.0017,0.0095)。

圖8 響應時間核密度估計
將每個異常數據集的數據包分為兩類,正常數據包(normol)和異常數據包(abnormol),經過實驗后得到以下的數據,TP為真陽性,即abnormol被識別為ab?normol;TN 為真陰性,即 normol被識別為 normol;FP 為假陽性,即normol被識別為abnormal;FN為假陰性,即abnormal被識別為normal。
本實驗采用精確召回率調和平均數(F)、召回率(Rec)、精確率(Pre)來衡量:


對異常數據集進行異常檢測實驗結果如表4所示,表5還包括此類攻擊被檢測到的階段和對應的異常警報。

表4 異常攻擊流量檢測結果
根據表4的結果,可以看出基于R-FSM異常檢測系統性能良好,對常見的攻擊的異常檢測精確率Pre,召回率Rec和精確召回率調和平均數F都在90%以上,也能夠檢測出PLC對上位機方向上行行道的流量異常,也有很高的精確率Pre,召回率Rec和精確召回率調和平均數F。
本文在普通的DFA模型上添加了PLC到HMI的數據信息,能夠檢測出普通工控DFA模型無法檢測的響應注入的問題,并在DFA模型后添加了周期狀態序列模型,解決了DFA狀態轉移僅僅依靠前一個狀態的不足。在本地基于S7協議仿真實驗中,異常檢測模型運行效果良好,能夠準確地識別出工控網絡的異常流量。另外此方法也應該能夠用在不是S7協議的工業控制系統中,這需要后續的研究和確定。