一種新的針對S7-1500 PLC注入攻擊
可編程邏輯控制器(PLC)越來越多地連接和集成到工業物聯網(IIoT)中,以實現更好的網絡連接和更簡化的控制流程。但事實上,這也給其帶來了安全挑戰,并使其面臨各種針對此類設備所控制的物理過程的網絡攻擊。在這項工作中,我們調查了最新的S7 PLC是否在設計上易受攻擊,是否可以被利用。與研究界中存在的典型控制邏輯注入攻擊不同,該攻擊要求對手在攻擊過程中保持在線,本文介紹了一種新的漏洞利用策略,該策略旨允許攻擊者既不連接到目標也未連接到目標所在網絡中的情況下,仍然可以破壞PLC所控制的物理過程。攻擊方法由兩個步驟組成:1)一旦攻擊者獲得對暴露的PLC的訪問權限,就用惡意的ToD(Time-of-Day)中斷塊篡改PLC;2)當攻擊者斷開與系統網絡的連接時,在稍后的時間觸發中斷。
2022年,德國研究機構IHP的Wael Alsabbagh研究員發表了一篇文章,介紹針對當時較新固件版本v2.9.2的S7-1500PLC的ToD注入攻擊,對文章了進行閱讀并分將精華部分享之,有誤之處請指正。
0x01 概述和相關工作
最近針對ICS系統的威脅之一是控制邏輯注入攻擊,這種攻擊涉及通過使用其工程軟件修改目標PLC上運行的原始控制邏輯,通常采用中間人方法,這類攻擊中利用的主要漏洞是PLC協議中缺少身份驗證措施。ICS供應商通過為其PLC提供密碼來應對這種威脅,以保護控制邏輯免受未經授權的訪問,即,每當ICS管理員試圖訪問在PLC中運行的控制邏輯時,設備首先需要認證以允許他讀/寫代碼。這通常是通過專有認證協議完成的。但是,這種解決方案并不能完全防止控制器受到損害。先前的學術成果已成功地繞過了身份驗證,并訪問了不同密碼保護的PLC中的控制邏輯。上述論文的作者討論了繞過身份驗證的兩種主要方法:一種是提取密碼的哈希,然后將其推回PLC(稱為重放攻擊),另一種是使用“純文本密碼、編碼文本密碼”對的代表性列表對每個字節進行離線暴力破解。總的來說,僅通過密碼驗證來保護控制邏輯失敗了,攻擊者仍然能夠訪問PLC的程序并操縱由暴露的設備控制的物理進程。
控制邏輯注入攻擊有兩種類型:傳統的控制邏輯注入攻擊和固件注入攻擊。然而,在真實的ICS環境中,感染PLC固件將是一項具有挑戰性的任務,因為大多數PLC供應商通過加密方法(如數字簽名)或僅允許通過本地訪問(如SD卡和USB)進行固件更新來保護其PLC免受未經授權的固件更新。本文不涉及固件注入,只關注傳統的控制邏輯注入攻擊。在下文中,我們將現有的旨在破壞物理過程的注入攻擊分為兩類:
A、在線攻擊物理過程
該組的攻擊旨在通過使用其工程軟件來修改原始控制邏輯程序。惡意代碼成功注入后,受感染設備控制的物理進程立即受到影響。下圖示意了攻擊順序:

