隨着「互聯網+」、「中國智能製造2025「、「工業4.0」等概念的提出,爲了提升生產率,獨立、隔離的傳統工控領域將迎來了新的互聯網時代,愈來愈多的工控設備(如控制器、機器人、數控機牀)將被暴露在互聯網上或者與企業內網相連。隨着互聯網時代的來臨,安全問題會愈來愈突出。然而,工業控制系統的安全不一樣於傳統信息網絡的安全,一旦出現網絡攻擊,後果不堪設想。關於工控病毒相關關鍵事件以下:git
近日,工匠實驗室工控安全專家針對PLC進行深刻研究,經過梯形圖和SCL相結合的方式,利用PLC自身通訊功能, 復現了這個病毒,實現了病毒在PLC與PLC之間進行傳播。同時,針對這一病毒,咱們已經開發了相應的檢測工具,這標誌着華創網安在工控安全領域掌握了這方面的核心技術,也體現了工控領域的研發實力。github
PLC 實質是一種專用於工業控制的計算機,其硬件結構基本上與微型計算機相同,如圖所示:編程
中央處理單元(CPU) 中央處理單元(CPU)是PLC 的控制中樞。它按照PLC 系統程序賦予的功能接收並存儲從編程器鍵入的用戶程序和數據:檢查電源、存儲器、I/O 以及警惕定時器的狀態,並能診斷用戶程序中的語法錯誤,當PLC 投入運行時,首先它以掃描的方式接收現場各輸入裝置的狀態和數據,並分別存入I/O 映象區,而後從用戶程序存儲器中逐條讀取用戶程序,通過命令解釋後按指令的規定執行邏輯或算數運算的結果送入I/O 映象區或數據寄存器內。等全部的用戶程序執行完畢以後,最後將I/O映象區的各輸出狀態或輸出寄存器內的數據傳送到相應的輸出裝置,如此循環運行,直到中止運行。 爲了進一步提升PLC 的可靠性,近年來對大型PLC 還採用雙CPU 構成冗餘系統,或採用三CPU 的表決式系統。這樣,即便某個CPU 出現故障,整個系統仍能正常運行。安全
存儲器 存放系統軟件的存儲器稱爲系統程序存儲器。存放應用軟件的存儲器稱爲用戶程序存儲器。雖然各類PLC的CPU的最大尋址空間各不相同,可是根據PLC的工做原理其存儲空間通常包括如下三個區域:系統程序存儲區、系統RAM 存儲區(包括I/O 映象區和系統軟設備等)、用戶程序存儲區服務器
電源 PLC 的電源在整個系統中起着十分重要得做用。若是沒有一個良好的、可靠得電源系統是沒法正常工做的,所以PLC 的製造商對電源的設計和製造也十分重視。通常交流電壓波動在±10%(±15%)範圍內,能夠不採起其它措施而將PLC 直接鏈接到交流電網上去。網絡
輸入/輸出電路 I/O擴展接口用於將擴充外部輸入/輸出端子數的擴展單元與基本單元(即主機)鏈接在一塊兒。架構
蠕蟲病毒是一種常見的計算機病毒。它是利用網絡進行復制和傳播,傳染途徑是經過網絡和電子郵件。最初的蠕蟲病毒定義是由於在DOS環境下,病毒發做時會在屏幕上出現一條相似蟲子的東西,胡亂吞吃屏幕上的字母並將其改形。蠕蟲病毒是自包含的程序(或是一套程序),它能傳播自身功能的拷貝或自身的某些部分到其餘的計算機系統中(一般是通過網絡鏈接)。編程語言
工控蠕蟲主要的針對的對象是工業控制設備,經過控制器之間進行病毒傳播,這與傳統計算機蠕蟲是存在很大差異,傳統蠕蟲寄生對象都是計算機(Window或者Linux),工控蠕蟲寄生對象是控制器邏輯代碼中。因爲病毒能夠混淆於正常的控制邏輯代碼中,傳統防護方式都不適合於工控蠕蟲的防禦,檢測與查殺的方式更強困難。 雖然工控蠕蟲與計算機蠕蟲存在不少的不一樣點,但全部的蠕蟲的基本架構都是相同的。全部的蠕蟲攻擊均可以歸爲一下幾個階段:搜索目標,感染目標,在目標上執行,添加惡意功能。因爲PLC控制器提供網絡通訊能力,在PLC上蠕蟲也一樣支持這些功能。這篇文章將展現每一個必須組件的實現方法。工具
蠕蟲實現的主要的編程軟件爲西門子的TIA Portal(博途),在TIA Portal(博途)編程軟件中,用戶經過編寫程序來完成工業現場的控制以及工藝流程的實現。博途中分爲如下幾類塊:線程
OB(Organization Block ):組織塊,爲程序的入口塊,被系統直接調用(其餘塊不能夠被系統直接調用,必須包含在OB中才能夠執行)。
FB(Function Block):功能塊,既能夠是博途中已包含的功能塊,也能夠是用戶本身編寫的塊,編程中須要帶背景數據塊(又叫實例數據塊,Instance Data Block)使用。
FC(Function):功能,既能夠是博途中已包含的功能塊,也能夠是戶本身編寫,不能夠帶背景數據塊。
DB(Data Block):數據塊,分爲背景數據塊和共享數據塊,其中背景數據塊爲私有塊。編程時,戶能夠定義共享數據塊的數據存儲結構,不能夠定義背景數據塊的數據存儲結構,必須由FB定義。數據塊中的數據掉電不丟失。
SFB(System Function Block):系統功能塊,系統內部功能塊,用戶不可本身編寫,不可更改,使用同FB。
SFC(System Function):系統功能,系統內部功能,用戶不可本身編寫,不可更改,使用同FC。 博途軟件支持的編程語言有: LD(梯形圖),FBD(功能塊圖)、SCL(結構化控制語言)、STL(語句列表)。
S7-1200只支持LAD、FBD和SCL三種編程語言,而且在下載過程當中會先中止運行,而後下載程序,下載完成後從新啓動。
病毒首先選擇IP經過西門子通訊端口102嘗試創建鏈接,若是鏈接創建成功,則檢查目標PLC是否已被感染。如鏈接未創建成功,或目標PLC已被感染,則選擇新IP從新嘗試創建鏈接。如目標PLC未被感染,則中止目標PLC,下裝病毒程序,最後從新啓動目標PLC。流程以下圖所示。
西門子PLC經過102端口進行TCP通訊,所以能夠嘗試經過102端口與設備創建TCP通訊來尋找目標。博途開發平臺提供了兩個FB塊——通信鏈接塊TCON和斷開通信鏈接塊TDISCON,以下圖所示。
程序塊TCON和TDISCON的參數說明
若是TCON創建了鏈接則判斷設備型號或者下載程序。因爲TCON只需觸發一次鏈接命令,就會一直嘗試與目標創建鏈接,直到鏈接成功。所以,若是1s內沒有創建鏈接則改變IP地址,嘗試鏈接下一臺PLC;若是創建了鏈接,則經過發送指令判斷設備信號或者下載病毒程序,完成後改變IP地址,並嘗試鏈接下一臺設備。
斷開鏈接後則更改IP地址,準備鏈接下一臺設備
鏈接創建後,病毒調用數據傳送命令TSEND和數據接收命令TRCV進行傳播。見下圖
程序塊TSEND和TRCV的參數說明
病毒在傳播感染以前須要判斷當前對象是否已經被感染,避免重複感染。判斷是否被感染,若是感染,則跳過感染,若是未感染,則執行程序傳送,感染對象。具體實現以下圖:
在程序的發送過程當中,須要知足S7協議的相關通訊時序以及報文格式。下圖爲S7創建鏈接的過程。首先是TCP的三次握手,接下來創建COTP鏈接,創建完成後進行S7協議的鏈接創建。
具體邏輯實現代碼以下:
PLC執行順序是從OB1開始,按順序執行到OB9999的。
創建調用病毒程序的OB塊OB9999,並將其存植入到目標PLC中,用以激病毒,並進行新的病毒傳播感染。西門子PLC在運行時,會按照從OB1到OB9999的順序進行調用。以下圖所示。
在其餘病毒塊下載完成後,用OB9999(也能夠用其餘非系統自帶的OB塊,未了避免病毒的OB塊與PLC中正常的OB塊重複,建議塊的序號儘可能大些)啓動病毒程序。
一旦PLC被感染病毒,會基於TCP主動去鏈接C&C服務器。經過C&C服務器,能夠遠程控制PLC,包括PLC的啓停,輸出值的改變等。當C&C服務器向鏈接了C&C服務器的PLC發送指令後,PLC會解析命令並執行。以點燈程序爲例說明其危害性。下圖爲C&C服務器點燈的解析部分:
博途軟件提供了PLC程序在線與離線差別的檢測功能,以下圖所示。程序塊後面的綠色圓圈表示在線程序與離線程序一致,藍色與橘黃色組成的圓形表示在線程序與離線程序不一致。塊爲虛樣式,表示博途的程序中沒有此塊,而PLC有。
紅燈表示PLC感染狀態,綠燈表示PLC正常控制的終端運行狀態,PLC使用的是西門子1200 V3版本,從左到右分別爲PLC0,PLC1,PLC2。默認狀況下,PLC1和PLC2離線的,當PLC0被感染後,PLC1和PLC2接入網絡,隨後PLC0就會感染PLC1和PLC2。
圖1:PLC處於正常運行狀態
圖2:PLC0被感染病毒,反向聯接C&C服務器
圖3:PLC1與PLC2聯網,PLC0正在感染PLC1
圖4:PLC1被感染病毒,反向聯接C&C服務器
圖5:PLC2被感染病毒,反向聯接C&C服務器
部署控制設備管理系統,按期對PLC控制邏輯代碼進行備份,一旦PLC被感染,能夠迅速經過備份的PLC程序重置進行快速恢復。
設置CPU訪問密碼,禁止非受權用戶上下載邏輯代碼,密碼必定不能是弱口令。
對工控網絡進行風險評估,識別核心資產,根據不一樣安全級別進行安全分區,一旦受到網絡攻擊,將損失控制在最小的範圍內。
在工控系統中安裝工控監測審計系統,經過工控協議深度解析,根據特徵值的進行採集、分析與識別,如發現異常數據包,如控制器啓停、程序上下載,則記錄日誌或報警。
安全域邊界安裝工控防火牆,經過工控防火牆,對異常數據包進行檢測以及隔離防禦。
針對工控網絡制定應急處理預案,當碰見突發網絡攻擊事件,能夠實現快速恢復。