《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > 原創(chuàng) | 施耐德電氣PLC ModiPwn漏洞綜述

原創(chuàng) | 施耐德電氣PLC ModiPwn漏洞綜述

2021-09-29
來源:網(wǎng)絡(luò)安全應(yīng)急技術(shù)國家工程實驗室
關(guān)鍵詞: 漏洞

  Armis研究人員在施耐德電氣(SE)Modicon PLC中發(fā)現(xiàn)了一個新漏洞CVE-2021-22779,該漏洞被稱為ModiPwn,影響Modicon M340、M580以及Modicon系列的其他型號PLC。該漏洞繞過了這些PLC中用來防止濫用未記錄的Modbus命令的安全機制,Armis研究人員發(fā)現(xiàn)這些命令可用于接管PLC并獲取設(shè)備本地代碼執(zhí)行權(quán)限,攻擊者之后利用代碼可更改PLC的操作,同時對管理PLC的工程工作站隱藏其操作。這是一種未經(jīng)身份驗證的攻擊,只需要對目標PLC進行網(wǎng)絡(luò)訪問。

  Armis于2020年11月13日通知SE,此后一直與他們合作以了解潛在問題,并努力開發(fā)補丁。2021年7月13日,SE發(fā)布了包含緩解措施的安全公告,完全修復(fù)這些問題的補丁仍在開發(fā)中。

  在與SE合作的過程中,Armis研究人員發(fā)現(xiàn)并報告了兩個額外的尚未被SE解決的身份驗證繞過技術(shù)。由于為Modicon PLC使用的UMAS協(xié)議提供支持的Modbus協(xié)議存在固有缺陷,Armis將繼續(xù)與SE和其他供應(yīng)商合作解決這些問題。

  技術(shù)綜述

  Armis發(fā)現(xiàn)的漏洞CVE-2021-22779是一個身份驗證繞過漏洞,可以與過去在UMAS協(xié)議中發(fā)現(xiàn)卻只能部分緩解的其他漏洞聯(lián)系在一起。Armis研究人員發(fā)現(xiàn)雖然這些額外的漏洞被歸類為拒絕服務(wù),它們實際上可以導(dǎo)致本地遠程代碼執(zhí)行。這些漏洞本質(zhì)上是UMAS協(xié)議中未記錄的命令,Armis研究人員發(fā)現(xiàn),SE并沒有從協(xié)議中刪除這些命令(可能是由于遺留的依賴關(guān)系),而是在它們周圍添加了一個身份驗證機制來降低它們的風(fēng)險。不幸的是,這種機制被發(fā)現(xiàn)是有問題的,根據(jù)最新的發(fā)現(xiàn),需要更加徹底的修復(fù)才可以解決這些問題。

  由于上述原因,以下CVE仍會影響Modicon M340和M580PLC的最新固件版本:

  CVE-2021-22779–通過UMAS命令MemoryBlockRead繞過身份驗證漏洞

  CVE-2018-7852–通過UMAS命令PrivateMessage(RCE)解除不受信任的指針引用

  CVE-2019-6829–通過UMAS命令WritePhysicalAddress(RCE)進行任意內(nèi)存寫入

  CVE-2020-7537–通過UMAS命令ReadPhysicalAddress讀取任意內(nèi)存(信息泄漏)

  其他Modicon型號目前被認為不易受到攻擊。

  要完全理解上述發(fā)現(xiàn)的技術(shù)細節(jié),需要了解Modbus和UMAS協(xié)議的一些背景知識。

  Modbus

  Modbus是在SCADA系統(tǒng)中控制PLC的實際標準。它于1979年由Modicon首次發(fā)布。Modbus是很久以前設(shè)計的,缺少現(xiàn)代系統(tǒng)所需的功能,例如二進制對象與PLC之間的傳輸。

  Modbus可以通過串行通信或IP通信運行。廣泛使用的Modbus IP版本是Modbus/TCP標準。

  圖1 Modbus/TCP頭部

  Modicon之后在保留的Modbus功能代碼前提下擴展了Modbus,擴展協(xié)議稱為UMAS,它在基本Modbus協(xié)議的基礎(chǔ)上增加了身份驗證、二進制數(shù)據(jù)傳輸、固件更新和其他功能。

  UMAS預(yù)留機制

  Modicon PLC(M340、M580以及其他型號)使用UMAS協(xié)議。UMAS重新實現(xiàn)了標準Modbus命令和一些Modbus缺少的必要功能。

  圖2 UMAS頭部(包括Modbus功能代碼字段)

  對PLC的某些更改需要多個相互依賴的命令,為允許此類情況,Modicon實施了預(yù)留機制。創(chuàng)建預(yù)留機制是為了同步PLC程序的修改——一種針對某些關(guān)鍵更改的全局鎖定機制。一旦工程工作站通過UMAS成功預(yù)留PLC,它就會收到一個1字節(jié)的令牌,用于對PLC進行修改。不修改PLC的UMAS命令不需要此令牌,并且可以在沒有工作站任何身份驗證的情況下執(zhí)行。由于一次只有一個工作站可以保留PLC,因此該機制可以保護PLC免受可能導(dǎo)致?lián)p壞PLC的重復(fù)修改。

  預(yù)留機制的初始版本通過使用功能代碼為0x10的UMAS命令來工作。此命令不需要身份驗證或質(zhì)詢-響應(yīng)握手,并且依賴于PLC和工程工作站上SE管理軟件之間的硬編碼共享敏感信息:

  圖3 功能代碼0x10

  這種機制使用的硬編碼敏感信息可以在未加密的UMAS流量中觀察到,或者通過對Modicon PLC固件進行逆向工程來定位。

  隨著時間的推移,各種未記錄的UMAS命令被證明允許遠程代碼執(zhí)行或其他惡意意圖。SE決定預(yù)留增強機制,因此它不僅可以充當鎖定機制,還可以充當身份驗證機制。預(yù)留增強機制基于質(zhì)詢-響應(yīng)握手,其中對共享口令口令行身份驗證。

  在兩種版本的預(yù)留機制中,成功預(yù)留后會發(fā)送一個1字節(jié)令牌作為響應(yīng),然后該令牌將被添加到需要身份驗證的UMAS命令之前。

  圖4 預(yù)留成功后的1字節(jié)令牌

  身份驗證繞過-CVE-2020-7537

  在對預(yù)留增強機制的算法進行逆向工程后,研究人員意識到是否可以通過未公開的UMAS命令泄露應(yīng)用程序口令(或其哈希值)。對M340PLC最新固件(當時)的靜態(tài)分析,揭示了一個可疑的UMAS命令:

  圖5 pu_ReadPhysicalAddress命令

  pu_ReadPhysicalAddress命令拷貝從輸入命令所選擇地址的存儲塊,以響應(yīng)緩沖。除了緩沖區(qū)大小的簡單驗證之外,該函數(shù)對從內(nèi)存中讀取的地址沒有限制。本質(zhì)上,這個未記錄的命令允許泄漏PLC地址空間中的所有內(nèi)存。

  該命令可用于泄漏存儲在PLC內(nèi)存中的應(yīng)用程序口令的哈希值,并用于未經(jīng)身份驗證的攻擊者預(yù)留和管理PLC。

  此外,諸如此類的內(nèi)存讀取命令可用于從PLC泄漏可能與其操作相關(guān)的敏感信息。由于此命令讀取的地址沒有限制,攻擊者可以濫用此命令通過讀取某些特定于硬件地址來使設(shè)備崩潰,這將導(dǎo)致PLC上的驅(qū)動程序與硬件不同步。這可能會導(dǎo)致各種邊緣情況,從而導(dǎo)致拒絕服務(wù)。當PLC以這種方式崩潰時,它不能很快恢復(fù)正常運行,操作員需要按下一個物理按鈕來重新啟動設(shè)備。

  此漏洞于2020年11月報告給SE,并在2020年12月的安全公告中披露。SE為解決此問題而引入的補丁將ReadPhysicalAddress命令定義為需要保留的命令,利用該機制來抵御這種攻擊。雖然這確實減輕了這種身份驗證繞過,但它并沒有完全解決這個命令中的風(fēng)險——因為如果使用的項目文件是無口令的,它仍然可能被觸發(fā)。

  身份驗證繞過-CVE-2021-22779

  為了更好地了解預(yù)留增強機制的UMAS消息流,可以使用EcoStruxure軟件連接到PLC并分析它創(chuàng)建的流量。當在EcoStruxure軟件中輸入正確的口令時,會按預(yù)期生成一些UMAS命令,但是當輸入的口令不正確時,軟件拒絕了口令,而不會與PLC產(chǎn)生任何流量。這就提出了一個問題——EcoStruxure軟件如何在不與PLC通信的情況下知道口令與否?為了回答這個問題,首先應(yīng)當分析在輸入口令之前工作站發(fā)送的UMAS命令。工作站使用的命令之一是MemoryBlockRead命令,它允許從內(nèi)存中讀取預(yù)配置的塊,無需身份驗證(類似于MemoryBlockWrite命令)。與ReadPhysicalAddress命令不同,塊ID將內(nèi)存訪問限制為某些固定內(nèi)存地址。

  然而,軟件似乎使用這個命令,pre-reservation,從PLC讀取口令的哈希值,并驗證用戶輸入的口令是否正確。毫無疑問,這種機制從根本上是有缺陷的——口令哈希值通過未加密的協(xié)議傳遞,可以被任何未經(jīng)身份驗證的攻擊者讀取,只需執(zhí)行內(nèi)存塊讀取命令。

  雖然EcoStruxure軟件使用內(nèi)存讀取命令來驗證口令哈希,但未經(jīng)身份驗證的攻擊者可以簡單地使用讀取口令哈希完全繞過預(yù)留增強的身份驗證機制。

  遠程代碼執(zhí)行RCE

  如上所述,過去發(fā)現(xiàn)的兩個未記錄的UMAS命令WritePhysicalAddress(功能代碼0x29,CVE-2019-6829)和PrivateMessage(功能代碼0x6D,CVE-2018-7852),會導(dǎo)致拒絕服務(wù)。正如將在下面展示的,這兩個命令實際上還可以導(dǎo)致遠程代碼執(zhí)行。

  任意內(nèi)存寫入

  命令WritePhysicalAddress允許任意寫入PLC內(nèi)存中的任何地址,并在輸入緩沖區(qū)中提供數(shù)據(jù)緩沖區(qū)。雖然在最新的固件版本中,在使用應(yīng)用程序口令時無法訪問此命令,但如果在繞過預(yù)留機制后執(zhí)行降級攻擊(稍后會詳細介紹),它仍然可以觸發(fā)。

  這個命令可以通過用任意數(shù)據(jù)改變內(nèi)存導(dǎo)致拒絕服務(wù),也可以進行遠程代碼執(zhí)行。攻擊者利用payload改變其控制地址中的內(nèi)存可能是RCE最簡單的利用途徑。許多可更改的函數(shù)指針、堆棧變量或C++vtable指針駐留在內(nèi)存中,并將執(zhí)行狀態(tài)從其原始狀態(tài)轉(zhuǎn)移??梢酝ㄟ^ROP技術(shù)利用這些來訪問攻擊者控制的代碼。Armis研究人員開發(fā)了一個類似的漏洞,當時利用URGENT/11的漏洞在2020年12月的白皮書(第20頁)中被證明會影響Modicon PLC。

  遠程過程調(diào)用RPC

  第二個未記錄的命令–PrivateMessage,它通過訪問輸入緩沖區(qū)中提供的指針所指向的C++對象,然后從這些解析對象中觸發(fā)回調(diào)函數(shù)來觸發(fā)PLC中的內(nèi)部函數(shù)。目前尚不清楚此特定命令的商業(yè)用途是什么,但很明顯,當傳遞的指針未指向PLC內(nèi)存中的有效C++對象時,它會導(dǎo)致拒絕服務(wù)。

  將此漏洞轉(zhuǎn)化為RCE只是稍微復(fù)雜一點。C++對象的有效結(jié)構(gòu)可以通過MemoryBlockWrite命令上傳到PLC內(nèi)存中的已知地址,然后可以發(fā)送PrivateMessage命令,觸發(fā)對攻擊者控制的C++對象vtable指針內(nèi)函數(shù)的調(diào)用。與上面詳述的步驟類似,通過控制程序的PC來獲取攻擊者控制的代碼只是通過幾個ROP小工具連接點的問題。

  降級攻擊

  施耐德電氣對上面提到的兩個未記錄命令的修復(fù)是相似的——在使用應(yīng)用程序口令時完全禁用它們。但是,當它不使用時,這些命令仍然可以訪問,也許是為了保留與使用這些命令的工具的一些遺留兼容性。

  但是,通過利用身份驗證繞過漏洞(例如CVE-2021-22779),攻擊者可以通過上傳未配置口令的新項目文件來降低PLC的安全性。一旦這種降級攻擊完成,攻擊者仍然可以使用上面詳述的未記錄的命令來獲得本機代碼執(zhí)行。

  攻擊步驟如下:

  1.使用CVE-2021-22779繞過身份驗證并預(yù)留PLC;

  2.上傳未配置應(yīng)用程序口令的新項目文件;

  3.釋放PLC預(yù)留并斷開與設(shè)備的連接;

  4.用基本預(yù)約方式重新連接PLC,無需口令;

  5.通過利用可以到達RCE(WritePhysicalAddress或PrivateMessage)的未記錄命令之一來實現(xiàn)代碼執(zhí)行。

  未來研究

  正如上面技術(shù)深入探討中所詳述的那樣,很明顯UMAS和Modbus中的潛在設(shè)計缺陷暫時仍未修復(fù)。雖然正在嘗試加強對某些命令的訪問,但這些設(shè)計缺陷給開發(fā)人員帶來了重大挑戰(zhàn)——這可能會導(dǎo)致未來出現(xiàn)更多漏洞。除了上面詳述的兩個CVE允許完全繞過預(yù)留增強機制之外,還存在兩個暫時尚未修補的額外攻擊場景。

  Man-on-the-Side身份驗證繞過

  如上所述,當成功預(yù)留時,PLC會返回一個1字節(jié)的令牌。此令牌稍后用于所有需要預(yù)留的命令。如果攻擊者位于網(wǎng)絡(luò)中,他能夠查看工程工作站和PLC之間的某些數(shù)據(jù)包,可以借此向PLC注入TCPRST數(shù)據(jù)包,這將斷開工作站和PLC之間的ModbusTCP連接。此外,PLC會保留預(yù)留令牌的狀態(tài)以供重復(fù)使用,持續(xù)幾秒鐘。如果在那個時間范圍內(nèi)攻擊者連接到PLC,他可以重用令牌,而無需重新進行身份驗證。這可以通過使用觀察到的令牌(在人為場景中)或簡單地強制使用255個可能的值來實現(xiàn)(PLC將拒絕錯誤的令牌,并且不會在多次嘗試時重置令牌)。

  盡管可以使用更長的令牌或通過拒絕蠻力嘗試來部分緩解這種攻擊場景,預(yù)留機制的潛在威脅依舊是缺乏加密——這允許攻擊者獲取可用于繞過此身份驗證機制的信息。

  中間人身份驗證繞過

  不幸的是,PLC還可能面臨一種更簡單直接的攻擊——中間人攻擊。例如,使用ARP欺騙,攻擊者可以在工程工作站和Modicon PLC之間充當中間人角色。

  使用此位置,攻擊者可以從工作站伏擊預(yù)留嘗試,并獲取合法用戶使用的憑據(jù)和/或令牌。雖然在當前的預(yù)留機制設(shè)計中,口令哈希值是通過MemoryBlockRead命令未加密傳遞的,預(yù)計將來不會使用該命令,并且不會以明文形式傳遞UMAS\Modbus連接。然而,由于協(xié)議目前沒有辦法檢測到中間人攻擊,簡單地將身份驗證數(shù)據(jù)包轉(zhuǎn)發(fā)到PLC將允許攻擊者獲得預(yù)留令牌,他可以濫用該令牌來運行任何未記錄的可用于更改PLC配置或觸發(fā)可能導(dǎo)致RCE的命令。

  修復(fù)這種中間人身份驗證繞過需要工程工作站和PLC之間的安全連接既能夠加密通信又能夠驗證雙方,驗證連接是否通過中間人傳遞。

  最后說明

  雖然現(xiàn)在端點中的安全通信被認為是一個已解決的問題,但以類似的方式解決它還是對工業(yè)控制器構(gòu)成了挑戰(zhàn)。在傳統(tǒng)端點中,服務(wù)使用證書進行身份驗證,并以安全的方式定義信任根。在工業(yè)控制器中,不存在允許驗證證書的用戶界面。在沒有這些方法的情況下創(chuàng)建安全通信需要對控制器進行物理訪問,通過控制器可以在外部與網(wǎng)絡(luò)交換密鑰。這將帶來部署挑戰(zhàn),制造商和供應(yīng)商似乎還沒有準備好邁出這一步。

  不幸的是,如果沒有這種對Modicon PLC通信方式的基本改造,上面詳述的安全風(fēng)險暫時仍與這些控制器相關(guān)。

  披露時間表:

  2020年11月13日——關(guān)于影響Modicon PLC的三個未記錄的UMAS命令的初步報告,這些命令可能導(dǎo)致遠程代碼執(zhí)行和信息泄漏。

  2020年11月21日-SE宣稱2個命令已經(jīng)修補(CVE-2018-7852,CVE-2019-6829),信息泄漏問題之前已向他們披露,預(yù)計將于2020年12月披露(CVE-2020-7537)。

  2020年11月25日——Armis發(fā)現(xiàn)兩個打補丁的命令沒有正確修復(fù),初始報告中提供的PoC腳本顯示這些PLC在最新軟件中仍然存在漏洞;此外,這些漏洞被確定為拒絕服務(wù),而Armis發(fā)現(xiàn)它們實際上可以導(dǎo)致遠程代碼執(zhí)行。

  2021年2月9日——SE聲稱這些PLC的補丁僅在PLC項目上設(shè)置了應(yīng)用程序口令時才有效。

  2021年2月25日——Armis發(fā)現(xiàn)了應(yīng)用口令機制的各種繞過技術(shù)(預(yù)留增強繞過、ARP欺騙、中間人,以及弱令牌)

  2021年3月26日——Armis提供了PoC腳本,演示了在未經(jīng)身份驗證的攻擊中繞過預(yù)留增強機制。這種攻擊允許攻擊者執(zhí)行降級攻擊——取消應(yīng)用程序口令限制,從而允許訪問可能導(dǎo)致本機代碼執(zhí)行的未記錄的UMAS命令。

  2021年3月31日——SE確認預(yù)留增強繞過中存在一個額外的漏洞(CVE-2021-22779),并且它也被另外的3rd方披露給他們。補丁預(yù)計將于2021年第四季度發(fā)布,SE將在2021年7月13日的公告中提供解決方法。由于設(shè)計限制,其他繞過技術(shù)(通過ARP欺騙和安全令牌的暴力破解的中間人)仍未打補丁。




電子技術(shù)圖片.png

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。