最著名的此類攻擊是2010年對伊朗核設施進行的一次攻擊,名為“震網”(Stuxnet),目的是破壞鈾濃縮工廠的離心機。Stuxnet攻擊使用Windows PC攻擊連接到變頻驅動器的西門子S7-300和S7-400 PLC,它會感染PLC的控制邏輯,以監控所連接電機的頻率,如果頻率在一定范圍內(即807 Hz和1210 Hz),則會發起攻擊。2015年,克里克等人在不中斷服務的情況下,將惡意軟件注入SIMATIC PLC的控制邏輯。作者表明,只要代碼由MC7字節碼組成,有權訪問PLC的攻擊者就可以下載和上傳代碼。在后續工作中,Spenneberg等人介紹了一種PLC蠕蟲,蠕蟲在內部從一個PLC傳播到其他目標PLC.在感染階段,蠕蟲會掃描網絡以尋找新的目標PLC。另一論文中介紹了用梯形邏輯或兼容語言之一編寫的梯形邏輯炸彈惡意軟件,這種惡意軟件由攻擊者插入到PLC上的現有控制邏輯中。一組研究人員演示了對PLC控制邏輯的遠程攻擊。他們能夠感染PLC,并將感染隱藏在控制中心的工程軟件中。他們對施耐德電氣Modicon M221及其供應商提供的工程軟件SoMachine-Basic實施了攻擊。Lei等人演示了一種攻擊,它可以繞過西門子SIMATIC S7-1200 PLC使用的S7CommPlus協議的安全機制。作者首先使用Wireshark軟件分析了TIA Portal軟件與S7 PLC之間的通信,然后使用反向調試軟件WinDbg4破解了S7CommPlus協議的加密機制。之后,他們演示了兩次攻擊。首先,執行重放攻擊以遠程啟動和停止PLC.在第二個攻擊場景中,作者操縱受害者的輸入和輸出值,對受感染PLC控制的物理進程造成嚴重破壞。2021年,研究人員表明S7-300 PLC易受此類攻擊,并證明利用PLC中運行的控制邏輯是可行的。在他們破壞了PLC的安全措施后,他們進行了一次成功的注入攻擊,并通過使用一個假冒的PLC來模擬真正的受感染設備,從而使工程軟件無法發現他們的攻擊。Rogue7背后的研究能夠創建一個仿冒的工程站,該工程站可以偽裝成S7 PLC的TIA門戶,并注入任何對攻擊者有利的消息。通過了解加密消息是如何交換的,他們設法將代碼隱藏在用戶內存中,這對TIA門戶工程來說是不可見的。
上面提到的所有攻擊都是有限的,其要求攻擊者能夠連接到目標PLC,這增加了被ICS操作員事先發現或被安全措施檢測到的可能性。
B、離線攻擊物理過程
這一類中的攻擊與前一類中提到的攻擊非常相似,不同之處在于,攻擊者的目標不是在獲得對目標設備的訪問后立即攻擊物理進程。這意味著,一旦他獲得了暴露PLC的訪問權限,便可立即向PLC中注入惡意代碼,然后關閉與目標的任何實時連接,將他的代碼保留在PLC的內存中,處于空閑模式。之后,激活他的程序并在他希望的稍后時間甚至在沒有連接到系統網絡的情況下損害現場物理過程,如下示意圖:

