標籤:

TRITON惡意軟體攻擊工業安全系統

簡介

FireEye的Mandiant調查部最近響應了一個關於關鍵設施企業的應急事件,事件中攻擊者用惡意軟體來控制工業安全系統(industrial safety systems)。被攻擊的工業安全系統能提供工業過程的急救關機功能。此次事件的攻擊者具備對設備造成物理傷害和不可逆轉的關機操作的能力。TRITON惡意軟體是與Triconex Safety Instrumented System(SIS)控制器通信的攻擊框架。FireEye分析說,攻擊應該是某個國家發起的而不是某個威脅源

TRITON是少數被識別的針對工業控制系統(industrial control systems, ICS)的惡意軟體家族。我們TRITON與Stuxnet、Industroyer是有傳承關係的,都可以阻止安全機制執行原來的功能。

表1 TRITON惡意軟體描述

事件總結

攻擊者獲取SIS工程站的遠程訪問許可權後,利用TRITON攻擊框架對SIS控制器進行重編程。在本次事件中,一些SIS控制器進入failed safe狀態,該狀態下會自動關閉工業生產過程,並促使資產所有者進行調查。調查結果顯示,當冗餘處理單元之間的應用代碼沒有完成有效性檢查時,SIS控制器會進入safe shutdown狀態,會產生MP診斷失敗消息。

攻擊者對設備可以產生物理傷害的原因有:

·修改SIS可以阻止SIS正確運行,增加了造成物理傷害的failure的概率。

·TRITON可以修改SIS控制器中的應用內存,這會導致有效性檢查失敗。

·TRITON運行的這段時間會產生failure。

·迄今沒有發現現存的和外部條件在事件中引起錯誤(fault)。

過程式控制制和安全儀錶系統SIS

圖1 ICS架構

現在的工業處理控制和自動化系統依賴許多複雜的控制系統和安全功能。這些系統和功能就叫做ICS(Industrial Control Systems工業控制系統)和OT(Operational Technology操作技術)。分散式的控制系統(DCS)提供給操作員遠程監控和控制工業過程的能力。這是一個計算機控制的系統,包括計算機、軟體應用和控制器等。工程站用於配置、維護和診斷控制系統應用和其他控制系統裝備。

SIS是獨立監控控制過程的狀態的自動控制系統。如果某個過程超過了定義為危險狀態的參數值,SIS就會嘗試讓過程進入safe狀態,或者自動對過程進行safe shutdown。如果SIS和DCS控制器都失效了,最後一道防線就是的工業facility的設計,包括對設備的機械保護、物理報警、緊急響應程序和其他緩解威脅情形的機制。

資產所有者用不同的方法來將DCS與SIS通信。傳統的方法是依賴於通信基礎設施和控制策略的分割原則。在過去的10年里,考慮到成本低、使用方便、DCS和SIS交換信息方便等因素,在設計中將DCS和SIS集成到一起是一種趨勢。TRITON正是利用了這一點,證明了DCS和SIS集成時通信的風險。

安全儀錶系統威脅模型和攻擊場景

圖2 Cyber Security和Safety之間的關係

針對ICS的破壞性攻擊的生命周期與其他類型的網路攻擊類似,但也有不同。首先,攻擊者的目標是破壞運作過程而不是竊取數據。第二,攻擊者必須執行OT偵測,也要有足夠多的專業的工程知識才能理解要控制的工業過程,並成功操作它。

圖2是在過程式控制制環境下cyber security和safety控制的關係。即使cyber security措施時效,safety控制可以抵擋一定的物理破壞。為了最大化物理影響,攻擊者需要繞過一些安全控制。

SIS威脅模型強調了攻擊者已成功黑掉SIS的一些可用選項。

Attack Option 1: 用SIS 來關閉過程

· 攻擊者可以對SIS邏輯重編程,導致trip或關閉一個處於safe狀態的過程,或者說,引入假陽性(false positive)。n· 過程宕機和宕機後的複雜流程帶來的經濟損失。n

Attack Option 2: 對SIS重變成允許unsafe狀態

· 攻擊者可以對SIS邏輯進行重編程來允許unsafe條件持續。n· 因為SIS功能缺失導致的風險增加,最終導致對物理的結果。n

Attack Option 3: 對SIS進行重編程來允許unsafe狀態,即使用DCS來創建unsafe狀態

