韓冬松,沙樂天,趙創(chuàng)業(yè)
(南京郵電大學(xué)計(jì)算機(jī)學(xué)院、軟件學(xué)院、網(wǎng)絡(luò)空間安全學(xué)院,江蘇 南京 210023)
隨著5G 網(wǎng)絡(luò)的不斷普及、物聯(lián)網(wǎng)設(shè)備的應(yīng)用和工業(yè)互聯(lián)網(wǎng)的發(fā)展,越來越多的信息技術(shù)涌入到工業(yè)生產(chǎn)的環(huán)境當(dāng)中,傳統(tǒng)設(shè)備漸漸被智能化設(shè)備取代,工業(yè)生產(chǎn)的效率得到了極大提升。但與之對(duì)應(yīng)的工業(yè)信息安全問題也隨之而來。傳統(tǒng)的工業(yè)控制系統(tǒng)是一個(gè)“信息孤島”,信息化融合過程打破了其一直以來的“封閉性”,工控系統(tǒng)遭受攻擊的可能性大大增加[1]。2010 年,“震網(wǎng)”病毒感染了超過4500 個(gè)網(wǎng)絡(luò),使工控監(jiān)控設(shè)備失去作用,導(dǎo)致伊朗核電站離心機(jī)在內(nèi)的多臺(tái)工業(yè)控制設(shè)備受損;2016 年,三一重工近千臺(tái)工程機(jī)械設(shè)備遭受非法解鎖破壞,直接經(jīng)濟(jì)損失超3000 萬元;2021 年11 月,丹麥風(fēng)力渦輪機(jī)巨頭Vestas Wind Systems 遭到網(wǎng)絡(luò)攻擊,導(dǎo)致了尚未明確的數(shù)據(jù)泄露[2]。由此可見,新技術(shù)的運(yùn)用對(duì)工業(yè)控制系統(tǒng)進(jìn)行智能化革新以提高生產(chǎn)效率的同時(shí),也帶來了更高的安全風(fēng)險(xiǎn)。
在工業(yè)控制系統(tǒng)中,PLC 作為工業(yè)生產(chǎn)的基礎(chǔ)性終端設(shè)備,是最接近生產(chǎn)設(shè)備的工控系統(tǒng)中的一環(huán)。PLC 可以接收控制程序,執(zhí)行計(jì)數(shù)與算術(shù)操作等用戶指令,并通過數(shù)字或模擬輸入/輸出控制各種類型的機(jī)械和生產(chǎn)設(shè)備,是連接物理世界和網(wǎng)絡(luò)世界的“橋梁”。然而由于PLC計(jì)算能力小、功能精簡(jiǎn)集中、安全設(shè)計(jì)薄弱的特性,使得PLC也成為攻擊工控系統(tǒng)的突破口之一。攻擊者可在未經(jīng)PLC 擁有者授權(quán)的情況下惡意篡改PLC內(nèi)部數(shù)據(jù)或者程序邏輯,造成PLC級(jí)聯(lián)設(shè)備執(zhí)行狀態(tài)的改變,從而改變生產(chǎn)過程[3]。本文利用工業(yè)控制系統(tǒng)中PLC的上述特性,融合多種已經(jīng)被證實(shí)可行的攻擊手段完成攻擊模型的構(gòu)建,并最終在模擬實(shí)際生產(chǎn)環(huán)境中驗(yàn)證該攻擊模型對(duì)工業(yè)生產(chǎn)所造成的威脅。
隨著工業(yè)控制系統(tǒng)受到的攻擊次數(shù)不斷增多,遭受的攻擊樣式越來越多樣,眾多的安全研究人員開始對(duì)工業(yè)控制系統(tǒng)中PLC 的安全性進(jìn)行研究。在Black Hat 2011 大會(huì)中,Beresford[4]在報(bào)告中演示了如何通過西門子S7Comm 協(xié)議的權(quán)限缺失漏洞來遠(yuǎn)程操作PLC。在Black Hat 2015,Klick 等人[5]在報(bào)告中演示攻擊者如何通過代理,來發(fā)現(xiàn)內(nèi)網(wǎng)中更多的PLC 設(shè)備。在Black Hat 2016,Spenneberg 等人[6]首次在報(bào)告中提出了PLC蠕蟲病毒的概念,使得攻擊源由傳統(tǒng)的PC 上位機(jī)變?yōu)镻LC。同樣在Black Hat 2016 的報(bào)告中展示了一種無法被檢測(cè)到的PLC RootKit。該攻擊方式的一個(gè)版本被稱為引腳配置,在PLC 操作系統(tǒng)不知情的狀態(tài)下用惡意代碼切換I/O引腳配置,從而影響生產(chǎn)結(jié)果,相比于之前所披露的PLC 攻擊方式,PLC Rootkit 對(duì)PLC 的攻擊立足于更低系統(tǒng)層級(jí),使得固件和邏輯操縱不再是黑客攻擊的唯一選擇[7]。由于網(wǎng)絡(luò)安全信息的敏感性,以及上述PLC 攻擊方式涉及具體的公司和設(shè)備型號(hào),因此上述多種PLC 攻擊方式更多是提供一種新的PLC 攻擊方向和驗(yàn)證其可行性,具體的攻擊細(xì)節(jié)未被披露。
本文所實(shí)現(xiàn)的攻擊模型正是對(duì)上述PLC 代理和PLC 蠕蟲概念的實(shí)現(xiàn)和融合,構(gòu)建出基于PLC 蠕蟲和PLC 代理的攻擊模型。以暴露在公網(wǎng)環(huán)境中的PLC為突破口,利用邏輯程序注入使該P(yáng)LC具有代理服務(wù)器的功能,反向連接攻擊者上位機(jī)并接收攻擊者發(fā)送的指令,按照攻擊者指令要求利用PLC蠕蟲實(shí)現(xiàn)對(duì)內(nèi)網(wǎng)環(huán)境中PLC 的攻擊和感染。由于攻擊者是被PLC代理所代理的,所以攻擊者對(duì)于內(nèi)網(wǎng)中的其他PLC不可見,大大提高了攻擊的隱蔽性,且代理PLC 可以重復(fù)對(duì)內(nèi)網(wǎng)PLC進(jìn)行攻擊,只對(duì)被攻擊的內(nèi)網(wǎng)PLC進(jìn)行替換或者防護(hù)無法擺脫該攻擊模型的攻擊,除非將已經(jīng)被改造為代理PLC 的PLC 移出內(nèi)網(wǎng)。但由于大規(guī)模工業(yè)生產(chǎn)環(huán)境的復(fù)雜性,對(duì)代理PLC的定位存在巨大的困難,如果攻擊發(fā)生在諸如電力、能源、交通、國防等領(lǐng)域,定位代理PLC過程中付出的安全和經(jīng)濟(jì)代價(jià)不言而喻。
無論對(duì)PLC采取何種攻擊方式,首先應(yīng)當(dāng)能夠與PLC 建立通信,而實(shí)現(xiàn)完整的PLC 通信過程離不開對(duì)工控系統(tǒng)中PLC 通信協(xié)議的剖析[8]。本文進(jìn)行工業(yè)控制系統(tǒng)攻擊建模所用PLC 型號(hào)為Siemens 公司的Siemens S7-1200 PLC,該型號(hào)PLC 應(yīng)用層采用Siemens 私有通信協(xié)議S7CommPlus,本文重點(diǎn)對(duì)S7CommPlus 通信協(xié)議進(jìn)行分析,其它通信協(xié)議分析過程類同。S7CommPlus 通信協(xié)議是Siemens 公司基于TPKT和ISO8073 協(xié)議進(jìn)行開發(fā)實(shí)現(xiàn)的應(yīng)用層協(xié)議,該協(xié)議相比于前代S7Comm 通信協(xié)議使用了更加復(fù)雜的編碼規(guī)范,并增加了防重放攻擊措施,具有更高通信安全性。S7-1200 PLC各層次通信協(xié)議如圖1所示。
圖1 S7-1200 PLC通信協(xié)議層次
由于工業(yè)控制系統(tǒng)中指令相對(duì)單一,數(shù)據(jù)報(bào)格式相對(duì)固定,所以對(duì)工控協(xié)議通信數(shù)據(jù)報(bào)的偽造和篡改較為容易。這也是大多數(shù)工控通信協(xié)議的通病。S7CommPlus協(xié)議報(bào)文結(jié)構(gòu)如圖2所示。
圖2 S7CommPlus協(xié)議結(jié)構(gòu)
S7CommPlus 協(xié)議主要分為Header、Data 和Trailer 部分。Header 和Trailer 數(shù)據(jù)完全一致,均包含Protocol Id、Protool version 和Data length 數(shù)據(jù)項(xiàng),當(dāng)PLC 型號(hào)被選定,內(nèi)置通信模塊確定,與同一個(gè)PLC通信的Protocol Id 和Protool version 不再發(fā)生變化,Data length 代表本條通信數(shù)據(jù)報(bào)的數(shù)據(jù)長(zhǎng)度,每一次通信過程都有不同的數(shù)據(jù)長(zhǎng)度。Data部分包含F(xiàn)unction、Session Id、Request Set 等眾多數(shù)據(jù)項(xiàng),這些數(shù)據(jù)項(xiàng)中重點(diǎn)關(guān)注Request Set 部分,攻擊模型構(gòu)建過程中的第三方偽造數(shù)據(jù)報(bào)代替上位機(jī)與PLC 進(jìn)行通信及攻擊指令發(fā)送依賴于該部分的數(shù)據(jù),而其余數(shù)據(jù)項(xiàng)可在通信過程中自動(dòng)生成。多個(gè)數(shù)據(jù)項(xiàng)不需要逐一設(shè)置,本文采用如下方式進(jìn)行多個(gè)數(shù)據(jù)項(xiàng)的獲取和設(shè)置:在上位機(jī)軟件中提前編寫將要注入PLC中的程序或者指令,利用上位機(jī)軟件與PLC進(jìn)行正常通信和數(shù)據(jù)下載,在此過程中利用數(shù)據(jù)包抓取軟件對(duì)通信過程數(shù)據(jù)包進(jìn)行抓取,從抓取的數(shù)據(jù)包中獲取到完整通信過程和數(shù)據(jù)傳輸過程數(shù)據(jù)包,獲取數(shù)據(jù)包中的數(shù)據(jù),之后就可以利用腳本語言套接字的方式代替上位機(jī)軟件與PLC進(jìn)行通信和數(shù)據(jù)傳輸,執(zhí)行結(jié)果和上位機(jī)與PLC的通信結(jié)果相同,這種方式通常應(yīng)用于重放攻擊[9]。對(duì)于應(yīng)用了防重放攻擊措施的S7CommPlus 協(xié)議,該方法無法奏效。
S7CommPlus 協(xié)議為S7Comm 協(xié)議的升級(jí)版本,使用了特殊的編碼規(guī)范,并引入了響應(yīng)字節(jié)防止重放攻擊。在PLC 的應(yīng)答報(bào)文中,S7CommPLus 協(xié)議的特定偏移處為一隨機(jī)變化的字節(jié),不同時(shí)刻建立的通信,PLC 應(yīng)答的該字節(jié)不同,其大小范圍為0x06 至0x7F。在后續(xù)與PLC進(jìn)一步數(shù)據(jù)交互的過程中,連接建立發(fā)起方,在其報(bào)文特定偏移處為該隨機(jī)字節(jié)加上0x80 后的值,否則PLC 將直接斷開連接,無法進(jìn)行后續(xù)通信,由于每一次建立通信響應(yīng)字節(jié)都不同,所以該措施有效防止了重放攻擊。防重放攻擊響應(yīng)字節(jié)結(jié)構(gòu)如圖3所示。
圖3 S7CommPlus響應(yīng)字節(jié)
如圖3 所示,與PLC 的每一次通信需要在上一次收到PLC 的回復(fù)后,獲取回復(fù)的第25 個(gè)字節(jié),將該字節(jié)與0x80 相加,并將相加的結(jié)果放置在下一次請(qǐng)求的第24 個(gè)字節(jié)和第29 個(gè)字節(jié)處,PLC 端會(huì)對(duì)第24 和29 字節(jié)處的字節(jié)進(jìn)行判斷,并由此推斷是否遭受重放攻擊[10]。由于該響應(yīng)字節(jié)的產(chǎn)生存在規(guī)律且可預(yù)測(cè),故防重放攻擊效果并不理想,可以比較容易地對(duì)該協(xié)議的通信過程進(jìn)行偽造,本攻擊模型構(gòu)建依賴于該通信協(xié)議漏洞(CVE-2016-2201)。
PLC 中的程序和數(shù)據(jù)以“數(shù)據(jù)塊”的形式存在,包括Organized Block (OB)、Data Block (DB)、Function Block(FB)、Function Control(FC),PLC 通過多個(gè)塊按照事先定義的邏輯順序協(xié)作完成對(duì)級(jí)聯(lián)設(shè)備進(jìn)行控制的整個(gè)過程[11]。其中OB 塊類似于Main 函數(shù),存儲(chǔ)PLC 運(yùn)行的代碼邏輯,是PLC 得以運(yùn)行的核心數(shù)據(jù)塊,DB 塊、FB 塊和FC 塊都為OB 塊的運(yùn)行服務(wù)?;赑LC 的這種存儲(chǔ)形式,對(duì)PLC 進(jìn)行攻擊時(shí),PLC 攻擊代碼寫在OB 塊中進(jìn)行注入,PLC 攻擊所需數(shù)據(jù)寫在DB塊中進(jìn)行注入。PLC 塊功能及相互關(guān)系如圖4所示。
圖4 PLC數(shù)據(jù)塊功能及相互關(guān)系
PLC 是現(xiàn)代工業(yè)自動(dòng)化生產(chǎn)的核心零部件。PLC 讀取的輸入可以是數(shù)字信號(hào)或者模數(shù)轉(zhuǎn)換后的模擬信號(hào),用來接收外部傳感器信號(hào)、生產(chǎn)設(shè)備反饋數(shù)據(jù)或者上位機(jī)指令[12]。PLC 寫出的輸出為數(shù)字信號(hào),用來對(duì)PLC 連接的級(jí)聯(lián)設(shè)備進(jìn)行控制。PLC 生產(chǎn)結(jié)構(gòu)拓?fù)淙鐖D5所示。
圖5 PLC生產(chǎn)結(jié)構(gòu)拓?fù)?/p>
PLC 蠕蟲,基于PLC 通信協(xié)議,不同于傳統(tǒng)的“上位機(jī)-PLC”數(shù)據(jù)傳輸方式,PLC 蠕蟲在PLC 與PLC 之間進(jìn)行傳播[13]。PLC 蠕蟲的出現(xiàn)顛覆了之前的攻擊者-上位機(jī)-PLC-級(jí)聯(lián)設(shè)備攻擊鏈路,變?yōu)楣粽?PLC-PLC-級(jí)聯(lián)設(shè)備攻擊鏈路,繞過了防護(hù)完善的上位機(jī),使得針對(duì)工業(yè)控制系統(tǒng)的攻擊難度大大降低。攻擊者需要將蠕蟲代碼注入一個(gè)PLC,使該P(yáng)LC 成為感染源,之后該P(yáng)LC會(huì)根據(jù)工業(yè)控制協(xié)議規(guī)定的通信規(guī)則對(duì)處于同一局域網(wǎng)下的PLC進(jìn)行連接和感染,后續(xù)感染流程不需要攻擊者參與。PLC 蠕蟲感染拓?fù)淙鐖D6所示。
圖6 蠕蟲傳播拓?fù)?/p>
如圖6 所示,PLC A 作為感染源,可以利用蠕蟲對(duì)同一局域網(wǎng)下的PLC進(jìn)行攻擊,通過塊注入的方式干擾PLC所連接級(jí)聯(lián)設(shè)備的生產(chǎn)過程;由于PLC蠕蟲本身就是多個(gè)數(shù)據(jù)塊的集合,所以也可以通過塊注入的方式將PLC 蠕蟲自身復(fù)制到同一局域網(wǎng)下的其它PLC 當(dāng)中,將多個(gè)PLC 改造為感染源,自我復(fù)制過程保證當(dāng)一個(gè)感染源被發(fā)現(xiàn)并清除,針對(duì)工業(yè)控制系統(tǒng)的攻擊仍可由其它PLC 繼續(xù)進(jìn)行[12]。盡管PLC 蠕蟲可以對(duì)內(nèi)網(wǎng)PLC進(jìn)行攻擊和復(fù)制,但PLC蠕蟲攻擊過程也存在不足,不足之處在于:1)PLC 蠕蟲的攻擊和復(fù)制從感染源PLC被啟動(dòng)開始,某些情況下這不是攻擊者所期望的PLC蠕蟲傳播時(shí)機(jī),攻擊者不僅僅希望能夠?qū)ν痪钟蚓W(wǎng)下的PLC進(jìn)行攻擊,也希望攻擊能夠發(fā)生在攻擊者希望的時(shí)間點(diǎn);2)由于PLC蠕蟲攻擊過程后續(xù)不需要攻擊者參與,所以當(dāng)蠕蟲代碼被注入感染源PLC 后,對(duì)內(nèi)網(wǎng)PLC 進(jìn)行何種攻擊就已固定,無法實(shí)現(xiàn)攻擊手段多樣化。正是由于上述不足,在攻擊模型中引入PLC代理,將PLC蠕蟲與PLC代理進(jìn)行融合,實(shí)現(xiàn)任意時(shí)刻的PLC蠕蟲傳播和指令控制下的攻擊手段多樣化。
網(wǎng)絡(luò)代理,是一種特殊的網(wǎng)絡(luò)服務(wù),它允許網(wǎng)絡(luò)終端A 通過該服務(wù)與網(wǎng)絡(luò)終端B 進(jìn)行非直接的連接,實(shí)現(xiàn)網(wǎng)絡(luò)終端A 對(duì)網(wǎng)絡(luò)終端B 的非直接訪問或獲取網(wǎng)絡(luò)終端B 的資源信息。提供代理服務(wù)的電腦系統(tǒng)或其他類型的網(wǎng)絡(luò)終端稱為代理服務(wù)器[14]。事實(shí)上,隨著工業(yè)化與信息化結(jié)合的不斷緊密,工業(yè)控制系統(tǒng)越來越多地采用標(biāo)準(zhǔn)化通信協(xié)議和軟硬件,并通過互聯(lián)網(wǎng)來實(shí)現(xiàn)遠(yuǎn)程控制和操作,使得相當(dāng)多的工業(yè)生產(chǎn)設(shè)備暴露在外界可直接訪問的環(huán)境當(dāng)中,這是PLC 代理之所以能夠?qū)崿F(xiàn)的前提[15]。通過代理程序注入的方式將暴露在公網(wǎng)中的PLC 改造為代理PLC,代理PLC反向連接攻擊者、接收攻擊指令和調(diào)用代理程序中定義好的攻擊方式進(jìn)行內(nèi)網(wǎng)攻擊。通過PLC代理來代理攻擊者,實(shí)現(xiàn)攻擊者在攻擊過程中的隱藏。代理PLC生成及執(zhí)行過程如圖7所示。
圖7 PLC代理執(zhí)行過程
檢測(cè)到可被訪問的PLC之后,由于PLC網(wǎng)絡(luò)通信使用固定的端口,可直接使用socket 套接字與可訪問的PLC 建立通信。本文涉及的PLC 型號(hào)所用網(wǎng)絡(luò)通信端口為102,對(duì)于已經(jīng)暴露在可訪問環(huán)境中的PLC,使用socket 通信將代理程序注入可被訪問的PLC 當(dāng)中,則該P(yáng)LC 被改造為代理PLC,代理程序中包含對(duì)攻擊者上位機(jī)的反向連接操作,而一般的網(wǎng)絡(luò)防火墻不會(huì)隔絕網(wǎng)絡(luò)內(nèi)部對(duì)外部的訪問,因此,只要工業(yè)控制網(wǎng)絡(luò)沒有實(shí)現(xiàn)完全的網(wǎng)絡(luò)隔離,攻擊者就可以接收到PLC的反向連接信息并建立通信連接,通信建立之后,攻擊者可以在任意時(shí)刻向代理PLC發(fā)送指令。
出于通過互聯(lián)網(wǎng)來實(shí)現(xiàn)遠(yuǎn)程控制和操作PLC 的需要,PLC 可能會(huì)被映射在可被直接訪問的環(huán)境當(dāng)中,但通常PLC會(huì)采取保護(hù)措施來避免不受信任用戶對(duì)PLC的操作,例如用戶訪問白名單或配置PLC禁止寫。但對(duì)白名單的繞過和訪問受保護(hù)的內(nèi)存區(qū)域漏洞已經(jīng)被發(fā)現(xiàn),工業(yè)網(wǎng)絡(luò)安全公司Claroty 于2021 年披露的PLC漏洞(CVE-2020-15782)證明未經(jīng)身份驗(yàn)證的遠(yuǎn)程攻擊者可繞過白名單并通過網(wǎng)絡(luò)訪問PLC的TCP通信端口執(zhí)行遠(yuǎn)程代碼,將任意數(shù)據(jù)或代碼寫入受保護(hù)的內(nèi)存區(qū)域或讀取敏感區(qū)域的數(shù)據(jù)[16]。該漏洞的發(fā)現(xiàn)也使設(shè)置了用戶訪問白名單或配置了PLC禁止寫等防護(hù)措施的PLC被攻擊成為可能。
PLC 代理實(shí)現(xiàn)對(duì)內(nèi)網(wǎng)環(huán)境的突破,PLC 蠕蟲實(shí)現(xiàn)對(duì)內(nèi)網(wǎng)環(huán)境中PLC的攻擊或感染,本文所構(gòu)建的攻擊模型將二者融合實(shí)現(xiàn)對(duì)工業(yè)控制系統(tǒng)內(nèi)網(wǎng)生產(chǎn)環(huán)境中級(jí)聯(lián)設(shè)備生產(chǎn)狀態(tài)和輸出結(jié)果的改變。
將PLC改造為代理PLC過程中,代理程序以塊的形式被注入PLC,該P(yáng)LC 被改造為代理服務(wù)器PLC,該代理程序就是本文所構(gòu)建的攻擊模型的核心。代理程序具體可劃分為2 個(gè)模塊,反向連接攻擊者上位機(jī)及指令接收模塊和PLC 攻擊模塊。反向連接攻擊者上位機(jī)及指令接收模塊有2個(gè)子功能:
1)負(fù)責(zé)與攻擊者上位機(jī)建立通信,該功能使代理PLC 能處于攻擊者的控制之下,即使代理PLC 被防護(hù),也能保證攻擊者后續(xù)攻擊指令的發(fā)布。
2)接收攻擊者上位機(jī)發(fā)送的攻擊指令,并將攻擊指令進(jìn)行存儲(chǔ),若指令不為空則跳轉(zhuǎn)至PLC 攻擊模塊;PLC 攻擊模塊包含多種攻擊效果代碼及其所需數(shù)據(jù),跳轉(zhuǎn)至該模塊標(biāo)志著對(duì)內(nèi)網(wǎng)PLC開始攻擊。
該模塊首先會(huì)對(duì)存儲(chǔ)的攻擊指令進(jìn)行判斷,根據(jù)指令判斷結(jié)果選定要實(shí)現(xiàn)的攻擊效果。之后該模塊與內(nèi)網(wǎng)PLC 進(jìn)行遍歷連接,連接建立之后,使用PLC蠕蟲對(duì)內(nèi)網(wǎng)PLC 進(jìn)行攻擊實(shí)現(xiàn)攻擊效果。本文所構(gòu)建攻擊模型的攻擊過程如圖8所示。
圖8 攻擊模型的攻擊過程
如圖8 所示,該攻擊模型包含代理程序注入、代理PLC 反向連接攻擊者上位機(jī)、攻擊者發(fā)布攻擊指令、指令判斷跳轉(zhuǎn)、根據(jù)指令選擇攻擊效果、PLC 蠕蟲攻擊、干擾運(yùn)行7 個(gè)步驟。不同于以往的攻擊者首先攻擊PLC上位機(jī),獲取PLC上位機(jī)權(quán)限之后再利用上位機(jī)將惡意代碼注入內(nèi)網(wǎng)PLC,改變內(nèi)網(wǎng)PLC 級(jí)聯(lián)設(shè)備的運(yùn)行狀態(tài)這一過程,本文構(gòu)建的攻擊模型中首先攻擊一個(gè)可被直接訪問的PLC,通過代碼注入將其設(shè)置為代理PLC,之后對(duì)內(nèi)網(wǎng)PLC 的攻擊由代理PLC 來進(jìn)行,將傳統(tǒng)的“上位機(jī)-PLC-級(jí)聯(lián)設(shè)備”攻擊鏈路轉(zhuǎn)變?yōu)椤癙LC-PLC-級(jí)聯(lián)設(shè)備”攻擊鏈路。
該模塊負(fù)責(zé)反向連接攻擊者上位機(jī)及攻擊者攻擊指令的接收。改造完成之后的代理PLC 執(zhí)行代理功能,被代理者為攻擊者上位機(jī)。在一些情況下,暴露在可直接訪問環(huán)境的代理PLC 可能會(huì)被放回到有防火墻的環(huán)境中,此時(shí)攻擊者通過正向連接的方式無法再與代理PLC 建立通信,而防火墻無法防止由內(nèi)而外的泄密行為,所以通過將反向連接攻擊者上位機(jī)這一功能植入代理PLC,代理PLC 從防火墻內(nèi)部與攻擊者建立連接,保證代理PLC 即使在有防火墻防護(hù)的環(huán)境中也能接收到攻擊者的攻擊指令。這也就是利用PLC 代理實(shí)現(xiàn)對(duì)內(nèi)網(wǎng)環(huán)境的突破,為后續(xù)攻擊奠定基礎(chǔ)。
未接收到攻擊者的攻擊指令時(shí),反向連接攻擊者上位機(jī)模塊處于對(duì)攻擊者上位機(jī)的循環(huán)連接請(qǐng)求過程當(dāng)中,該連接過程主要使用Siemens PLC 組態(tài)函數(shù)TCON_DB、TSEND、TRCV 和TDISCON_DB,TCON_DB函數(shù)負(fù)責(zé)與主機(jī)建立TCP 連接,TSEND 和TRCV 負(fù)責(zé)2 臺(tái)通信設(shè)備間信息的發(fā)送和接收,TDISCON_DB 負(fù)責(zé)與主機(jī)斷開連接,只有斷開與主機(jī)連接,代理PLC才能在后續(xù)過程與內(nèi)網(wǎng)PLC 建立連接。代理PLC 反向連接攻擊者上位機(jī)及指令接收過程如圖9所示。
圖9 反向連接攻擊者上位機(jī)及指令接收模塊工作過程
如圖9 所示,步驟4 為反向連接攻擊者上位機(jī)及指令接收模塊向攻擊者上位機(jī)發(fā)送信息,該信息在本攻擊模型中的意義在于使攻擊者感知到代理PLC 處于可工作狀態(tài)。步驟5 為反向連接攻擊者上位機(jī)及指令接收模塊接收攻擊指令,接收后指令內(nèi)容被存儲(chǔ)在代理PLC的DB塊中。本模塊的整個(gè)連接建立及指令接收過程不會(huì)影響代理PLC 正常輸出信號(hào)進(jìn)行生產(chǎn)控制,所以對(duì)于生產(chǎn)設(shè)備參數(shù)監(jiān)視者而言PLC執(zhí)行該模塊是無感的。接收到攻擊者攻擊指令且判斷不為空之后,代理PLC從反向連接攻擊者上位機(jī)及接收指令模塊跳轉(zhuǎn)至PLC攻擊模塊。
當(dāng)接收到攻擊者指令并跳轉(zhuǎn)至PLC 攻擊模塊之后,PLC 攻擊模塊使用PLC 蠕蟲對(duì)內(nèi)網(wǎng)PLC 進(jìn)行攻擊。PLC 蠕蟲可被看作是一種載體,可將數(shù)據(jù)塊、指令等內(nèi)容傳輸至內(nèi)網(wǎng)PLC 并執(zhí)行,也可選擇在內(nèi)網(wǎng)PLC 進(jìn)行蠕蟲自我復(fù)制。PLC 攻擊模塊攻擊過程如圖10 所示。整個(gè)PLC 蠕蟲攻擊過程需要嚴(yán)格按照PLC通信協(xié)議進(jìn)行函數(shù)和數(shù)據(jù)構(gòu)造。
圖10 PLC攻擊模塊攻擊過程
PLC 攻擊模塊包含多種攻擊代碼,在該模塊中可對(duì)反向連接攻擊者上位機(jī)及接收指令模塊接收到的攻擊者指令進(jìn)行判斷,從而決定采取何種攻擊方式。本文所構(gòu)建的攻擊模型中攻擊者指令采用數(shù)字形式,攻擊指令與所采取的攻擊方式對(duì)應(yīng)關(guān)系如圖11所示。
圖11 攻擊指令與攻擊方式對(duì)應(yīng)關(guān)系
攻擊方式主要包括簡(jiǎn)單惡意響應(yīng)攻擊、惡意參數(shù)命令注入攻擊、惡意功能命令注入攻擊、拒絕服務(wù)攻擊等[17]。簡(jiǎn)單惡意響應(yīng)攻擊:強(qiáng)制性啟停PLC,干擾PLC 正常工作進(jìn)程。惡意參數(shù)命令注入攻擊:通過注入一個(gè)引腳控制塊,強(qiáng)制改變PLC中某引腳的輸出狀態(tài),改變PLC 執(zhí)行過程[18]。惡意功能命令注入攻擊:將一個(gè)或多個(gè)塊注入內(nèi)網(wǎng)PLC,內(nèi)網(wǎng)PLC 執(zhí)行新注入的塊,改變PLC的執(zhí)行過程和執(zhí)行結(jié)果。拒絕服務(wù)攻擊:設(shè)定一個(gè)頻率,不斷訪問內(nèi)網(wǎng)PLC的通信端口,使內(nèi)網(wǎng)PLC失去正常通信能力,由于PLC上位機(jī)使用網(wǎng)線連接或者無線連接的方式與PLC通信,所以該種攻擊可以使PLC 上位機(jī)無法操縱PLC,使操作員失去對(duì)PLC的控制,也就是PLC拒絕服務(wù)[19]。除了以上提到的幾種攻擊方式之外,隨著針對(duì)工業(yè)控制系統(tǒng)的攻擊方式的不斷發(fā)展,可以在該工業(yè)控制系統(tǒng)攻擊模型中組合更多新型的攻擊方式,實(shí)現(xiàn)對(duì)工業(yè)控制系統(tǒng)更隱蔽、更強(qiáng)破壞性的攻擊。這也是本文所構(gòu)造的攻擊模型特點(diǎn)所在,以PLC代理和PLC蠕蟲作為攻擊模型基礎(chǔ),在該基礎(chǔ)上實(shí)現(xiàn)多種不同的PLC攻擊效果。
至此,本文所述工業(yè)控制系統(tǒng)攻擊模型已構(gòu)建完成。利用PLC代理實(shí)現(xiàn)內(nèi)網(wǎng)突破,利用PLC蠕蟲融合多種攻擊方式攻擊內(nèi)網(wǎng)PLC,改變內(nèi)網(wǎng)PLC 級(jí)聯(lián)設(shè)備的執(zhí)行狀態(tài)和執(zhí)行結(jié)果,最終摒棄傳統(tǒng)的攻擊者-PLC 上位機(jī)-PLC-級(jí)聯(lián)設(shè)備攻擊鏈條,實(shí)現(xiàn)完整的攻擊者-PLC-PLC-級(jí)聯(lián)設(shè)備攻擊鏈條。
實(shí)驗(yàn)環(huán)境軟硬件配置如表1所示,分為上位機(jī)端和生產(chǎn)設(shè)備端2個(gè)部分。代理程序注入及攻擊者指令發(fā)送使用Python編程,Python版本為3.9。PLC編程使用Siemens獨(dú)有的Structured Control Language(SCL)語言。
表1 實(shí)驗(yàn)環(huán)境設(shè)備配置
實(shí)驗(yàn)所搭建的模擬生產(chǎn)設(shè)備端環(huán)境如圖12 所示,環(huán)境包括步進(jìn)電機(jī)、內(nèi)網(wǎng)PLC、電機(jī)驅(qū)動(dòng)器、電源、代理PLC,代理PLC 和內(nèi)網(wǎng)PLC 經(jīng)由交換機(jī)連接于同一局域網(wǎng)下,這也是實(shí)際生產(chǎn)環(huán)境中可能采用的級(jí)聯(lián)設(shè)備配置方式。
圖12 生產(chǎn)設(shè)備端環(huán)境
實(shí)際生產(chǎn)環(huán)境中PLC以集群的方式進(jìn)行配置,負(fù)責(zé)同一生產(chǎn)過程的PLC處于同一集群,多個(gè)PLC組成的集群經(jīng)由同一交換機(jī)連接于同一網(wǎng)絡(luò)之下,方便生產(chǎn)流程監(jiān)測(cè)者在一臺(tái)監(jiān)測(cè)設(shè)備觀察負(fù)責(zé)同一生產(chǎn)過程的所有PLC。出于安全考慮,PLC 使用者會(huì)設(shè)置PLC 集群與集群間的物理隔離,但只要沒有實(shí)現(xiàn)任意2 臺(tái)PLC 之間的完全物理隔離,PLC 蠕蟲對(duì)同一集群中的PLC進(jìn)行攻擊就成為可能。
3.2.1 簡(jiǎn)單惡意響應(yīng)攻擊驗(yàn)證
簡(jiǎn)單惡意響應(yīng)攻擊是針對(duì)工業(yè)控制系統(tǒng)比較常見的一類攻擊,比如控制工業(yè)控制設(shè)備的惡意啟停,使設(shè)備停止運(yùn)作。2010 年針對(duì)伊朗核電站的“震網(wǎng)”工控攻擊就涉及了此類攻擊,攻擊使核電站中的溫度參數(shù)采集監(jiān)測(cè)PLC 停止工作或向監(jiān)測(cè)人員發(fā)送被注入的虛假數(shù)據(jù),致使核電站離心機(jī)內(nèi)部溫度升高而監(jiān)測(cè)人員無法及時(shí)發(fā)現(xiàn),最終導(dǎo)致核電站發(fā)生爆炸事故。本文構(gòu)建的攻擊模型所進(jìn)行的簡(jiǎn)單惡意響應(yīng)攻擊就對(duì)惡意啟停這一攻擊方式進(jìn)行了驗(yàn)證。代理程序中簡(jiǎn)單惡意響應(yīng)攻擊對(duì)應(yīng)指令“1”,攻擊者向代理PLC 發(fā)送指令“1”,代理PLC 的指令接收模塊接收到攻擊者指令,指令不為空則跳轉(zhuǎn)至PLC 攻擊模塊,PLC 攻擊模塊判斷指令,判斷指令內(nèi)容為“1”,隨即調(diào)用PLC 攻擊模塊中的Stop 代碼塊對(duì)內(nèi)網(wǎng)PLC 進(jìn)行攻擊,指令判斷及攻擊代碼調(diào)用如圖13所示。
圖13 簡(jiǎn)單惡意響應(yīng)攻擊指令判斷和代碼調(diào)用
內(nèi)網(wǎng)PLC 被代理PLC 攻擊之前處于RUN 狀態(tài),級(jí)聯(lián)設(shè)備可以正常運(yùn)行,內(nèi)網(wǎng)PLC被代理PLC攻擊之后被惡意篡改狀態(tài)為STOP 狀態(tài),相應(yīng)的內(nèi)網(wǎng)PLC 級(jí)聯(lián)設(shè)備也停止工作。攻擊前后內(nèi)網(wǎng)PLC 狀態(tài)變化如圖14所示。
圖14 簡(jiǎn)單惡意響應(yīng)攻擊前后對(duì)比
如圖14 所示,攻擊前RUN/STOP 信號(hào)顯示綠色,也就是RUN狀態(tài),且有一信號(hào)輸出口Q0.0顯示綠色,該信號(hào)輸出口處于工作狀態(tài),可以控制級(jí)聯(lián)設(shè)備的運(yùn)行。攻擊后RUN/STOP 信號(hào)顯示橙色,且信號(hào)輸出口不再亮起,此時(shí)PLC處于STOP狀態(tài)不再工作,攻擊生效。該實(shí)驗(yàn)驗(yàn)證了本文所構(gòu)建的攻擊模型可實(shí)現(xiàn)針對(duì)工業(yè)控制系統(tǒng)中PLC的簡(jiǎn)單惡意響應(yīng)攻擊。
3.2.2 惡意功能命令注入攻擊驗(yàn)證
惡意功能命令注入攻擊也是比較常見的針對(duì)工業(yè)控制系統(tǒng)的攻擊方式,相比于本文提到的其他攻擊方式而言,惡意功能命令注入攻擊不僅能影響到工控系統(tǒng)的正常運(yùn)轉(zhuǎn),更重要的是可以通過功能代碼注入使工控系統(tǒng)按照攻擊者設(shè)想的執(zhí)行過程進(jìn)行運(yùn)轉(zhuǎn)。本文設(shè)計(jì)實(shí)驗(yàn)來驗(yàn)證惡意功能命令注入攻擊。
代理程序中惡意功能命令注入攻擊對(duì)應(yīng)攻擊指令為“3”,攻擊者向代理PLC 發(fā)送指令“3”,代理PLC的指令接收模塊接收攻擊者指令并將指令暫存在數(shù)據(jù)塊的數(shù)組recvdata2 中,指令不為空則跳轉(zhuǎn)至PLC攻擊模塊,PLC 攻擊模塊對(duì)指令進(jìn)行判斷,判斷指令內(nèi)容為“3”,則PLC 攻擊模塊使用PLC 蠕蟲向內(nèi)網(wǎng)PLC 注入組織塊sendOB125 實(shí)現(xiàn)對(duì)目標(biāo)PLC 的攻擊,該攻擊過程可以在任意時(shí)刻進(jìn)行,指令判斷與攻擊代碼調(diào)用如圖15所示。
如圖15 中代碼所示,程序?qū)ecvdata2 數(shù)組中的數(shù)據(jù)進(jìn)行判斷,如果判斷recvdata2[0]存儲(chǔ)的數(shù)據(jù)為“3”,則執(zhí)行后續(xù)的攻擊過程,否則跳過。代碼中的變量con_state2 作為代碼接力執(zhí)行的狀態(tài)碼,狀態(tài)碼的存在使整個(gè)代理程序除了循環(huán)執(zhí)行之外,可以按照攻擊者意圖執(zhí)行代碼跳過和判斷等復(fù)雜操作[20]。攻擊前后內(nèi)網(wǎng)PLC 項(xiàng)目樹對(duì)比如圖16 所示,可以看到項(xiàng)目樹中增加了被注入的OB125組織塊。
代理PLC對(duì)內(nèi)網(wǎng)PLC進(jìn)行攻擊前,內(nèi)網(wǎng)PLC級(jí)聯(lián)電機(jī)的轉(zhuǎn)動(dòng)速度為299 r/s,該轉(zhuǎn)動(dòng)速率可看作是實(shí)際生產(chǎn)環(huán)境中的電機(jī)正常轉(zhuǎn)動(dòng)速率,內(nèi)網(wǎng)PLC被代理PLC 攻擊之后,代理PLC 將OB125 塊注入內(nèi)網(wǎng)PLC,在OB125塊被執(zhí)行之后,內(nèi)網(wǎng)PLC級(jí)聯(lián)電機(jī)轉(zhuǎn)動(dòng)速度變?yōu)?78 r/s。攻擊前后內(nèi)網(wǎng)PLC 級(jí)聯(lián)電機(jī)轉(zhuǎn)動(dòng)速率對(duì)比如圖17所示。
通過實(shí)驗(yàn)結(jié)果可以看到本文所構(gòu)建的攻擊模型可以有效實(shí)現(xiàn)對(duì)工業(yè)控制系統(tǒng)中PLC 的惡意功能命令注入攻擊,實(shí)現(xiàn)對(duì)PLC 級(jí)聯(lián)設(shè)備運(yùn)行狀態(tài)的影響。其他攻擊方式經(jīng)過模擬生產(chǎn)環(huán)境實(shí)驗(yàn)表明均可被實(shí)現(xiàn),本文不再闡述。
本文所構(gòu)建的攻擊模型實(shí)現(xiàn)了PLC蠕蟲和PLC代理的融合,根據(jù)2種PLC攻擊方式所具有的特性,應(yīng)用在攻擊模型構(gòu)建的不同階段,完成攻擊模型的構(gòu)建。
為了進(jìn)一步說明模型的有效性,選取已有文獻(xiàn)中實(shí)用效果較好的工控系統(tǒng)攻擊模型進(jìn)行比較,攻擊模型對(duì)比如表2所示。
表2 攻擊模型比較
表2 中比較結(jié)果表明,基于攻擊圖的工控網(wǎng)絡(luò)威脅建??梢垣@得良好的攻擊效果,但該攻擊模型的攻擊源頭需要利用Windowst系統(tǒng)漏洞、U盤或外部設(shè)備接入、內(nèi)部人員打開嵌入惡意代碼的文檔或郵件等方式開始攻擊,而上位機(jī)系統(tǒng)可設(shè)置的安全防護(hù)系統(tǒng)遠(yuǎn)多于工控設(shè)備本身,且上位機(jī)防護(hù)系統(tǒng)處于快速迭代當(dāng)中,因此直接攻擊上位機(jī)的難度巨大。如果利用社會(huì)工程學(xué)或內(nèi)部工作人員的工作疏忽,該攻擊又具有偶然性,操作難度較大。電力信息物理跨空間協(xié)同攻擊模型不需要攻擊上位機(jī),該模型利用PLC蠕蟲對(duì)內(nèi)網(wǎng)PLC進(jìn)行攻擊,但該攻擊模型專注于在PLC中注入虛假數(shù)據(jù)欺騙工控監(jiān)控系統(tǒng),無法使PLC級(jí)聯(lián)設(shè)備按照攻擊者意圖執(zhí)行,攻擊手段較單一,且該攻擊模型僅使用PLC 蠕蟲,當(dāng)失去可被直接訪問的PLC,PLC蠕蟲將失去源頭,則該模型將無法發(fā)揮作用。本文所構(gòu)建的攻擊模型則針對(duì)上述2 個(gè)工控攻擊模型的缺陷做出改進(jìn),改進(jìn)如下:
1)本文構(gòu)建的攻擊模型將傳統(tǒng)的攻擊者-上位機(jī)-PLC-級(jí)聯(lián)設(shè)備攻擊鏈轉(zhuǎn)變?yōu)楣粽?PLC-PLC-級(jí)聯(lián)設(shè)備攻擊鏈,繞過防護(hù)嚴(yán)密的上位機(jī),使針對(duì)工控系統(tǒng)的攻擊難度降低。
2)在攻擊模型中加入多種攻擊手段,可以實(shí)現(xiàn)簡(jiǎn)單惡意響應(yīng)攻擊、惡意參數(shù)命令注入攻擊、惡意功能命令注入攻擊、拒絕服務(wù)攻擊等,適應(yīng)不同狀況下的攻擊需求。
3)使用PLC作為代理,當(dāng)某個(gè)時(shí)刻失去可直接訪問的PLC,之前被改造的代理PLC 仍能通過反向連接的方式再次與攻擊者建立連接,使攻擊模型可獲得重復(fù)利用。
通過對(duì)基于PLC 代理和PLC 蠕蟲的工業(yè)控制系統(tǒng)攻擊模型構(gòu)建并進(jìn)行與之相關(guān)的實(shí)驗(yàn),表明該攻擊模式與不同攻擊方式結(jié)合均可對(duì)工業(yè)控制系統(tǒng)安全造成巨大威脅。針對(duì)本文所述攻擊模型而言,整個(gè)攻擊過程依然沒有脫離通信數(shù)據(jù)報(bào)重放、數(shù)據(jù)注入、第三方指令偽造等常見網(wǎng)絡(luò)入侵手段,是多種網(wǎng)絡(luò)入侵方法的融合[23]。因此,提前采取安全措施可避免遭受此類攻擊。
可采取的安全措施包括:1)避免工業(yè)控制設(shè)備暴露在可被直接訪問的環(huán)境當(dāng)中,犧牲設(shè)備控制靈活性,但工業(yè)控制系統(tǒng)安全性大大提高[24];2)實(shí)現(xiàn)不同工業(yè)控制設(shè)備間的物理隔離,避免將多臺(tái)工業(yè)控制設(shè)備連接在同一網(wǎng)絡(luò)當(dāng)中[25];3)定期更新工業(yè)控制設(shè)備中的程序和數(shù)據(jù),重新執(zhí)行程序下載過程會(huì)覆蓋之前所有的舊程序和舊數(shù)據(jù),包括被惡意注入的數(shù)據(jù),以及對(duì)于數(shù)據(jù)傳輸過程進(jìn)行更為嚴(yán)格的加密[26];4)及時(shí)更新工業(yè)控制系統(tǒng)防火墻,防火墻會(huì)及時(shí)對(duì)披露的工控漏洞進(jìn)行補(bǔ)丁更新,以避免工控系統(tǒng)被入侵[27];5)針對(duì)當(dāng)下流行的工業(yè)控制系統(tǒng)入侵檢測(cè)和態(tài)勢(shì)感知等機(jī)器學(xué)習(xí)算法,應(yīng)用成熟的工控防護(hù)產(chǎn)品進(jìn)行工業(yè)控制系統(tǒng)的安全防護(hù)[28]。入侵檢測(cè)不再局限于被入侵之后的感知,而是在入侵過程中就感知到攻擊,并對(duì)攻擊進(jìn)行遏制,由攻擊后檢測(cè)變?yōu)槿肭智邦A(yù)防。筆者在學(xué)習(xí)過程中接觸的比較高效實(shí)用的入侵檢測(cè)方案包括:PU學(xué)習(xí)入侵檢測(cè)方法[29]、支持向量機(jī)的入侵檢測(cè)等[30]。采取上述防護(hù)措施之后,可大大降低工業(yè)控制系統(tǒng)被攻擊的風(fēng)險(xiǎn)。
目前工控系統(tǒng)的應(yīng)用已經(jīng)十分普及,出于操作便利性和實(shí)時(shí)性的需要,工控系統(tǒng)在網(wǎng)絡(luò)環(huán)境的暴露度也逐漸增多,使得工控系統(tǒng)脆弱性逐漸顯現(xiàn)出來。本文以工控系統(tǒng)中的基礎(chǔ)性終端設(shè)備PLC作為切入點(diǎn),進(jìn)行基于PLC 代理和PLC 蠕蟲的工業(yè)控制系統(tǒng)攻擊模型的構(gòu)建,并在該模型的基礎(chǔ)上加入多種攻擊方式,實(shí)現(xiàn)對(duì)工業(yè)控制系統(tǒng)中PLC的入侵和PLC級(jí)聯(lián)設(shè)備執(zhí)行狀態(tài)的改變。通過總結(jié)攻擊模型構(gòu)建過程中涉及的攻擊技術(shù),針對(duì)該類攻擊模型的攻擊過程給出了針對(duì)性的防護(hù)建議,這對(duì)實(shí)際生產(chǎn)場(chǎng)景中防護(hù)此類工業(yè)控制系統(tǒng)攻擊具有幫助。