我們所知,只有少數討論這一新威脅的學術成果發表。Serhane等人專注于梯形邏輯代碼漏洞和不良代碼實踐,這些漏洞和不良代碼實踐可能成為錯誤的根本原因,并隨后被攻擊者利用。他們表示,攻擊者可以生成不確定的波動輸出變量,例如,執行兩個計時器來控制相同的輸出值可能會導致競爭條件。這種情況可能會對受控設備造成嚴重損壞,類似于Stuxnet作者指出的另一種情況是,高級的攻擊者也可以繞過某些函數,手動將某些操作數設置為所需的值,并應用空分支或跳轉。為了實現隱秘的修改,攻擊者可以使用數組指令或用戶定義的指令,來記錄插入的關鍵參數和值。他們還討論了攻擊者可以通過跳轉應用無限循環,并使用嵌套計時器和跳轉僅在特定時間觸發攻擊。在我們的前一篇論文中,我們提出了一種新的方法,該方法基于向目標PLC注入時間中斷代碼,它在攻擊者設置的時間中斷控制邏輯的執行序列。我們的評估結果證明,即使與目標系統斷開連接,攻擊者也可以混淆物理過程。雖然我們的研究工作只在一臺舊的S7-300 PLC上進行了測試,并且只是為了迫使PLC進入停止模式,但攻擊是成功的,并設法中斷了在修補的PLC中運行的原始控制邏輯代碼的執行。這種攻擊比在線攻擊更嚴重,因為PLC在數小時、數天、數周、數月甚至數年內一直正確執行原始控制邏輯,而不會被中斷,直到攻擊者設定的那一刻攻擊才會發生。揭露這種攻擊的唯一現實方法是,ICS操作員從PLC請求程序,并將受感染設備中運行的在線代碼與他在工程站上的離線代碼進行比較。
0x02 S7 PLC
西門子生產SIMATIC S7系列中的多條PLC產品線,例如S7-300、S7-400、S7-1200和S7-1500。它們都具有相同的體系結構。下圖描繪了S7 PLC的標準架構,其包括輸入和輸出模塊、電源以及諸如隨機存取存儲器(RAM)和電可擦除可編程只讀存儲器(EEPROM)的存儲器。稱為操作系統(OS)的固件以及用戶專用程序存儲在EEPROM中。傳感器、開關、繼電器、閥門等輸入輸出設備與輸入輸出模塊連接。
PLC連接到物理過程,輸入設備將進程的當前狀態提供給PLC,PLC通過其控制邏輯對其進行處理,并通過輸出設備相應地控制物理過程。S7 PLC運行的控制邏輯被編程并編譯為代碼的較低表示,即分別為S7-300/S7-400或S7-1200/S7-1500 PLC的MC7或MC7+字節碼。工程師站編譯代碼后,通過西門子S7-300/S7-400或S7-1200/S71500 PLC的S7Comm或S7CommPlus協議,將MC7/MC7+格式的代碼塊下載并安裝到PLC中。然后,S7 PLC中的MC7/MC7+虛擬機將分配代碼塊,解釋并執行字節碼。
西門子PLC運行實時操作系統,啟動周期時間監控,此后,OS循環通過如下圖所示的四個步驟。在第一步中,CPU將輸出的過程圖像的值復制到輸出模塊;在第二步中,CPU讀取輸入模塊的狀態并更新輸入值的過程圖像。在第三步驟中,用戶程序在持續時間為1ms(毫秒)的時間片中執行。每個時間片分為三個部分,依次執行:操作系統、用戶程序和通信。時間片的數量取決于當前用戶程序的復雜性和中斷程序執行的事件。

在正常操作中,如果事件發生,則當前正在執行的塊在命令邊界處被中斷,并且被分配給特定事件的不同組織塊被調用。一旦執行了新的組織塊,循環程序就在其被中斷的點重新開始。這適用于未超過最大允許周期時間(默認為150 ms)的情況。換句話說,如果在主OB1中調用了太多的中斷OB,則整個周期時間可能會比PLC硬件配置中設置的時間更長。超過最大允許執行周期會產生軟件錯誤,并且PLC調用特定塊來處理該錯誤,即OB80。有兩種方法來處理此錯誤:1)如果OB80未加載到主程序中,則PLC轉到停止模式;2)PLC執行OB80編程的指令,例如警報。
西門子為開發PLC程序的工程師提供其Total Integrated Automation(TIA)門戶軟件。它由兩個主要部分組成。STEP 7作為PLC和WinCC的開發環境,用于配置人機界面(HMI)。工程師能夠使用以下編程語言之一對PLC進行編程:梯形圖(LAD)、功能塊圖(FBD)、結構化控制語言(SCL)和語句表(STL)。S7 PLC程序分為以下單元:組織塊(OB)、功能(FC)、功能塊(FB)、數據塊(DB)、系統功能(SFC)、系統功能塊(SFB)和系統數據塊(SDB)。