· 攻擊者可以操作過程進入unsafe狀態,阻止SIS正常運行。n· 對人身安全、環境和設備的損害和程度取決於工業過程和工廠設計的物理限制。n

攻擊意圖分析

攻擊者的長期目的是對培養造成物理破壞的能力。因為攻擊者在DCS上站住腳之後,本來可以操作過程或者關閉工廠系統,但是攻擊者選擇了黑近SIS系統。黑進DCS和SIS系統可以使攻擊者培養和實施帶來最大可能破壞的物理攻擊。

在SIS網路中,攻擊者用TRITON框架與SIS控制器進行交互,使用的協議是TriStation協議。攻擊者可以通過halt命令或上傳有漏洞的代碼到SIS控制器來使過程停止。攻擊者的目的不是讓過程停止或者關閉這麼簡單,而是引發物理破壞這樣的特定結果。

惡意軟體能力總結

TRITON攻擊工具有很多的特徵,包括讀寫程序、讀寫單個函數、查詢SIS控制器的狀態。但是在trilog.exe樣本中只使用了部分功能。TRITON惡意軟體能與Triconex SIS控制器進行通信,用攻擊者定義的payload對SIS控制器進行重編程。分析的TRITON樣本在Triconex的執行列表中增加了攻擊者提供的程序。

攻擊樣本並沒有替換原來的程序,應該是希望控制器能夠繼續運行。如果控制器報錯,TRITON就會嘗試把它變回running狀態。如果控制器沒有在一定的時間窗口內恢復,樣本就會用無效數據覆寫惡意程序來避免被追蹤。

建議

資產所有者想要防禦上面提到的攻擊能力,可以考慮下面幾點:

· 如果技術上可行,把安全系統網路和過程式控制制、信息系統網路隔離開。能夠對SIS控制器編程的工程站不應該對任何的DCS過程和信息系統網路雙宿主機。n· 用提供物理控制的硬體特徵來對安全控制器進行編程。通常採取物理鑰匙控制開關的形式。n· 對key保存位置的變更進行變更管理步驟。對現在的密鑰狀態進行定期審計。n· 依賴SIS提供的數據的應用的網路連接使用用單向網關而不是雙向網路連接。n· 對可以通過TCP/IP接觸SIS系統的所有伺服器和終端實施嚴格的訪問控制和應用白名單。n· 監控ICS網路流量來檢查意外的通信流和異常活動。n

圖3 Triconex 鑰匙開關

技術分析

圖4 TRITON架構和攻擊場景

TRITON應用在運行Windows操作系統的SIS工程站上。惡意軟體的名字偽裝成合法的Triconex Trilog應用。該應用用於檢查日誌,而且是TriStation應用套件的一部分。惡意軟體通過Py2EXE編譯的python腳本進行傳遞,python腳本依賴於含有標準python庫、開源庫的文件和攻擊者開發的Triconex攻擊框架。應用到控制器的payload中除了可執行文件外,還有2個二進位文件,nject.bin (惡意功能代碼)imain.bin (惡意控制邏輯)。這些文件名都被硬編碼到Py2EXE編譯的python腳本中。

Trilog.exe在命令行中有一個選項,即目標Triconex設備的IP地址。在Triconex設備發現時並沒有用TRITON庫,而對於環境中的每個目標控制器,都需要trilog.exe的實例來單獨調用。一旦調用,trilog.exe就會檢查控制器的狀態,讀取暴露給TriStation協議的配置信息。如果控制器是running狀態,trilog.exe對inject.binimain.bin兩個payload文件進行編碼,並傳遞到通信庫加到控制器程序的內存和執行列表中。

當payload文件插入到Triconex控制器的內存中,腳本就會進行倒計時,周期性地檢查控制器的狀態。如果檢測到錯誤信息,通信庫的方法SafeAppendProgramMod會嘗試用TriStation協議命令重置控制器到之前的狀態。如果這個方法失敗了,trilog.exe會嘗試把dummy程序寫入內存。這是一種反取證技術,用來隱藏Triconex控制器中的攻擊者代碼。

研究人員同時發現惡意軟體有一個條件檢查,可以阻止payload二進位文件保留在環境中。在修復了該條件檢查後,payload二進位文件可以持續保留在控制器內存中,控制器可以繼續運行。

TriStation協議是合法的TriStation應用用來配置控制器的協議。

