原創(chuàng) | 施耐德電氣PLC ModiPwn漏洞綜述
2021-09-29
來(lái)源:網(wǎng)絡(luò)安全應(yīng)急技術(shù)國(guó)家工程實(shí)驗(yàn)室
Armis研究人員在施耐德電氣(SE)Modicon PLC中發(fā)現(xiàn)了一個(gè)新漏洞CVE-2021-22779,該漏洞被稱為ModiPwn,影響Modicon M340、M580以及Modicon系列的其他型號(hào)PLC。該漏洞繞過(guò)了這些PLC中用來(lái)防止濫用未記錄的Modbus命令的安全機(jī)制,Armis研究人員發(fā)現(xiàn)這些命令可用于接管PLC并獲取設(shè)備本地代碼執(zhí)行權(quán)限,攻擊者之后利用代碼可更改PLC的操作,同時(shí)對(duì)管理PLC的工程工作站隱藏其操作。這是一種未經(jīng)身份驗(yàn)證的攻擊,只需要對(duì)目標(biāo)PLC進(jìn)行網(wǎng)絡(luò)訪問(wèn)。
Armis于2020年11月13日通知SE,此后一直與他們合作以了解潛在問(wèn)題,并努力開(kāi)發(fā)補(bǔ)丁。2021年7月13日,SE發(fā)布了包含緩解措施的安全公告,完全修復(fù)這些問(wèn)題的補(bǔ)丁仍在開(kāi)發(fā)中。
在與SE合作的過(guò)程中,Armis研究人員發(fā)現(xiàn)并報(bào)告了兩個(gè)額外的尚未被SE解決的身份驗(yàn)證繞過(guò)技術(shù)。由于為Modicon PLC使用的UMAS協(xié)議提供支持的Modbus協(xié)議存在固有缺陷,Armis將繼續(xù)與SE和其他供應(yīng)商合作解決這些問(wèn)題。
技術(shù)綜述
Armis發(fā)現(xiàn)的漏洞CVE-2021-22779是一個(gè)身份驗(yàn)證繞過(guò)漏洞,可以與過(guò)去在UMAS協(xié)議中發(fā)現(xiàn)卻只能部分緩解的其他漏洞聯(lián)系在一起。Armis研究人員發(fā)現(xiàn)雖然這些額外的漏洞被歸類為拒絕服務(wù),它們實(shí)際上可以導(dǎo)致本地遠(yuǎn)程代碼執(zhí)行。這些漏洞本質(zhì)上是UMAS協(xié)議中未記錄的命令,Armis研究人員發(fā)現(xiàn),SE并沒(méi)有從協(xié)議中刪除這些命令(可能是由于遺留的依賴關(guān)系),而是在它們周?chē)砑恿艘粋€(gè)身份驗(yàn)證機(jī)制來(lái)降低它們的風(fēng)險(xiǎn)。不幸的是,這種機(jī)制被發(fā)現(xiàn)是有問(wèn)題的,根據(jù)最新的發(fā)現(xiàn),需要更加徹底的修復(fù)才可以解決這些問(wèn)題。
由于上述原因,以下CVE仍會(huì)影響Modicon M340和M580PLC的最新固件版本:
CVE-2021-22779–通過(guò)UMAS命令MemoryBlockRead繞過(guò)身份驗(yàn)證漏洞
CVE-2018-7852–通過(guò)UMAS命令PrivateMessage(RCE)解除不受信任的指針引用
CVE-2019-6829–通過(guò)UMAS命令WritePhysicalAddress(RCE)進(jìn)行任意內(nèi)存寫(xiě)入
CVE-2020-7537–通過(guò)UMAS命令ReadPhysicalAddress讀取任意內(nèi)存(信息泄漏)
其他Modicon型號(hào)目前被認(rèn)為不易受到攻擊。
要完全理解上述發(fā)現(xiàn)的技術(shù)細(xì)節(jié),需要了解Modbus和UMAS協(xié)議的一些背景知識(shí)。
Modbus
Modbus是在SCADA系統(tǒng)中控制PLC的實(shí)際標(biāo)準(zhǔn)。它于1979年由Modicon首次發(fā)布。Modbus是很久以前設(shè)計(jì)的,缺少現(xiàn)代系統(tǒng)所需的功能,例如二進(jìn)制對(duì)象與PLC之間的傳輸。
Modbus可以通過(guò)串行通信或IP通信運(yùn)行。廣泛使用的Modbus IP版本是Modbus/TCP標(biāo)準(zhǔn)。
圖1 Modbus/TCP頭部
Modicon之后在保留的Modbus功能代碼前提下擴(kuò)展了Modbus,擴(kuò)展協(xié)議稱為UMAS,它在基本Modbus協(xié)議的基礎(chǔ)上增加了身份驗(yàn)證、二進(jìn)制數(shù)據(jù)傳輸、固件更新和其他功能。
UMAS預(yù)留機(jī)制
Modicon PLC(M340、M580以及其他型號(hào))使用UMAS協(xié)議。UMAS重新實(shí)現(xiàn)了標(biāo)準(zhǔn)Modbus命令和一些Modbus缺少的必要功能。
圖2 UMAS頭部(包括Modbus功能代碼字段)
對(duì)PLC的某些更改需要多個(gè)相互依賴的命令,為允許此類情況,Modicon實(shí)施了預(yù)留機(jī)制。創(chuàng)建預(yù)留機(jī)制是為了同步PLC程序的修改——一種針對(duì)某些關(guān)鍵更改的全局鎖定機(jī)制。一旦工程工作站通過(guò)UMAS成功預(yù)留PLC,它就會(huì)收到一個(gè)1字節(jié)的令牌,用于對(duì)PLC進(jìn)行修改。不修改PLC的UMAS命令不需要此令牌,并且可以在沒(méi)有工作站任何身份驗(yàn)證的情況下執(zhí)行。由于一次只有一個(gè)工作站可以保留PLC,因此該機(jī)制可以保護(hù)PLC免受可能導(dǎo)致?lián)p壞PLC的重復(fù)修改。
預(yù)留機(jī)制的初始版本通過(guò)使用功能代碼為0x10的UMAS命令來(lái)工作。此命令不需要身份驗(yàn)證或質(zhì)詢-響應(yīng)握手,并且依賴于PLC和工程工作站上SE管理軟件之間的硬編碼共享敏感信息:
圖3 功能代碼0x10
這種機(jī)制使用的硬編碼敏感信息可以在未加密的UMAS流量中觀察到,或者通過(guò)對(duì)Modicon PLC固件進(jìn)行逆向工程來(lái)定位。
隨著時(shí)間的推移,各種未記錄的UMAS命令被證明允許遠(yuǎn)程代碼執(zhí)行或其他惡意意圖。SE決定預(yù)留增強(qiáng)機(jī)制,因此它不僅可以充當(dāng)鎖定機(jī)制,還可以充當(dāng)身份驗(yàn)證機(jī)制。預(yù)留增強(qiáng)機(jī)制基于質(zhì)詢-響應(yīng)握手,其中對(duì)共享口令口令行身份驗(yàn)證。
在兩種版本的預(yù)留機(jī)制中,成功預(yù)留后會(huì)發(fā)送一個(gè)1字節(jié)令牌作為響應(yīng),然后該令牌將被添加到需要身份驗(yàn)證的UMAS命令之前。
圖4 預(yù)留成功后的1字節(jié)令牌
身份驗(yàn)證繞過(guò)-CVE-2020-7537
在對(duì)預(yù)留增強(qiáng)機(jī)制的算法進(jìn)行逆向工程后,研究人員意識(shí)到是否可以通過(guò)未公開(kāi)的UMAS命令泄露應(yīng)用程序口令(或其哈希值)。對(duì)M340PLC最新固件(當(dāng)時(shí))的靜態(tài)分析,揭示了一個(gè)可疑的UMAS命令:
圖5 pu_ReadPhysicalAddress命令
pu_ReadPhysicalAddress命令拷貝從輸入命令所選擇地址的存儲(chǔ)塊,以響應(yīng)緩沖。除了緩沖區(qū)大小的簡(jiǎn)單驗(yàn)證之外,該函數(shù)對(duì)從內(nèi)存中讀取的地址沒(méi)有限制。本質(zhì)上,這個(gè)未記錄的命令允許泄漏PLC地址空間中的所有內(nèi)存。
該命令可用于泄漏存儲(chǔ)在PLC內(nèi)存中的應(yīng)用程序口令的哈希值,并用于未經(jīng)身份驗(yàn)證的攻擊者預(yù)留和管理PLC。
此外,諸如此類的內(nèi)存讀取命令可用于從PLC泄漏可能與其操作相關(guān)的敏感信息。由于此命令讀取的地址沒(méi)有限制,攻擊者可以濫用此命令通過(guò)讀取某些特定于硬件地址來(lái)使設(shè)備崩潰,這將導(dǎo)致PLC上的驅(qū)動(dòng)程序與硬件不同步。這可能會(huì)導(dǎo)致各種邊緣情況,從而導(dǎo)致拒絕服務(wù)。當(dāng)PLC以這種方式崩潰時(shí),它不能很快恢復(fù)正常運(yùn)行,操作員需要按下一個(gè)物理按鈕來(lái)重新啟動(dòng)設(shè)備。
此漏洞于2020年11月報(bào)告給SE,并在2020年12月的安全公告中披露。SE為解決此問(wèn)題而引入的補(bǔ)丁將ReadPhysicalAddress命令定義為需要保留的命令,利用該機(jī)制來(lái)抵御這種攻擊。雖然這確實(shí)減輕了這種身份驗(yàn)證繞過(guò),但它并沒(méi)有完全解決這個(gè)命令中的風(fēng)險(xiǎn)——因?yàn)槿绻褂玫捻?xiàng)目文件是無(wú)口令的,它仍然可能被觸發(fā)。
身份驗(yàn)證繞過(guò)-CVE-2021-22779
為了更好地了解預(yù)留增強(qiáng)機(jī)制的UMAS消息流,可以使用EcoStruxure軟件連接到PLC并分析它創(chuàng)建的流量。當(dāng)在EcoStruxure軟件中輸入正確的口令時(shí),會(huì)按預(yù)期生成一些UMAS命令,但是當(dāng)輸入的口令不正確時(shí),軟件拒絕了口令,而不會(huì)與PLC產(chǎn)生任何流量。這就提出了一個(gè)問(wèn)題——EcoStruxure軟件如何在不與PLC通信的情況下知道口令與否?為了回答這個(gè)問(wèn)題,首先應(yīng)當(dāng)分析在輸入口令之前工作站發(fā)送的UMAS命令。工作站使用的命令之一是MemoryBlockRead命令,它允許從內(nèi)存中讀取預(yù)配置的塊,無(wú)需身份驗(yàn)證(類似于MemoryBlockWrite命令)。與ReadPhysicalAddress命令不同,塊ID將內(nèi)存訪問(wèn)限制為某些固定內(nèi)存地址。
然而,軟件似乎使用這個(gè)命令,pre-reservation,從PLC讀取口令的哈希值,并驗(yàn)證用戶輸入的口令是否正確。毫無(wú)疑問(wèn),這種機(jī)制從根本上是有缺陷的——口令哈希值通過(guò)未加密的協(xié)議傳遞,可以被任何未經(jīng)身份驗(yàn)證的攻擊者讀取,只需執(zhí)行內(nèi)存塊讀取命令。
雖然EcoStruxure軟件使用內(nèi)存讀取命令來(lái)驗(yàn)證口令哈希,但未經(jīng)身份驗(yàn)證的攻擊者可以簡(jiǎn)單地使用讀取口令哈希完全繞過(guò)預(yù)留增強(qiáng)的身份驗(yàn)證機(jī)制。
遠(yuǎn)程代碼執(zhí)行RCE
如上所述,過(guò)去發(fā)現(xiàn)的兩個(gè)未記錄的UMAS命令WritePhysicalAddress(功能代碼0x29,CVE-2019-6829)和PrivateMessage(功能代碼0x6D,CVE-2018-7852),會(huì)導(dǎo)致拒絕服務(wù)。正如將在下面展示的,這兩個(gè)命令實(shí)際上還可以導(dǎo)致遠(yuǎn)程代碼執(zhí)行。
任意內(nèi)存寫(xiě)入
命令WritePhysicalAddress允許任意寫(xiě)入PLC內(nèi)存中的任何地址,并在輸入緩沖區(qū)中提供數(shù)據(jù)緩沖區(qū)。雖然在最新的固件版本中,在使用應(yīng)用程序口令時(shí)無(wú)法訪問(wèn)此命令,但如果在繞過(guò)預(yù)留機(jī)制后執(zhí)行降級(jí)攻擊(稍后會(huì)詳細(xì)介紹),它仍然可以觸發(fā)。
這個(gè)命令可以通過(guò)用任意數(shù)據(jù)改變內(nèi)存導(dǎo)致拒絕服務(wù),也可以進(jìn)行遠(yuǎn)程代碼執(zhí)行。攻擊者利用payload改變其控制地址中的內(nèi)存可能是RCE最簡(jiǎn)單的利用途徑。許多可更改的函數(shù)指針、堆棧變量或C++vtable指針駐留在內(nèi)存中,并將執(zhí)行狀態(tài)從其原始狀態(tài)轉(zhuǎn)移。可以通過(guò)ROP技術(shù)利用這些來(lái)訪問(wèn)攻擊者控制的代碼。Armis研究人員開(kāi)發(fā)了一個(gè)類似的漏洞,當(dāng)時(shí)利用URGENT/11的漏洞在2020年12月的白皮書(shū)(第20頁(yè))中被證明會(huì)影響Modicon PLC。
遠(yuǎn)程過(guò)程調(diào)用RPC
第二個(gè)未記錄的命令–PrivateMessage,它通過(guò)訪問(wèn)輸入緩沖區(qū)中提供的指針?biāo)赶虻腃++對(duì)象,然后從這些解析對(duì)象中觸發(fā)回調(diào)函數(shù)來(lái)觸發(fā)PLC中的內(nèi)部函數(shù)。目前尚不清楚此特定命令的商業(yè)用途是什么,但很明顯,當(dāng)傳遞的指針未指向PLC內(nèi)存中的有效C++對(duì)象時(shí),它會(huì)導(dǎo)致拒絕服務(wù)。
將此漏洞轉(zhuǎn)化為RCE只是稍微復(fù)雜一點(diǎn)。C++對(duì)象的有效結(jié)構(gòu)可以通過(guò)MemoryBlockWrite命令上傳到PLC內(nèi)存中的已知地址,然后可以發(fā)送PrivateMessage命令,觸發(fā)對(duì)攻擊者控制的C++對(duì)象vtable指針內(nèi)函數(shù)的調(diào)用。與上面詳述的步驟類似,通過(guò)控制程序的PC來(lái)獲取攻擊者控制的代碼只是通過(guò)幾個(gè)ROP小工具連接點(diǎn)的問(wèn)題。
降級(jí)攻擊
施耐德電氣對(duì)上面提到的兩個(gè)未記錄命令的修復(fù)是相似的——在使用應(yīng)用程序口令時(shí)完全禁用它們。但是,當(dāng)它不使用時(shí),這些命令仍然可以訪問(wèn),也許是為了保留與使用這些命令的工具的一些遺留兼容性。
但是,通過(guò)利用身份驗(yàn)證繞過(guò)漏洞(例如CVE-2021-22779),攻擊者可以通過(guò)上傳未配置口令的新項(xiàng)目文件來(lái)降低PLC的安全性。一旦這種降級(jí)攻擊完成,攻擊者仍然可以使用上面詳述的未記錄的命令來(lái)獲得本機(jī)代碼執(zhí)行。
攻擊步驟如下:
1.使用CVE-2021-22779繞過(guò)身份驗(yàn)證并預(yù)留PLC;
2.上傳未配置應(yīng)用程序口令的新項(xiàng)目文件;
3.釋放PLC預(yù)留并斷開(kāi)與設(shè)備的連接;
4.用基本預(yù)約方式重新連接PLC,無(wú)需口令;
5.通過(guò)利用可以到達(dá)RCE(WritePhysicalAddress或PrivateMessage)的未記錄命令之一來(lái)實(shí)現(xiàn)代碼執(zhí)行。
未來(lái)研究
正如上面技術(shù)深入探討中所詳述的那樣,很明顯UMAS和Modbus中的潛在設(shè)計(jì)缺陷暫時(shí)仍未修復(fù)。雖然正在嘗試加強(qiáng)對(duì)某些命令的訪問(wèn),但這些設(shè)計(jì)缺陷給開(kāi)發(fā)人員帶來(lái)了重大挑戰(zhàn)——這可能會(huì)導(dǎo)致未來(lái)出現(xiàn)更多漏洞。除了上面詳述的兩個(gè)CVE允許完全繞過(guò)預(yù)留增強(qiáng)機(jī)制之外,還存在兩個(gè)暫時(shí)尚未修補(bǔ)的額外攻擊場(chǎng)景。
Man-on-the-Side身份驗(yàn)證繞過(guò)
如上所述,當(dāng)成功預(yù)留時(shí),PLC會(huì)返回一個(gè)1字節(jié)的令牌。此令牌稍后用于所有需要預(yù)留的命令。如果攻擊者位于網(wǎng)絡(luò)中,他能夠查看工程工作站和PLC之間的某些數(shù)據(jù)包,可以借此向PLC注入TCPRST數(shù)據(jù)包,這將斷開(kāi)工作站和PLC之間的ModbusTCP連接。此外,PLC會(huì)保留預(yù)留令牌的狀態(tài)以供重復(fù)使用,持續(xù)幾秒鐘。如果在那個(gè)時(shí)間范圍內(nèi)攻擊者連接到PLC,他可以重用令牌,而無(wú)需重新進(jìn)行身份驗(yàn)證。這可以通過(guò)使用觀察到的令牌(在人為場(chǎng)景中)或簡(jiǎn)單地強(qiáng)制使用255個(gè)可能的值來(lái)實(shí)現(xiàn)(PLC將拒絕錯(cuò)誤的令牌,并且不會(huì)在多次嘗試時(shí)重置令牌)。
盡管可以使用更長(zhǎng)的令牌或通過(guò)拒絕蠻力嘗試來(lái)部分緩解這種攻擊場(chǎng)景,預(yù)留機(jī)制的潛在威脅依舊是缺乏加密——這允許攻擊者獲取可用于繞過(guò)此身份驗(yàn)證機(jī)制的信息。
中間人身份驗(yàn)證繞過(guò)
不幸的是,PLC還可能面臨一種更簡(jiǎn)單直接的攻擊——中間人攻擊。例如,使用ARP欺騙,攻擊者可以在工程工作站和Modicon PLC之間充當(dāng)中間人角色。
使用此位置,攻擊者可以從工作站伏擊預(yù)留嘗試,并獲取合法用戶使用的憑據(jù)和/或令牌。雖然在當(dāng)前的預(yù)留機(jī)制設(shè)計(jì)中,口令哈希值是通過(guò)MemoryBlockRead命令未加密傳遞的,預(yù)計(jì)將來(lái)不會(huì)使用該命令,并且不會(huì)以明文形式傳遞UMAS\Modbus連接。然而,由于協(xié)議目前沒(méi)有辦法檢測(cè)到中間人攻擊,簡(jiǎn)單地將身份驗(yàn)證數(shù)據(jù)包轉(zhuǎn)發(fā)到PLC將允許攻擊者獲得預(yù)留令牌,他可以濫用該令牌來(lái)運(yùn)行任何未記錄的可用于更改PLC配置或觸發(fā)可能導(dǎo)致RCE的命令。
修復(fù)這種中間人身份驗(yàn)證繞過(guò)需要工程工作站和PLC之間的安全連接既能夠加密通信又能夠驗(yàn)證雙方,驗(yàn)證連接是否通過(guò)中間人傳遞。
最后說(shuō)明
雖然現(xiàn)在端點(diǎn)中的安全通信被認(rèn)為是一個(gè)已解決的問(wèn)題,但以類似的方式解決它還是對(duì)工業(yè)控制器構(gòu)成了挑戰(zhàn)。在傳統(tǒng)端點(diǎn)中,服務(wù)使用證書(shū)進(jìn)行身份驗(yàn)證,并以安全的方式定義信任根。在工業(yè)控制器中,不存在允許驗(yàn)證證書(shū)的用戶界面。在沒(méi)有這些方法的情況下創(chuàng)建安全通信需要對(duì)控制器進(jìn)行物理訪問(wèn),通過(guò)控制器可以在外部與網(wǎng)絡(luò)交換密鑰。這將帶來(lái)部署挑戰(zhàn),制造商和供應(yīng)商似乎還沒(méi)有準(zhǔn)備好邁出這一步。
不幸的是,如果沒(méi)有這種對(duì)Modicon PLC通信方式的基本改造,上面詳述的安全風(fēng)險(xiǎn)暫時(shí)仍與這些控制器相關(guān)。
披露時(shí)間表:
2020年11月13日——關(guān)于影響Modicon PLC的三個(gè)未記錄的UMAS命令的初步報(bào)告,這些命令可能導(dǎo)致遠(yuǎn)程代碼執(zhí)行和信息泄漏。
2020年11月21日-SE宣稱2個(gè)命令已經(jīng)修補(bǔ)(CVE-2018-7852,CVE-2019-6829),信息泄漏問(wèn)題之前已向他們披露,預(yù)計(jì)將于2020年12月披露(CVE-2020-7537)。
2020年11月25日——Armis發(fā)現(xiàn)兩個(gè)打補(bǔ)丁的命令沒(méi)有正確修復(fù),初始報(bào)告中提供的PoC腳本顯示這些PLC在最新軟件中仍然存在漏洞;此外,這些漏洞被確定為拒絕服務(wù),而Armis發(fā)現(xiàn)它們實(shí)際上可以導(dǎo)致遠(yuǎn)程代碼執(zhí)行。
2021年2月9日——SE聲稱這些PLC的補(bǔ)丁僅在PLC項(xiàng)目上設(shè)置了應(yīng)用程序口令時(shí)才有效。
2021年2月25日——Armis發(fā)現(xiàn)了應(yīng)用口令機(jī)制的各種繞過(guò)技術(shù)(預(yù)留增強(qiáng)繞過(guò)、ARP欺騙、中間人,以及弱令牌)
2021年3月26日——Armis提供了PoC腳本,演示了在未經(jīng)身份驗(yàn)證的攻擊中繞過(guò)預(yù)留增強(qiáng)機(jī)制。這種攻擊允許攻擊者執(zhí)行降級(jí)攻擊——取消應(yīng)用程序口令限制,從而允許訪問(wèn)可能導(dǎo)致本機(jī)代碼執(zhí)行的未記錄的UMAS命令。
2021年3月31日——SE確認(rèn)預(yù)留增強(qiáng)繞過(guò)中存在一個(gè)額外的漏洞(CVE-2021-22779),并且它也被另外的3rd方披露給他們。補(bǔ)丁預(yù)計(jì)將于2021年第四季度發(fā)布,SE將在2021年7月13日的公告中提供解決方法。由于設(shè)計(jì)限制,其他繞過(guò)技術(shù)(通過(guò)ARP欺騙和安全令牌的暴力破解的中間人)仍未打補(bǔ)丁。