OBs、FCs和FBs包含實際代碼,而DBs為數據結構提供存儲,SDB為當前PLC配置提供存儲。前綴M(存儲器)用于尋址內部數據存儲器。一個簡單的PLC程序至少包含一個名為OB1的組織塊,相當于傳統C程序中的main()函數。在更復雜的程序中,工程師可以通過使用函數和功能塊來封裝代碼。唯一的區別是額外的DB作為調用FB的參數。SFC和SFB內置在PLC中。然而,操作系統循環地調用OB,并且通過該調用開始用戶程序的循環執行。
時間(TOD)中斷
根據中斷的需要(例如每分鐘、每小時、每天、每月、每年和月末),一天中的時間(TOD)中斷在配置的時間執行一次或定期執行。CPU 1500提供具有編號OB10至0B17以及OB 123之后的共計的20個組織塊用于處理TOD中斷。
要啟動TOD中斷,用戶必須首先設置啟動時間,然后激活中斷。他可以進行這兩種活動。分別在塊屬性中自動配置,或同時配合系統功能;手動配置:激活塊屬性意味著時間中斷自動啟動。簡要地說明了這兩種方式:
1) 自動配置:用戶使用事件類Time-of-Day添加組織塊,并輸入名稱、編程語言和編號。他用中斷發生時要執行的所需指令對OB10進行編程。
2) 手動配置:在這種方法中,用戶使用系統功能塊來設置、取消和激活時間中斷。他通過使用系統功能塊在主OB1中設置中斷的必要參數,同時在OB10中對要執行的中斷指令進行編程。
0x03 攻擊執行
正如在任何典型的注入攻擊中一樣,我們在目標PLC的原始控制邏輯中植入我們的惡意代碼,時間中斷塊OB10。CPU在每個單獨的執行周期中檢查是否滿足中斷的條件。這意味著,攻擊者的中斷塊將始終被檢查,但只有在CPU時鐘的日期和時間與攻擊者設置的日期和時間匹配時才會執行。因此,我們有兩種情況:
1) CPU時鐘的日期與OB10中設置的日期(攻擊日期)匹配。CPU立即停止執行OB1,將斷點的位置存儲在專用寄存器中,并跳轉到執行相應的中斷塊OB10的內容。
2) CPU時鐘的日期與OB10中設置的日期不匹配。CPU在檢查中斷條件之后恢復執行OB1,而不激活中斷并且不執行OB10中的指令。
我們在本文中提出的攻擊方法由兩個主要階段組成:注入階段(在線階段)和攻擊階段(離線階段)。
A、注入階段
下圖顯示了此階段的基本過程。我們的目標是向PLC注入我們在中斷塊OB10中編程的惡意指令。此階段包括四個步驟:

a) 上傳和下載用戶程序。
b) 修改和更新控制邏輯程序。
c) 制作s7CommPlus下載消息。
d) 將攻擊者的消息推送給受害者PLC.
為了篡改目標PLC,我們利用我們的MITM站,它有兩個主要組件:
1) TIA門戶:用于檢索和修改PLC運行的當前控制邏輯程序。
2) PLC注入器:將攻擊者的代碼下載到PLC.在這項工作中,我們為此開發了一個基于Scapy的Python腳本。對于實際情況,攻擊者在訪問網絡后可能會遇到兩種情況。
案例_1:非活動S7會話
在這種情況下,合法的TIA門戶處于脫機狀態,并且僅在需要上傳過程時才與PLC通信。步驟1.上傳下載用戶程序:此步驟的目的是獲取PLC運行的反編譯的控制邏輯程序,以及TIA Portal發送的S7CommPlus消息,將原用戶程序下載到PLC中。為了實現這些目標,我們首先打開攻擊者的TIA門戶,并直接與受害者PLC建立連接。這是可能的,因為S7-1500 PLC設計上存在安全漏洞。事實上,可編程邏輯控制器沒有引入任何安全檢查,以確保當前通信的TIA門戶與其在早期會話中通信的TIA門戶相同。為此,任何在其機器上提供TIA門戶的外部對手都可以輕松地與S7 PLC通信,而無需任何努力。成功建立通信后,我們將控制邏輯程序上傳到攻擊者的TIA門戶。然后,我們再次將其重新下載到PLC,并使用Wireshark軟件嗅探攻擊者的TIA門戶和受害者PLC之間交換的整個S7CommPlus消息流。在此步驟結束時,攻擊者在其TIA門戶上安裝了程序,并將所有捕獲的下載消息保存在PCAP文件中以供將來使用。
步驟2.修改和更新PLC的程序:在檢索目標PLC運行的用戶程序后,攻擊者的TIA門戶將以一種高級編程語言(如SCL)顯示該程序。基于我們對PLC控制的物理過程的理解,我們配置并編程了我們的時間中斷塊OB10,以強制系統的某些輸出在中斷被激活時關閉,盡管我們的惡意代碼與原始代碼的不同之處僅在于一個額外的小尺寸塊(OB10),但它足以混淆我們實驗設置的物理過程。更新PLC中運行的程序的最簡單方法是使用攻擊者的TIA門戶。當我們下載修改后的控制邏輯時,PLC成功更新了其程序。但是,ICS操作員可以很容易地通過從受感染的PLC上傳程序來發現篡改,并且比較分別在其合法TIA門戶和遠程PLC上運行的離線和在線程序。
步驟3.制作s7CommPlus下載消息:為了向合法用戶隱藏我們的感染,我們首先記錄了下載修改程序時攻擊者的TIA門戶和PLC之間交換的s7CommPlus消息。步驟4.將特制的消息推送到PLC:特制的S7CommPlus下載消息包含以下屬性:攻擊者程序的對象MAC和對象代碼屬性,以及用戶程序的源代碼屬性。由于S7CommPlusv3在TIA門戶和PLC之間交換共享會話密鑰以防止執行重放攻擊,因此我們首先需要將數據包與正確的密鑰捆綁在一起,然后才能將精心編制的消息推送到PLC.然而,利用共享密鑰(不在本文的范圍內),一旦惡意密鑰交換完成,我們就可以輕松地將密鑰字節碼與精心編制的消息捆綁在一起。考慮到對會話ID和完整性字段的適當修改,我們將最終的S7消息(攻擊者的消息)存儲在PCAP文件中,以便將其作為重放攻擊推回到PLC。下述算法描述了PLCInjector工具的主要核心,該工具用于使用攻擊者的篡改PLC程序:

