安天釋出針對工控惡意程式碼TRISIS的技術分析
1、概述
2017年8月,安天安全研究與應急處理中心(安天CERT)基於綜合情報研判,將針對工業控制系統的惡意程式碼TRISIS(又名TRITON、HATMAN)列為需要重點分析關注的威脅,並將其命名為“海淵”。該惡意程式碼在 中東某石油天然氣廠的工業控制系統中被國外安全研究人員發現,根據各方資訊判斷,由於攻擊者準備不充分,尚未對人員及財產造成重大損失。“海淵”(TRISIS)的目標為施耐德電氣公司的安全儀表系統,通過植入韌體更改最終控制元件的邏輯以達到攻擊目的。其 通過Tricon安全儀表系統所使用的TriStation通訊協議進行攻擊,因此執行此協議的所有安全控制器都可能受到影響。
“海淵”(TRISIS)所攻擊的目標是工業控制系統(ICS)中的安全儀表系統(SIS)控制器,其主要瞄準施耐德電氣的Tricon安全儀表系統,從而達到在最終控制元件中替換邏輯的目的。安全儀表系統(Safety Instrumented System),簡稱SIS,又稱為安全聯鎖系統(Safety Interlocking System),主要為工廠控制系統中報警和聯鎖部分,對控制系統中檢測的結果實施報警動作或調節或停機控制,是工廠企業自動控制中的重要組成部分。其包括感測器、邏輯運算器和最終 執行元件,即檢測單元、控制單元和執行單元。SIS系統可以監測生產過程中出現的或者潛伏的危險,發出告警資訊或直接執行預定程式,立即進入操作,以防止事故的發生,同時降低事故帶來的危害及影響。
安天CERT針對該惡意程式碼的攻擊原理及樣本展開了技術分析。發現該惡意程式碼的攻擊流程為利用社工技巧偽裝成安全儀表系統的日誌軟體進入目標網路,之後通過特殊ping包發現安全儀表系統,在確定安全儀表系 統可被入侵後,會上傳組合後的二進位制程式碼,以改變安全儀表系統的梯形圖(即安全儀表系統邏輯),一旦攻擊成功,將有可能對工業生產裝置、工廠人身安全造成巨大危害,對關鍵資訊基礎設施安全、社會安全造成巨大影響。
2、“海淵”(TRISIS)攻擊原理
2.1 攻擊原理簡述
“海淵”(TRISIS)和“震網”(Stuxnet)、“Industroyer/CrashOverride”等惡意程式碼一樣具備從工業控制系統中發現特定目標裝置的能力。但同時,其更進一步具有直接互動、遠端控制和危害安全系統的能 力。
“海淵”(TRISIS)採用Python指令碼進行編寫,並使用Py2EXE偽編譯為PE可執行程式,以便於在未安裝Python的系統環境下執行。攻擊者充分了解安全儀表系統處理過程及環境的具體細節,才能構造有效載荷利用 “海淵”(TRISIS)進行攻擊,其主要通過修改和部署新的PLC(可程式設計邏輯控制器)梯形圖,以對目標產生預期的影響。
“海淵”(TRISIS)可以改變目標安全儀表的基本邏輯,通過可執行檔案將其目標作為在執行時傳遞給它的命令列引數,其核心功能是通過將四個二進位制檔案組合到目標上進行工作,其中植入Python指令碼中的兩個二進位制 載荷,主要用於準備和載入包含替換邏輯的外部模組(參見圖2-1、圖2-2);附加的兩個外部的二進位制檔案,由指令碼中的名稱專門引用,但位於單獨的檔案中,其中imain.bin為主要功能載荷(參見圖2-3)。
圖2-1 植入指令碼中的二進位制載荷
圖2-2 指令碼中用於覆蓋核心載荷的傀儡程式
圖2-3 獲取外部獨立二進位制檔案
2.2 攻擊流程分析
trilog.exe是“海淵”(TRISIS)的主程式,其原本是Tricon安全儀表系統中的一個模組程式,攻擊者利用其進行實施攻擊的主要流程參見圖2-4:
圖2-4 TRISIS攻擊流程
攻擊流程說明:
1.trilog.exe通過TSAA協議連結TCM(Tricon通訊模組),識別並獲得一個能夠與安全儀表系統通訊的系統,並判斷是否滿足入侵的條件;
2.確認可入侵後,識別目標安全儀表系統型別,並用替換邏輯和載入器開發“海淵”(TRISIS)功能程式碼,構建漏洞利用程式PresentStatus。
3.上載PresentStatus到Tricon安全儀表系統中,並執行確保“海淵”(TRISIS)在預期環境下工作;
4.構建載入器和核心載荷inject.bin、imain.bin,將“海淵”(TRISIS)傳輸到包含裝載器模組的目標上;
5.“海淵”(TRISIS)可執行檔案執行時,偽裝成用於分析日誌的軟體,利用嵌入的二進位制檔案來識別控制器上儲存器中的適當位置以進行邏輯替換,並上傳“初始化程式碼”(4位元組序列);
圖2-5 上傳初始化程式碼
6.驗證前一步是否成功,然後上傳新的PLC梯形圖到安全儀表系統;
7.上傳傀儡程式覆蓋核心載荷。
圖2-6 上傳傀儡程式
3、“海淵”(TRISIS)樣本分析
3.1 “海淵”(TRISIS)與Triconex的通訊過程分析
“海淵”(TRISIS)與Triconex的通訊主要依賴於TsHi、TsBase、TsLow、TS_cnames等模組,這些模組提供了極為強大的遠端連線控制Triconex的程式碼。
3.1.1 請求連線
“海淵”(TRISIS)通過在Script_test.py中呼叫TsLow中的connect函式進行連線,我們以此作為入口點,對其協議進行簡單分析。
圖3-1 connect函式
在connect函式中detect_ip和tcm_connect為關鍵函式。
圖3-2 detect_ip函式
圖3-3 tcm_connect函式
在detect_ip函式中使用1502埠,用變數TS_PORT定義;另外,對ping資料包和close資料包定義,分別採用0x06和0x04為兩者標識碼,如下圖3-4。
圖3-4 資料包型別標識碼定義
在tcm_connect函式中connect_result同樣為資料包型別標識碼,具體定義見上圖3-4,其中關鍵函式為tcm_exec(type引數的值為1)。
圖3-5 tcm_exec函式
Struct.pack函式作用為按照給定的格式(fmt),把資料轉換成字串(位元組流),並將該字串返回,即packet是把type和data長度按照16進位制解釋,再加上data和crc16校驗的資料包。Struct.pack資料包結構如下 :
3.1.2 上傳PresetStatus
“海淵”(TRISIS)通過使用SafeAppendProgramMod函式上傳PresetStatus。
圖3-6 PresetStatusField函式
script_code為需要上傳的執行程式碼。該函式為對AppendProgramMin函式的封裝,AppendProgramMin函式呼叫WriteProgram函式(對WriteFunctionOrProgram的封裝)。
圖3-7 AppendProgramMin函式(部分)
圖3-8 WriteFunctionOrProgram函式
AppendProgramMin函式在程式碼尾部加上CRC校驗:
圖3-9 MyCodeSign函式
在WriteFunctionOrProgram函式中呼叫AllocateProgram函式向儀表寫入程式:
圖3-10 AllocateProgram函式
此時對資料包進行一次封裝,現在資料包為:
圖3-11 Ts_exec函式
Ts_exec函式負責一層資料包封裝,此時資料包為:
在Ts_exec函式中呼叫tcm_exec函式(參見圖3-5),此時資料包為:
Tcm_exec呼叫udp_exec函式,最終呼叫sock.send函式通訊。
3.1.3 上傳有效載荷
上傳有效載荷與上傳PresetStatus流程相同,在此不再贅述,有效載荷的資料包結構為:
3.2 模組分析
“海淵”(TRISIS)構建了精簡的TriStation通訊框架,框架包含模組TsHi.py、TsBase.py、TsLow.py、TS_cnames.py。除框架外,“海淵”(TRISIS)還包含一個Script_test.py指令碼,此指令碼使用TriStation通 信框架連線到Tricon,並注入載荷。
3.2.1 Script_test.py分析
Script_test.py是使“海淵”(TRISIS)真正實現功能的模組,Script_test.py檔案小巧,其通訊功能的實現主要依賴TriStation協議支援庫。由於TriStation協議目前為止仍是閉源協議,這些支援庫極有可能為 “海淵”(TRISIS)背後攻擊者花費精力逆向得來,如果要對TriStation協議進行深入瞭解,對涉及的庫檔案進行分析是很好的選擇。
Script_test.py與通訊有關程式碼主要實現了程式碼上傳、尋找儀表系統和利用庫函式進行通訊的功能(參見圖3-12、3-13、3-14)。
圖3-12 程式碼上傳
圖3-13 尋找儀表系統
圖3-14 利用庫函式進行通訊
攻擊步驟說明:
Script_test.py指令碼首先嚐試連線Tricon儀表系統,當不帶引數啟動時,直接廣播搜尋可識別TriStation協議的裝置——Tricon儀表系統:
圖3-15 廣播搜尋Tricon儀表系統
一旦尋找到目標,將上傳PresetStatus程式確定此目標是否可被利用;確定可被利用後,上傳inject.bin和imain.bin兩個主要載荷,篡改圖表,以達到破壞或監控目的;最後,上傳無用程式碼覆蓋載荷消除痕跡。
3.2.2 TsHi.py分析
TsHi.py是框架的高階介面,允許讀寫函式和程式,以及檢索專案資訊和與植入有效負載的互動(如下所述),其包括SafeAppendProgramMod函式,該函式可獲取程式表,讀取程式和函式,並將提供的shellcode附 加到現有的控制程式,它還在必要時處理CRC32校驗和。
從函式名我們可以輕易猜出每個函式的作用,“海淵”(TRISIS)只使用了其中的SafeAppendProgramMod函式來上傳其載荷。
圖3-16 SafeAppendProgramMod函式檢查目標狀態
之後,此函式獲取目標系統中已上傳的程式列表及函式數量。最後用AppendProgramMin函式上傳載荷,並執行。
3.2.3 TsBase.py分析
TsBase.py主要充當高階介面和低階TriStation功能程式碼之間的轉換層,以及用於上載和下載程式或獲取控制程式狀態和模組版本等功能的資料格式:
3.2.4 TsLow.py分析
TsLow.py可實現將上層製作的TriStation資料包通過UDP傳送到Tricon通訊模組(TCM)的功能的最底層,還包括通過向1502埠傳送UDP“ping”廣播訊息來自動發現Tricon控制器。
3.2.5 TS_cnames.py分析
TS_cnames.py包含TriStation協議功能和響應程式碼以及關鍵開關和控制程式狀態的命名查詢常量。
圖3-17 狀態碼截圖(部分)
4、分析小結
“海淵”(TRISIS)惡意程式碼呈現出了一些值得關注的特點,其開發者深入瞭解相關工控產品的控制協議,除了上載到PLC中的二進位制模組外,其他框架和功能程式碼全部採用指令碼編寫,非常容易被改造和加工。而其打擊點則在作 為工業控制系統的生產安全監測單元的SIS上。
作為針對工業系統攻擊的惡意程式碼,“海淵”(TRISIS)很自然的會被與“震網”(Stuxnet)和“烏克蘭停電”等攻擊關鍵基礎工業設施的事件相比較。
與“震網”龐大的惡意程式碼工程相比,“海淵”(TRISIS)看起來相對簡單。震網攻擊對於離心機整體控制機制的介入是極為深入的,這本身也源自鈾離心工藝處理的複雜性,基於攻擊者所要達成的複雜的攻擊目 的(鈾無法達到武器級要求、大量損毀離心機)、攻擊的隱蔽性攻擊和攻擊需要達成的階段持續性。震網是一個支撐完整戰役過程的惡意程式碼。相比之下,儘管“海淵”(TRISIS)小巧的令人可怕,但其更像一個靈巧的“戰鬥部”,其在攻擊行動中,可能是與其他的攻 擊植入手段和惡意程式碼配合使用的。對“海淵”(TRISIS)的編寫者來說,其核心資源和成本消耗,主要是對SIS系統達成深入分析瞭解。
“海淵”(TRISIS)的攻擊方式與烏克蘭電網遭遇攻擊停電事件的明顯差異是“海淵”(TRISIS)攻擊的位置更加縱深。烏克蘭停電的攻擊效果是通過直接在SCADA控制介面上拉閘達成的,粗暴而有效,其並不依 賴於深度解析和篡改控制指令。儘管烏克蘭停電事件中,攻擊者也篡改了遠端變電站串列埠乙太網關中的韌體,但這一操作目的是為了導致已經被“拉閘”的遠端變電站不能被遠端合閘恢復。而“海淵”(TRISIS)的打擊點,則是為PLC重置新的邏輯,而且其攻擊的是安全 儀表系統。
從防禦工作來看,由於“海淵”(TRISIS)以通過偽裝為SIS的日誌軟體獲得被執行的機會,因此重要的防禦點即在對軟體供應鏈的管控上。應在採購階段,嚴格落實供應鏈的安全管控,從源頭遏制危害。在工業 系統的運維中,針對工控系統環境的新裝置安裝上線、軟體的釋出升級、運維手段的接入等,都應進行全面的前置檢查和移動介質接入管控。
與“震網”、“烏克蘭停電”事件類似的是,“海淵”(TRISIS)攻擊依然是以獲得關鍵PC節點為攻擊入口的,這一特點是具有普遍性的。而一旦關鍵PC節點淪陷,攻擊已經針對生產系統實施了縱深影響,則極 難防禦。對於工業基礎設施來說,做好生產網路和辦公網路中的PC端點防禦是一個必須做好的基礎性工作,對於重要PC節點必須形成嚴格的依託白名單的主動防禦機制。
從現狀來看,大部分工業控制系統對效率效能的考慮遠多於安全考慮,而安全考量中,更多依然是以傳統的應對事故視角,而非應對攻擊視角。做好工業系統的安全防禦工作,必須按照三同步的原則進行,在系統 規劃、建設、運維的全週期考慮網路安全問題。這是一個複雜和系統的工作,在可管理網路的基礎上,建設可防禦的網路,推動從基礎結構安全、縱深防禦、態勢感知與積極防禦到威脅情報的整體疊加演進。這個過程需要大量基礎紮實的工作和預算投入。對已有系統的 安全改造,因為涉及到生產業務的連續性、穩定性,可能牽扯到更多的問題。
關於對工業系統的安全問題和防禦,安天在“震網”、“烏克蘭停電”等事件的分析中,已經有過很多的探討,我們會為使用者提供更系統的建議和解決方案。
附錄一:參考資料
[1]Dragos :TRISIS Malware——Analysis of Safety System Targeted Malware
ofollow,noindex" target="_blank">https://dragos.com/blog/trisis/TRISIS-01.pdf
[2]Ics-cert :MAR-17-352-01 HatMan—Safety System Targeted Malware (Update A)
https://ics-cert.us-cert.gov/sites/default/files/documents/MAR-17-352-01 HatMan – Safety System Targeted Malware (Update A)_S508C.PDF
[3]《烏克蘭電力系統遭受攻擊事件綜合分析報告》
http://www.antiy.com/response/A_Comprehensive_Analysis_Report_on_Ukraine_Power_Grid_Outage/A_Comprehensive
_Analysis_Report_on_Ukraine_Power_Grid_Outage.html
[4]《對Stuxnet蠕蟲攻擊工業控制系統事件的綜合分析報告》
http://www.antiy.com/response/stuxnet/Report_on_the_Worm_Stuxnet_Attack.html
附錄二:HASH