編譯|天地和興工業網絡安全研究院【編者按】工業軟件是制造業的信息化利刃,是聯系傳統工業生產與現代信息化的紐帶。作為智能制造的承載,工業軟件已深度融入工業設計和制造流程。從汽車和航空電子設備到制藥和食品生產,機器人和其他可編程工業機械,現代制造業對可編程機械的依賴度很高。然而,這些可編程機械大多都是在數十年前設計的,至今仍得到廣泛使用,各個制造商還為各自的機器構建了定制的專有編程語言和獨特的生態系統。傳統的、專用的、零散的技術,導致惡意的自動化邏輯且易受攻擊。對此,趨勢科技與米蘭理工大學研究人員共同發布了《工業編程中易受攻擊的惡意代碼》研究報告,表明惡意攻擊者可利用工業可編程環境中存在的漏洞執行惡意操作,并持續潛伏在智能工廠中。研究人員發現,利用漏洞可能引起的后果包括:竊取機器人數據、通過網絡更改機器人的動作、動態惡意軟件、非常規遠程代碼執行漏洞、有針對性的自我傳播惡意軟件。同時,研究人員提出短期、中期及長期緩解或解決該工業編程環境問題的策略和建議。機器人和其他可編程工業機械是制造業的支柱。沒有它們,現代經濟所依賴的大規模和快節奏的生產將根本不可能。從汽車和航空電子設備到制藥和食品生產,關鍵行業都依靠這些機器來執行精確而高效的動作。但是,盡管現代制造業對它們的依賴程度很高,但這些機器本身都依賴于數十年前設計的傳統技術。盡管是在相對遙遠的過去發明的,但驅動它們的技術仍在當今得到廣泛使用。他們的各個制造商還為各自的機器構建了定制的專有編程語言和獨特的生態系統。對此,趨勢科技與米蘭理工大學共同發布《流氓自動化:工業編程中的易受攻擊和惡意代碼》研究報告,并表示這些條件意味著這些機器可能具有漏洞,知識淵博的攻擊者可能會利用這些漏洞執行惡意操作,并在智能工廠中持續存在。
一、傳統技術與智能工廠
可編程工業機器用于全球智能工廠中的復雜自動化例程。它們針對特定的重復性任務進行了編程,例如拾取和放置物品、移動負載、焊接和切割。驅動這些機器的技術與用于創建網站或移動應用程序的更知名的技術有很大不同。控制過程工程師和系統集成商開發了自動化任務程序,這些程序使用供應商特定的編程語言來定義機器的動作。對此,基于對八種流行的工業自動化編程語言的技術分析,研究人員發現,導致漏洞或被惡意行為者濫用的根本原因是強大的原語組合,這些原語允許對低級系統資源的不間斷訪問,從而創建傳統掃描程序無法檢測到的新的自我傳播惡意軟件。盡管這些原語本身并不代表安全風險,但它們可能被誤用,它們會嚴重影響機器人的安全性、操作人員的安全性以及連接的系統。這些問題很難解決,因為它們是機器設計所固有的問題,并且不會輕易取代舊的編程環境。不幸的是,無法解決這些安全漏洞可能會造成高昂的破壞性后果。攻擊者可以利用它們在智能工廠中默默進行監視和偵察。或者,攻擊者可能會采取更激進的行動,改變產品質量、停止生產線、甚至竊取有價值的知識產權。但是,攻擊者需要擁有大量資源并深入了解目標的工作環境。只有高級的國家級攻擊者才能嘗試這種性質的黑客攻擊。
一
核心問題:傳統的、易受攻擊的、零散的技術
即使驅動機器人和其他可編程工業機器的自動化技術與運行在服務器上的經典web應用程序完全不同,但也可能受到完全相同的已知漏洞類別(如路徑遍歷和代碼注入)的影響,并可能成為惡意軟件的攻擊目標。對此,研究人員將說明用于工業自動化的傳統技術如何為惡意軟件作者提供一套全新的被忽視的武器和漏洞利用場所。漏洞和惡意軟件是任何安全事件背后的兩個主要因素。如果沒有漏洞,攻擊者將無法進入目標工業系統的第一步。如果沒有編寫和運行惡意軟件的可能性,攻擊者將無法操作攻擊并實現持久化。有了漏洞和新的編寫和隱藏惡意軟件的方法,高級惡意行為者可以獲得訪問權限并在工業環境中持續存在。在用于控制過程自動化的編程和執行環境中,完全缺乏資源隔離(例如權限系統)意味著沒有防止攻擊發生的權宜之計。傳統編程語言工業自動化程序、腳本或任務程序依賴于驅動當前和未來智能工廠的傳統技術。它們是控制工業機器人和類似可編程機器自動運動的程序。它們是由現場專家使用特定于供應商的編程語言編寫的,稱之為“工業機器人編程語言”(“IRPLs”)或簡單的“傳統語言”。易受攻擊或惡意的自動化邏輯像任何工程工件一樣,任務程序可能包含不安全的代碼。
可能存在漏洞,即錯誤引入的編程錯誤,使系統易受攻擊。或者,它們可能包含惡意功能,這些功能本質上是為惡意目的編寫的代碼(例如,接管工廠進行勒索攻擊)。之所以可以在自動化例程中隱藏自定義惡意代碼,是因為傳統語言提供了豐富而復雜的功能,而不僅僅是簡單的自動化指令(例如向上移動機械臂、撿起工件、向下移動機械臂、釋放工件)。這些豐富而復雜的特性使控制過程工程師可以自由地編寫任務程序惡意代碼有什么用,執行諸如從網絡接收數據或對文件進行讀寫等一系列操作。然而,由于這些平臺未實現對這些高級功能的中介訪問,因此又為新的漏洞創造了基礎,并允許惡意行為者濫用這些漏洞來編寫惡意軟件。零碎的專有技術通用和主流編程語言如C、C++、C、java、PHP和都有代碼檢查器,可以發現不安全的模式。然而傳統語言不存在此類工具,因此很難自動化進行安全檢查。IRPLs不是基于常見的運行時或體系結構,比如主流操作系統。每個OEM定義自己的語言,還定義運行時和任務程序將運行的底層環境。有些是基于實時操作系統(RTOS),但總體上沒有標準化。每個IRPL的語義也是唯一的,并且與通用編程語言顯著不同。有些功能,如IRPLs中的字符串操作或加密操作,要么不存在,要么不如傳統語言那樣先進。盡管這樣做會使編程不易出現漏洞,并為適當的安全措施提供正確的構建塊。
二
根本原因:對系統資源的強大、非中介訪問
2017年,研究人員研究了典型的工業機器人的攻擊面,并展示了軟件堆棧中的一系列漏洞如何導致完全的攻擊損害,甚至允許攻擊者完全控制機器人。在這項研究中,研究人員增加了一部分軟件攻擊面,并展示了控制過程工程師如何像計算機程序員那樣引入漏洞。
圖1 軟件堆棧的層次(包括自動化任務程序)以及它們各自的漏洞可能會影響到什么如圖1所示,攻擊者可以發現并利用操作系統或工業機器固件、應用程序接口(例如用于創建、構建和執行代碼的編譯器或解釋器)或應用程序(如機器上運行的服務)中的漏洞。研究人員對八個工業機器人平臺的技術分析揭示了自動化任務程序如何形成軟件堆棧的另一層,以及它們的漏洞如何在軟件堆棧的較低層被利用。研究人員發現,這些問題的根本原因是允許對資源進行低級訪問(如網絡和文件系統訪問)的強大功能和缺乏隔離(權限系統)的結合。在此,研究人員將重點介紹如果使用不當或可能被濫用來實施惡意軟件的三個主要功能。訪問文件和目錄標有“文件系統”和“目錄列表”的語言具有打開、讀取和寫入文件(訪問配置參數、寫入日志信息、存儲程序狀態)或目錄的低級功能。雖然這些功能有明顯的合法用例,但它們可能被濫用來竊取數據并加載攻擊向量(如利用漏洞的有效載荷)。例如:利用這些功能讀取機器人文件系統中存儲的敏感文件的易受攻擊的程序惡意代碼有什么用,可能被攻擊者利用來竊取機密,包括寶貴的知識產權。知識產權通常是國家級攻擊者的目標,在地下市場以非常高的價格進行交易。在運行時從文件加載和運行代碼標有“從文件加載模塊”或“按名稱調用”的語言具有與通用語言的函數指針類似的功能。
它們簡化了動態調用過程,允許控制過程工程師編寫模塊化程序。這些是最強大、最危險的功能之一,因為它們允許在運行時更改任務程序的流程。這些功能的合法用例是允許控制過程工程師編寫可重用的程序,并將其組合成復雜的自動化程序。然而,它們可能被濫用以實現類似的惡意軟件,或者可能是RCE漏洞的原因。示例:一個任務程序從從未用加密哈希驗證過的文件中加載自動化例程(在這些環境中很少使用加密原語)可以很容易地隱藏惡意功能,而這些功能將無法被檢測到,除非有專門針對此類情況的文件掃描程序。因此,攻擊者可以保持持久化,甚至隨著時間的推移升級其惡意軟件。通信功能所有語言都具有通信功能,這使得任務程序能夠促進機器人與外部系統的接口。接口操作的例子包括從外部程序接收實時位置坐標,與視覺系統交互,以及向外部系統發送反饋以進行日志記錄。通信原語是必不可少的,但是在編程級別完全缺乏強大的身份驗證和訪問控制,使得控制過程工程師很難創建與外部世界通信的安全程序。工業機器人控制器具有身份認證和訪問控制系統,但它們是粗粒度的。這意味著他們不會考慮攻擊者可以利用自動化代碼中的漏洞或在現有程序中隱藏惡意代碼。因此,工業機器人控制器的安全特性允許或拒絕程序從頭到尾運行。與現代應用程序和操作系統一樣,目前還沒有內置的基于身份驗證數據交換的白名單或黑名單連接的方法。
二、攻擊后果及影響(案例)
一
竊取機器人數據
路徑遍歷漏洞可能具有未經確認的網絡數據流的任務程序,可使攻擊者能夠竊取記錄目標機器人運動的日志文件,該日志文件可能包含諸如知識產權(例如產品構建方式)之類的敏感信息。然后,攻擊者可以訪問其他目錄中的其他文件(包括包含身份驗證機密的文件),并使用這些文件最終訪問計算機的控制臺。
圖2 易受攻擊的自動化邏輯:從未經確認的(例如文件、網絡、串行)數據到讀/寫文件訪問
二
通過網絡更改機器人的動作
“運動服務器”自動化程序可驅動連接的機器人。攻擊者可以利用其中一個程序中的漏洞進行攻擊,并通過欺騙網絡數據包來移動機器人。在為所有主要工業機器人編寫的開源項目ROS-中,如果未正確配置安全系統,則可能發生這種類型的操縱。在正確配置和部署安全系統的情況下,攻擊者將很難造成破壞性的移動,盡管攻擊者仍然可能會造成意想不到的小動作并中斷生產過程。
圖3 安全系統配置不當時漏洞的影響:機器人的“手”,即末端執行器,就位(左)和脫落后的末端執行器(右)趨勢科技和米蘭理工大學研究人員已與ROS-進行協調,以緩解他們發現的影響控制工業機器人的ROS-驅動程序的安全性問題。對此,ROS-聯盟發布了一份指導性報告,以幫助用戶提高其安全性。美國網絡安全和基礎設施安全局(CISA)的工業控制系統網絡緊急響應小組(ICS-CERT)也發布了一份報告,確認了其調查結果的嚴重性,并確認了建議的緩解策略。
三
動態惡意軟件
在該場景中,研究人員假設機器人運行一個由系統集成商編寫的任務程序,工廠認為該程序是可信的。這意味著系統集成商創建的任何任務程序的部署都不需要對程序代碼進行特殊的安全檢查。但是,系統集成商可能已受到危害,或者所討論的任務程序可能來自配置錯誤或易受攻擊的網絡連接存儲。低水平攻擊者可以直接替換任務程序來改變機器人的自動化程度,并且很有可能被注意到。但高級攻擊者知道,如果任務程序是用支持動態代碼加載和網絡原語(例如ABB、Comau、Denso或Fanuc)的編程語言編寫的,他們可能會選擇更隱蔽、更持久的方法。高級攻擊者只需稍微修改原始任務程序的源代碼,就可以包含一個網絡例程,該例程從外部(或隱藏文件)獲取惡意代碼,然后使用動態加載將其作為正常自動化循環的一部分運行,有效地創建了一個惡意軟件刪除程序,如圖4所示,是研究人員用工業機器人的編程語言編寫的。POC表明,可以使用外部程序將代碼加載到機器人控制器并執行它。
圖4 研究人員用工業機器人編程語言編寫的惡意軟件刪除程序從這里開始,攻擊者可以下載并執行任何第二階段的惡意軟件,這些惡意軟件可能會執行進一步的惡意操作,如網絡目標枚舉、文件收集和數據過濾。
四
非常規遠程代碼執行漏洞
研究人員故意用惡意功能編寫了如圖4所示的代碼,這是通過濫用動態代碼加載實現的。另一面是一個良性的程序,該程序合法地使用此類特性來動態加載代碼,或者如圖5所示,根據外部輸入調用某些功能。控制過程工程師可能已經創建了該程序,但可能忘記了對加載的代碼進行完整性檢查。
圖5 易受攻擊的邏輯示例:從未確認(例如文件、網絡、串行)數據到命令調用
因此,如果機器人運行如圖6所示的代碼,則很容易受到(部分)遠程代碼執行(RCE)的攻擊。幸運的是,研究人員只發現了這此類漏洞的一個實例,且僅在一個演示程序中發現了它。研究人員希望該程序永遠不會被用于教授如何編寫代碼,或者更糟的是,生成產品代碼。如圖5所示,這意味著攻擊者可以在機器人上調用任意功能,并對物理世界產生實際影響,具體影響可能因系統的配置和部署方式而異。在錯誤的時間調用合法的自動化例程至少會導致一些停機時間。
圖6 可能導致遠程代碼執行的易受攻擊的代碼加載程序
五
有針對性的自我傳播惡意軟件
研究人員發現,傳統編程是如此強大,以至于能夠創建具有蠕蟲行為的目標惡意軟件,并能夠在自動化平臺的邏輯級別進行自我傳播。一旦感染新機器人后,蠕蟲將開始掃描網絡以尋找其他潛在目標,并利用網絡漏洞進行傳播。一個更全面的惡意軟件還包括一個文件收集例程,以泄露在每個受感染目標上發現的所有相關數據。研究人員發現,這種自我傳播的惡意軟件在演示程序任務程序中傳播所需的大多數先決條件,部分易受遠程代碼執行的影響,即攻擊者可以調用代碼中已聲明的任意功能。
圖7 研究人員編寫的蠕蟲惡意軟件POC的網絡掃描程序
三、緩解策略及安全編程準則
一
緩解方法
研究人員的發現與當前產品難以改變的設計選擇有關。因此,研究人員預計在不同的階段實施不同的緩解方法。如圖8所示,研究人員提出這些方法供OT工程師、系統集成商和原始設備制造商考慮或部署。
圖8 研究人員在不同階段提出的緩解方法,以及誰可以考慮或部署這些方法
研究中提出的問題只能通過長期解決方案來完全解決,但是控制過程工程師、系統集成商和原始設備制造商(OEM)可以采用短期和中期緩解策略來增強安全性工業編程環境。短期措施?使用網絡分段來隔離需要處理來自其他網絡的數據的計算機。?采用網絡和端點保護,以最小化漏洞利用或惡意代碼感染的風險。?實施適當的源代碼管理過程,包括自動或定期進行手動源代碼審查。中期措施?開發安全性庫(例如密碼原語),使開發人員可以輕松實現輸入驗證和身份驗證。?提供運動服務器的參考實現,以允許機器以高級方式接收經過消毒的運動數據。?實施積極的修補脆弱的任務計劃為周期性的源代碼審查中發現的缺陷補救措施。長期措施?通過設計確保主要通過將安全功能集成到編程語言中來確保下一代可編程工業機器的安全。?在運行時,使用機器控制器上的權限系統實現細粒度的權限分離。?實施代碼簽名,以確保未篡改工業機器上運行的代碼。
二
安全編程清單
與處理不可信輸入和輸出的任何軟件應用程序一樣,自動化任務程序必須用適當的安全機制進行設計、實現、配置和部署。安全指南在圖9中進行了概述。
圖9 處理不可信數據的工業自動化任務程序的安全指南摘要
在編寫任務程序時,控制過程工程師和系統集成商應記住以下基本檢查清單:? 將工業機器視為計算機,將任務程序視為強大的代碼。? 驗證所有通信。? 實施訪問控制策略。? 執行輸入驗證(如適用)。? 始終執行輸出消毒。? 在不暴露細節的情況下實施正確的錯誤處理。? 有適當的配置和部署程序。? 實現工業自動化代碼的變更管理過程。
三
身份驗證和訪問控制
與其他系統(通過網絡、串行端口或總線)通信的任務程序應驗證所有消息,以確保它們來自授權方,如圖10所示。然而,這一原則也有例外。一方面,來自連接到機器人工作站的傳感器的簡單數據很少會成為攻擊者控制的輸入。但是,在某些情況下,攻擊者能夠利用傳感器跳過隔離,并將數據注入機器人的自動化程序中。
圖10 使用訪問控制(如未經授權的功能調用)并進行RCE攻擊預防即使有網絡級別的安全措施(例如防火墻)可以確保機器人只能從指定的端點接收數據,任務程序也應該將輸入視為不可信的。這是為了保護授權的端點不受危害,在這種情況下,攻擊者可以與任務程序通信。在語言中沒有可靠的加密支持來實現身份驗證可能會導致保護不足。但是,簡單的身份驗證會提高攻擊者對基線的限制(無身份驗證)。與通用編程語言一樣,需要IRPLs中適當的密碼支持和庫來彌補這一差距。根據任務程序的邏輯,控制過程工程師和系統集成商可能需要準備一個訪問控制策略,例如,是否應該平等對待所有經過身份驗證的請求。例如,如果他們正在實現一個需要文件訪問的任務程序(例如,讀取或寫入日志數據),則必須將范圍僅限于特定目錄。
四
輸入驗證
通過網絡、串行端口或總線與其他系統通信的任務程序應該驗證入站數據的內容,以確保它們符合預期的格式和內容,如圖11所示。
圖11 通過輸入驗證,意外數據被丟棄,從而防止任何試圖影響機器人移動的嘗試
實現正確的輸入清理只需要基本的字符串和數據操作原語和比較運算符(例如,相等性測試)。正則表達式支持可能會有很大幫助,但必須小心使用,因為攻擊者可能會手工編寫特定的輸入,從而導致正則表達式引擎崩潰。
五
錯誤處理
雖然在開發和測試過程中很有用,但未處理的錯誤可能會向正在探測目標或試圖利用漏洞的攻擊者泄露重要的內部細節。因此,應該進行適當的錯誤處理和輸出清理,以隱藏這些細節,并使攻擊者更難從外部對程序邏輯進行逆向工程,如圖12所示。
圖12 通過正確的錯誤處理和輸出清理,在偵察和準備階段對攻擊者有用的敏感信息可以被隱藏
每種編程語言都有適當的錯誤處理和調試功能,可以對這些功能進行調整,以便在生產環境中有選擇地顯示或隱藏敏感的細節。這些功能還可以將它們重定向到單獨的文件或通過同一網絡無法訪問的專用日志記錄工具。例如,Comau機器人的編程語言PLD2支持“錯誤事件”的概念,其形式為“when do[…]”,并允許用戶進一步處理特定的錯誤。同樣,Denso的語言定義了一系列錯誤代碼,并允許用戶等待特定的錯誤條件。由于我們的示例并非詳盡無遺,研究人員建議用戶查閱所使用的編程語言手冊中的錯誤處理功能,并熟悉其在測試平臺程序上的輸出(因為手冊可能不會顯示示例輸出的全部細節)。
六
輸出和日志清理
寫在控制臺、串行端口、日志記錄工具或文件上的輸出可能包含敏感的詳細信息,例如IP地址、密碼、會話令牌和API密鑰,如圖12所示。考慮到行業中IT/OT集成度的不斷提高,有缺陷的輸出凈化可能會導致嚴重的數據泄漏。重要的是要確保執行打印操作的所有代碼(例如,到屏幕和文件)被刪除或在不必要時忽略掉。程序員通常使用(或濫用)打印功能而不是適當的調試或日志記錄工具。這些工具可以很容易地從一個地方關閉,而不是必須單獨刪除每一行代碼。除了泄漏數據外,未經確認的輸出還可能為注入漏洞提供場所。如果一個程序的輸出被另一個沒有正確驗證輸入的程序處理,第一個程序的未經確認的輸出可能會觸發第二個程序中的漏洞。
七
配置、依賴關系和部署
確保任務程序在可能的最佳條件下運行是安全配置和部署的核心。例如,在過時的控制器軟件或操作系統上運行的完全安全的任務程序會打開任務程序本身無法阻止的其他攻擊可能性。所有配置參數(包括IP地址、運動變量和文件位置)都應該與任務程序的實際代碼清楚地分開,如果可能,最好保存在安全的內存或磁盤位置。例如,Kuka編程語言將程序文件(.src)與數據定義(.dat)和后臺任務(.sub)分開。這種默認的分離促進了良好的配置處理和部署實踐。我們建議其他語言的用戶采用類似的做法。最后,由于可以在所有的IRPLs中編寫可重用的庫代碼,所以檢查導入了哪些依賴項非常重要。安全事件表明,由于包含不安全的庫代碼而傳播的漏洞,以及通過依賴關系樹或通過感染項目開發文件傳播的惡意軟件的影響。
八
控制過程代碼的變更管理
研究人員與來自不同行業的20位領域專家進行了交談,包括自動化工程師、系統集成商和裝配線操作員。在咨詢這些專家后,研究人員發現控制過程代碼的生命周期相對簡單。代碼被創建(主要由系統集成商或臨時程序員創建)、測試和部署。現如今大多數自動化代碼是靜態的,只有在重新設計裝配線時才進行升級。但市場正朝著更靈活的制造流程發展,擁有模塊化和可重新配置的機器人工作站,這些工作站可以自我組織、升級和更改代碼,以滿足生產期限。在這種情況下,對代碼具有完全的可見性和控制能力至關重要。10年前,跟蹤代碼依賴關系進行安全分析聽起來是不必要的。如今,軟件生命周期中不僅考慮了持續集成工具(如的安全特性),而且依賴性跟蹤也通過軟件物料清單(SBOM)得到改進。工業自動化世界應該朝著類似的方向發展,開始實施源代碼生命周期管理。幾十年前的工程師和設計師無法預料到當今存在和活躍的各種網絡威脅。但是,既然這些問題已經暴露出來,并且通過設計實現安全性的重要性變得越來越明顯,制造業的參與者就有機會設計未來智能工廠的安全性。參考資源:1.Trend Micro & di ,Rogue , and Code in g,2020.082.