PLCInjector工具有兩個功能:第一個用于利用S7CommPlusV3使用的完整性保護會話密鑰。在TIA Portal和S7-1500 PLC之間的每個會話中交換的會話密鑰源自PLC的ServerSessionChallange的16個字節,確切地說是位于字節2和18之間的那些,與TIA Portal選擇的隨機24字節KDK的組合。然后,在SessionKey計算中使用指紋函數f()。第5行生成24字節隨機量(M),并將其映射到作為預密鑰貢獻的橢圓曲線的域。根據隨機點預密鑰,我們使用密鑰推導函數(KDF)來推導如下標識的3-16字節的量:密鑰加密密鑰(KEK)、校驗和種子(CS)和校驗和加密密鑰(CEK)。在第7行中,CS生成組織為四個256字的4096個偽隨機字節,即LUT.此LUT用于計算KDK和PLC_質詢的校驗和。從第8行到第13行描述了橢圓曲線密鑰交換方法,類似于TIA Portal用于加密隨機生成的預密鑰的方法。之后,我們用隨機選擇的20個字節(在算法中貢獻給X)來屏蔽橢圓曲線計算。第19行為加密的KDK提供認證的加密。這里,計算非加密校驗和,然后由AES-ECP函數加密。最后,我們添加包括密鑰指紋的2個報頭字段,即,具有一些附加標志的相關密鑰的8字節截斷的SHA256散列(見第20行)。
在與受害者成功建立會話后,PLC與攻擊者機器交換惡意生成的Session_Key以及當前通信會話。在下一步中,我們的工具將執行函數2,向攻擊者發送精心編制的S7消息,其中包含惡意代碼以及生成的Session_Key。我們的攻擊工具也可以用于攻擊所有共享相同固件的S7-1500 PLC.這是因為西門子設計了新的S7密鑰交換機制,假設所有運行相同固件版本的設備也使用相同的公鑰-私鑰對機制。成功注入后,PLC更新其程序,處理攻擊者程序的目標代碼,同時將用戶程序的源代碼保存在其內存中。因此,每當用戶從受感染的PLC上傳程序時,TIA Portal都會調用、反編譯并顯示原始程序。這使得我們的注入隱藏在PLC內部,用戶無法檢測到在線和離線程序之間的任何差異。
案例_2:活動的S7會話
在這種情況下,在篡改期間,合法的TIA門戶和PLC之間有一個正在進行的活動S7會話。默認情況下,S7 PLC只允許一個活動的在線會話,因此攻擊者無法與PLC通信。它將立即拒絕任何建立連接的嘗試,因為它已經在與用戶通信。在這種情況下,攻擊者首先需要關閉當前合法用戶和PLC之間的在線會話。通過啟用TIA門戶軟件中的“在線”功能,用戶可以與S7 PLC建立在線會話。然后他可以控制,監控,診斷,下載,上傳遠程啟動和停止CPU。一旦用戶與PLC建立了在線連接,雙方(TIA門戶和PLC)就開始定期在會話中交換特定消息。此消息稱為S7-ACK,負責保持會話活動。TIA門戶必須始終使用S7-ACK重放消息響應PLC發送的任何S7-ACK請求。因此,為了關閉當前的在線會話,我們運行我們的MITM站,它允許我們通過執行眾所周知的ARP中毒方法來攔截和丟棄從TIA門戶發送的所有數據包。如果PLC在發送確認請求后沒有立即收到來自TIA門戶的響應,它將關閉與已連接的TIA門戶的連接,并且兩者都將離線。值得一提的是,攻擊者還可以使用不同的方式來關閉連接,例如端口竊取、使用“離線”數據包進行重放攻擊等。在合法的TIA門戶和受害者PLC都脫機后,攻擊者可以使用自己的TIA門戶輕松地與PLC建立新的會話。然后,他按照前面案例中解釋的相同四個步驟修補受害者設備。對于這種情況,我們的攻擊方法有局限性。合法的TIA門戶被迫關閉與PLC的會話。這意味著,用戶可以清楚地看到他失去了與遠程設備的連接。
成功注入后,攻擊者離線并關閉與目標PLC的當前通信會話。在下一個執行周期中,攻擊者的程序將在PLC中執行。這意味著,惡意中斷塊OB10的中斷條件將在每個執行周期中被檢查。只要不滿足中斷條件,該塊就保持在空閑模式,并隱藏在PLC的存儲器中。一旦配置的攻擊日期和時間與CPU的日期和時間匹配,中斷代碼將被激活,即主程序(OB1)的執行過程被暫停,CPU跳轉到執行攻擊者用來編寫OB10的所有指令。在我們的應用示例中,我們對OB10進行了編程,當我們與目標網絡完全斷開連接時,強制某些電機在特定時間和日期關閉。攻擊實驗中所使用到的惡意OB10如下圖所示:

