工業網絡安全公司Claroty研究人員近日發現了一個嚴重的漏洞,未經認證的遠程攻擊者可以利用這個漏洞攻擊西門子旗下的可編程邏輯控制器(PLC)。該漏洞被編號為CVE-2020-15782,是一個高危的內存保護繞過漏洞,允許攻擊者通過網絡訪問TCP 102端口在受保護的內存區域中寫、讀數據。這一遠程可利用漏洞引發了研究者對西門子控制器安全問題的深入思考。
工業巨頭西門子公司表示,該安全漏洞影響其SIMATIC S7-1200和S7-1500 cpu,可通過新的漏洞遠程攻擊其PLC產品。西門子已經為一些受影響的設備發布了固件更新,并為尚未發布補丁的產品提供了變通方案。
根據Claroty公司的說法,該漏洞可繞過通常工程代碼運行的沙箱,直接訪問設備內存,從而在西門子S7 PLC上獲得本機代碼執行。研究人員展示了攻擊者如何繞過保護直接將shellcode寫入受保護的內存中。沙箱逃逸意味著攻擊者可以從PLC的任何地方讀寫,并可用惡意代碼修補內存中現有的VM操作碼,從而對設備進行Root權限的操作。重點強調的是,利用這一漏洞的攻擊將很難被發現。
研究成果的披露是西門子和Claroty公司緊密關系的結果,這不僅促進了工業網絡安全研究團隊和供應商在漏洞披露方面的合作,也促進了整個工業生態系統的安全。西門子和Claroty之間的密切合作包括技術細節、攻擊技術和緩解建議的交流,這些都有助于促成西門子及時發布更新補丁。西門子和Claroty希望,鑒于此漏洞的關鍵性質,用戶應盡快更新S7-1200、S7-1500 CPU,以及其他受影響產品。
一
漏洞簡介及受影響產品
1.1漏洞概況
編號:CVE-2020-15782,在內存緩沖區范圍內對操作的不當限制。CVSS v3.1得分:8.1。在知名漏洞網站vuldb.com上給的基本信息如下。
1.2受影響產品
受影響的設備容易受到內存保護繞過而實施特定的操作。對TCP端口102進行網絡訪問的遠程未經身份驗證的攻擊者可能會將任意數據和代碼寫入受保護的內存區域,或讀取敏感數據以發動進一步攻擊。
5月28日,西門子發布了警告SSA-434534,向用戶通報該漏相關信息。西門子還發布了包括S7-1500、S7-1200的各種產品的更新,建議用戶更新到最新版本以彌補漏洞。該公司表示,正在為尚未更新的產品準備進一步更新。西門子還提供了用戶可用于降低風險的具體緩解措施。
二
西門子PLC本地代碼執行的演進
CVE-2020-15782之所以受到如此關注,主要是這一漏洞的成功利用,將有可能將工業網絡安全研究者對西門子控制器攻擊研究提高到新層次,而攻擊者實施成功攻擊的限制則越少越易,原因就是該漏洞的條件太優越。
在可編程邏輯控制器(PLC)等工業控制系統上實現本機代碼執行是那些高級水平高能力攻擊者已經實現的最終目標。因為這些復雜的系統有許多內存保護,攻擊者不僅為了能夠運行他們選擇的代碼,而且還要不被發現,因此必須要跨越這些保護措施。
早期的攻擊嘗試需要對PLC的物理訪問和連接,或者以工程師工作站為目標的技術和通向PLC的其他鏈接,以獲得那種級別的代碼執行。而此次Claroty公司利用一個新發現的漏洞,在西門子SIMATIC S7-1200和S7-1500 PLC cpu內繞過PLC沙箱,在內存保護區域運行本機代碼,進一步提升了這種攻擊思路的遠程可行性。攻擊者可以利用這個CVE-2020-15782漏洞,遠程獲取難以檢測和刪除的讀寫內存訪問。
從攻擊者的角度來看,PLC漏洞利用的終極目標就是在PLC上實現不受限制和不被檢測的代碼執行。這意味著,能夠將代碼隱藏在PLC內部深處,而不被操作系統或任何診斷軟件檢測到。
多年來,鑒于西門子PLC在市場上的領先地位,已經出現了許多在西門子PLC上實現這種能力的嘗試。
首先,史上最著名的震網攻擊(Stuxnet),它在舊的SIMATIC S7-300和S7-400上獲得了用戶級的代碼執行。代碼修改本身是通過操作本地step7項目文件來完成。然后,Stuxnet能夠通過操縱本地工程站上的WinCC二進制文件來隱藏PLC上的代碼更改。這樣一來,惡意軟件不僅可以偷偷地將自己安裝在PLC上,而且當控制軟件試圖從PLC讀取受感染的內存塊時,還可以保護自己不受WInCC檢測。當然,通過對其Windows操作系統的Microsoft更新和SSA-110665和SSA-027884中記錄的西門子產品更新的組合,這個問題早已得到解決。
第二個經典型的PLC攻擊,是2019年的Rogue7的攻擊(出自論文Rogue7:Rogue Engineering-Station attacks on S7 Simatic PLCs)。《Rogue7》背后的研究人員能夠創建一個流氓工程站,它可以偽裝成TIA(TIA Portal是一系列無縫集成的自動化解決方案)通往PLC的門戶,并注入任何有利于攻擊者的信息。通過理解密碼信息是如何交換的,他們能夠將代碼隱藏在用戶內存中,而TIA工程站是看不見的。西門子部分解決了此問題,并提供了緩解措施,詳見SSA-232418。
第三個,同在2019年,德國波鴻魯爾大學(Ruhr University Bochum)安全研究專家Ali Abbasi和Tobias Scharnowski介紹了他們如何通過物理攻擊SIMATIC 1200來獲得在西門子S7 PLC上的代碼執行。他們使用UART(通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART。它將要傳輸的資料在串行通信與并行通信之間加以轉換。作為把并行輸入信號轉成串行輸出信號的芯片,UART通常被集成于其他通訊接口的連結上。)物理連接來轉儲固件,并發現了一個漏洞鏈,使他們能夠將代碼隱藏在系統中更深的地方,并獲得不受限制的代碼執行。西門子在SSA-686531中解決了這個問題。
本次,claroty研究團隊將這項研究向前推進了一大步,他們展示了一種新的復雜的遠程攻擊,它允許攻擊者在西門子S7 PLC上獲得本機代碼執行。攻擊目標是內核的深處,并避免了任何檢測,因為能夠逃離用戶沙箱,并在受保護的內存區域中編寫shellcode。CVE-2020-15782漏洞恰恰是促成PLC沙箱逃逸的關鍵條件。
西門子PLCs本地代碼執行攻擊發展歷程
三
PLC沙箱逃逸
PLC的完整性對操作人員和工程師來說至關重要,而攻擊者的目標就是通過隱藏于控制器上的代碼和提升權限來破壞這種完整性。本次利用的漏洞CVE-2020-15782,繞過了PLC執行環境中的現有保護,包括工程代碼通常會運行的沙箱。Claroty能夠利用這個漏洞實現沙箱逃逸,以便直接訪問內存,然后編寫并注入shellcode來執行其對西門子1200/1500 PLC的攻擊。
為了執行這種攻擊,需要對PLC進行網絡訪問。此外,攻擊者還需要PLC下載權限。自從TIA Portal V12以來,西門子提供了各種緩解控制,以限制用戶網絡和對PLC的讀寫訪問,特別是口令保護機制。此外,從V17開始,西門子引入了在PLC、HMI和TIA Portal之間使用個人證書的TLS通信,這大大減少了潛在的攻擊面。
3.1PLC的通用結構(以S7 PLC為例)
為了理解Claroty的具體攻擊,首先要概述一個標準PLC的通用結構。它的CPU是一個16或32位微處理器,由一個內存芯片和集成電路組成,管理控制邏輯、過程監控和通信。CPU指導PLC執行控制指令,與其他設備通信,執行邏輯和算術操作,并執行內部診斷。它還運行內存例程,不斷檢查PLC,以避免編程錯誤,并確保內存沒有損壞。邏輯運行在沙盒環境(有時也被稱為“監獄”)中。傳輸到控制器的邏輯僅限于供應商提供的特定內存區域和API。
以西門子S7 PLC為例,它運行在ADONIS內核和ARM或MIPS處理器上,有許多編程語言可用于配置控制器,包括語句列表(STL)、梯形圖(LD)、功能框圖(FBD)和結構化控制語言(SCL)。
不管何種輸入源,PLC程序都會編譯成MC7/MC7+字節碼,這是一種低級別的代碼表示。經工程站編譯后-西門子TIA門戶-代碼塊(MC7/MC7+格式)通過西門子的S7Comm/S7Comm+協議下載并安裝到PLC中。然后,PLC中的MC7虛擬機將對代碼塊進行分派,并對字節碼進行解釋和執行。
PLC程序執行過程
如果不具備逆向工程能力,是不可能解碼MC7/MC7+字節碼的,因為西門子沒有公開提供這種技術文檔。因此,研究才必須用逆向工程分析MC7/MC7+字節碼語言集,以便理解其內部機制并發現bug。
3.2S7PLC沙箱逃逸
由于虛擬機限制了用戶程序訪問的資源,因此編譯后的字節碼只能用于訪問操作系統允許的資源,而不能直接用于硬件操作。這是為了將用戶和運行代碼限制在一組被認為是安全且已定義的操作中。例如,操作系統將限制對受保護內存的任何直接訪問,但會允許使用Siemens提供的標準庫中的任何函數(例如ADD_I - Add Integer子例程)。換句話說,操作系統將用戶代碼“鎖定”在一個沙盒/容器中,對資源、內存和功能的訪問是有限的,這可能會破壞PLC和/或整個進程。
為了逃逸或“越獄”本地SIMATIC S7-1200和S7-1500沙箱,Claroty利用了其內存保護繞過漏洞。該漏洞使攻擊者能夠將任意數據和代碼寫入所謂的受保護的內存區域,或讀取敏感數據以發動進一步攻擊。
利用CVE-2020-15782實現沙箱逃逸
沙箱逃逸意味著攻擊者可以從PLC上的任何地方讀寫,并可以用惡意代碼修補內存中現有的VM操作碼來實現對設備的ROOT權限操作。例如,Claroty能夠直接將ARM/MIPS shellcode注入到內部操作系統結構中,這樣當操作系統使用其選擇的特定操作碼時,惡意shellcode就會執行,從而遠程執行代碼。Claroty使用這種技術安裝了一個內核級程序,它具有一些對操作系統完全隱藏的功能。
四、防范建議
4.14.1 緩解措施
西門子已經確定了以下具體的解決方案和緩解措施,并強烈建議客戶采用它們來降低風險:
S7通信采用口令保護
通過S7-1200或S7-1500CPU的ENDIS_PW指令禁止客戶端連接(這將阻塞遠程客戶端連接,即使客戶端可以提供正確的口令)
使用顯示配置額外的訪問保護S7-1500 CPU(這將阻止遠程客戶端連接,即使客戶端可以提供正確的口令)
應用“縱深防御”,如工業操作指南第12ff頁所述安全措施,特別是:
1.工廠安全:對關鍵部件的物理防護;
2.網絡安全:確保PLC系統沒有連接到不可信的網絡;
3.系統完整性:配置、維護和保護設備應用適用的補償飽和控制和使用內置的安全能力。
將整個解決方案更新到TIA Portal V17,并使用PLC、HMI和PG/PC之間的個人證書TLS通信
4.2通用的安全建議
作為一種通用的安全措施,西門子強烈建議使用適當的保護機制對設備網絡訪問。為了在受保護的IT環境中運行設備,西門子建議按照西門子工業安全操作指南進行環境配置(https://www.siemens.com/cert/operational-guidelines-industrial-security)。
請按照產品手冊中的建議操作。關于西門子工業安全的更多信息可以在
https://www.siemens.com/industrialsecurity上找到。
五
小結
CVE-2020-15782漏洞可以繞過通常工程代碼運行的沙箱,直接訪問設備的內存,從而在西門子S7 PLC上獲得本機代碼執行。Claroty研究人員展示了攻擊者如何繞過保護,直接將shellcode寫入受保護的內存中。沙箱逃逸意味著攻擊者可以從PLC的任何地方讀寫,并可以用惡意代碼修補內存中現有的VM操作碼,從而對設備進行Root權限的操作。需要特別注意的是,該漏洞如果被攻擊者利用發起惡意攻擊,將很難被檢測發現。該項成果披露是西門子和Claroty公司緊密合作的結果,這有利于促進工業網絡安全行業和工業設備供應商在漏洞披露方面的合作,也有利于整個工業生態系統的安全。