TsHi是高級介面,允許威脅者的操作者用TRITON框架實施攻擊腳本。暴露的功能是偵查和攻擊。這些函數從用戶處接受二進位數據,處理代碼簽名,檢查校驗和。

TsBase是另一個攻擊模塊,包含TsHi的函數,翻譯檢查者的意圖動作為適當的TriStation協議功能代碼。對特定的函數,還需要對數據打包並整理為適當的格式。

TsLow 是另一個實施TriStation UDP有線協議的攻擊模塊。TsBase庫主要依賴的是ts_exec 方法,該方法獲取函數代碼和期待的響應代碼,對UDP上的命令payload序列化。同時檢查控制器的響應,如果返回的是結果數據結構就說明success,如果返回False對象就代表failure狀態。

TsLow也暴露了用來檢查與目標控制器連接的連接方法。如果沒有目標喚醒,就會運行設備發現功能detect_ip。使用TriStation協議上的ping消息廣播來發現哪些控制器通過調用腳本的路由器是可達的。

IoC

檢測規則

rule TRITON_ICS_FRAMEWORKn{n meta:n author = "nicholas.carr @itsreallynick"n md5 = "0face841f7b2953e7c29c064d6886523"n description = "TRITON framework recovered during Mandiant ICS incident response"n strings:n $python_compiled = ".pyc" nocase ascii widen $python_module_01 = "__module__" nocase ascii widen $python_module_02 = "<module>" nocase ascii widen $python_script_01 = "import Ts" nocase ascii widen $python_script_02 = "def ts_" nocase ascii wide n $py_cnames_01 = "TS_cnames.py" nocase ascii widen $py_cnames_02 = "TRICON" nocase ascii widen $py_cnames_03 = "TriStation " nocase ascii widen $py_cnames_04 = " chassis " nocase ascii wide n $py_tslibs_01 = "GetCpStatus" nocase ascii widen $py_tslibs_02 = "ts_" ascii widen $py_tslibs_03 = " sequence" nocase ascii widen $py_tslibs_04 = /import Ts(Hi|Low|Base)[^:alpha:]/ nocase ascii widen $py_tslibs_05 = /modules?version/ nocase ascii widen $py_tslibs_06 = "bad " nocase ascii widen $py_tslibs_07 = "prog_cnt" nocase ascii wide n $py_tsbase_01 = "TsBase.py" nocase ascii widen $py_tsbase_02 = ".TsBase(" nocase ascii wide n n $py_tshi_01 = "TsHi.py" nocase ascii widen $py_tshi_02 = "keystate" nocase ascii widen $py_tshi_03 = "GetProjectInfo" nocase ascii widen $py_tshi_04 = "GetProgramTable" nocase ascii widen $py_tshi_05 = "SafeAppendProgramMod" nocase ascii widen $py_tshi_06 = ".TsHi(" ascii nocase wide n $py_tslow_01 = "TsLow.py" nocase ascii widen $py_tslow_02 = "print_last_error" ascii nocase widen $py_tslow_03 = ".TsLow(" ascii nocase widen $py_tslow_04 = "tcm_" ascii widen $py_tslow_05 = " TCM found" nocase ascii wide n $py_crc_01 = "crc.pyc" nocase ascii widen $py_crc_02 = "CRC16_MODBUS" ascii widen $py_crc_03 = "Kotov Alaxander" nocase ascii widen $py_crc_04 = "CRC_CCITT_XMODEM" ascii widen $py_crc_05 = "crc16ret" ascii widen $py_crc_06 = "CRC16_CCITT_x1D0F" ascii widen $py_crc_07 = /CRC16_CCITT[^_]/ ascii wide n $py_sh_01 = "sh.pyc" nocase ascii wide n $py_keyword_01 = " FAILURE" ascii widen $py_keyword_02 = "symbol table" nocase ascii wide n $py_TRIDENT_01 = "inject.bin" ascii nocase widen $py_TRIDENT_02 = "imain.bin" ascii nocase wide n condition:n 2 of ($python_*) and 7 of ($py_*) and filesize < 3MBn}n

本文翻譯自:fireeye.com/blog/threat 如若轉載,請註明原文地址: 4hou.com/technology/934 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

如何提取Google Chrome中的密碼?
勒索軟體武器庫「再添新軍」,Windows Server Web伺服器安全成災
現在優秀信息安全的公司招實習生標準是什麼?
實用密碼學工具——KDF

TAG:信息安全 |