0x04 總結
本文介紹了最新的SIMATIC PLC面臨的新威脅。我們的攻擊方法是基于一旦攻擊者獲得目標網絡的訪問權限,就注入攻擊者的惡意代碼,但稍后激活其注入程序,而無需在攻擊時連接。我們的調查發現了S7-1500 PLC使用的新完整性方法中的一些設計漏洞。根據我們的發現,我們成功地進行了注入攻擊,通過篡改測試PLC的TOD中斷塊(OB10)。這個塊允許我們激活我們的程序,并隨后影響物理過程,而不是攻擊者連接PLC后便立即攻擊。我們的實驗結果表明,當PLC運行攻擊者的程序時,原始的控制邏輯程序總是顯示給用戶。此外,我們的注入不會增加控制邏輯的執行次數。因此,當我們的注入處于空閑模式時,物理進程不會受到影響。
0x05 彩蛋
本文針對S7-1500 PLC v2.9.2固件所研究的注入攻擊,實際上仍然是基于S7commPlus協議實現的,但西門子從TIA Portal V17開始已經啟用更加安全的S7commPlus_TLS協議,且在對PLC進行配置時,默認選擇的即這種安全通信協議,關于此協議,綠盟安全專家已在參考資料5中詳述,除非人為特意選擇使用傳統的S7commPlus協議,如下圖所示選擇/配置:

不過即便是S7commPlus_TLS安全協議,仍然存在相應的漏洞,參考資料6中講述了對該協議的fuzzing并且發現了多個漏洞。基于文章的思路,仍然可以對S7-1500(V2.9.4)PLC實施CPU啟停攻擊,如下視頻所示: