一個(gè)基于PLC的新型病毒:背景與病毒結(jié)構(gòu)
PLC是工業(yè)領(lǐng)域中很常用的一種控制器。現(xiàn)在常用的PLC都配備有以太網(wǎng)接口,并采用了IP協(xié)議。我們基于西門(mén)子S7-1200設(shè)計(jì)了一個(gè)蠕蟲(chóng)病毒,這種蠕蟲(chóng)病毒不需要借助PC機(jī),僅僅基于PLC設(shè)備就能實(shí)現(xiàn)擴(kuò)散,攻擊目標(biāo)并將自身進(jìn)行復(fù)制。該蠕蟲(chóng)病毒代碼在目標(biāo)機(jī)復(fù)制后不會(huì)發(fā)生變化,從而可以重復(fù)進(jìn)行目標(biāo)掃描,進(jìn)一步擴(kuò)散。我們分析了該蠕蟲(chóng)病毒的影響和預(yù)防措施。
1.概述
IT是現(xiàn)代工業(yè)控制系統(tǒng)的重要組成部分,因?yàn)槿绻麤](méi)有IT系統(tǒng),生產(chǎn)過(guò)程將無(wú)法進(jìn)行。不幸的事,由于引入了IT系統(tǒng),工控系統(tǒng)的使用者也面臨著傳統(tǒng)IT系統(tǒng)的信息安全威脅。IT系統(tǒng)的黑客可以從幾個(gè)不同的角度威脅工控系統(tǒng)。他們可以引起生產(chǎn)中斷,造成巨額經(jīng)濟(jì)損失,以及損壞周?chē)藛T的健康安全。震網(wǎng)病毒的案例充分說(shuō)明了這一點(diǎn)。伊朗鈾濃縮工作受西門(mén)子PLC被篡改的影響,被迫暫停。蠕蟲(chóng)病毒利用windows的漏洞,在鈾濃縮工廠的PC之間傳播。PLC的軟件被篡改,使得離心機(jī)被毀。該蠕蟲(chóng)病毒需要借助PC機(jī)進(jìn)行傳播,并基于PC機(jī)攻擊PLC設(shè)備。本文演示了一種基于PLC設(shè)備進(jìn)行傳播的蠕蟲(chóng)病毒,而不需要PC機(jī)。這種病毒可能被在役的PLC傳播到工控系統(tǒng)中,并在PLC之間傳播和復(fù)制。該蠕蟲(chóng)病毒進(jìn)入目標(biāo)后,復(fù)制自身代碼并修改目標(biāo)PLC中已經(jīng)下載完畢的用戶代碼,使病毒激活。本文基于西門(mén)子S7-1200 v3進(jìn)行實(shí)驗(yàn),用結(jié)構(gòu)文本編輯病毒代碼。
2.相關(guān)工作
2015年,Klick等人利用PLC的通信機(jī)制實(shí)現(xiàn)了一個(gè)代理,進(jìn)而展示了一種病毒。本文利用這一通信機(jī)制,基于新型號(hào)的S7-1200 V3實(shí)現(xiàn)了蠕蟲(chóng)病毒在PLC之間的傳播。
3.PLC結(jié)構(gòu)
圖1 Zyklus eines PLCs
PLC的過(guò)程映像區(qū)保存有所有輸入和輸出的狀態(tài),用戶程序在過(guò)程映像區(qū)中運(yùn)行,不直接操作PLC的物理輸入和輸出接口。用戶程序按照循環(huán)周期運(yùn)行,在每個(gè)循環(huán)周期的開(kāi)始和結(jié)束時(shí)間CPU會(huì)刷新過(guò)程映像區(qū),循環(huán)的 長(zhǎng)時(shí)間限制被稱(chēng)作循環(huán)周期。如果超出了循環(huán)周期,PLC會(huì)停止運(yùn)行并報(bào)異常。
程序組織單元(Program Organization Units,POU),西門(mén)子S7-1200支持如下POU:
組織塊(Organization block,OB),進(jìn)入用戶程序的主要入口
數(shù)據(jù)塊(Data block,DB),全局存儲(chǔ)
函數(shù)(Function),函數(shù)
函數(shù)塊(Function Block,F(xiàn)B),具有持續(xù)本地存儲(chǔ)的函數(shù)
除了用戶定義POU函數(shù),西門(mén)子還提供了幾種函數(shù)。包括TCON、TDISCON,利用這些函數(shù)PLC可以初始化和終止與任意系統(tǒng)之間的TCP連接。基于TRCV和TSEND函數(shù)緩沖區(qū)可以發(fā)送和接收函數(shù)。
4.計(jì)算機(jī)蠕蟲(chóng)病毒
蠕蟲(chóng)病毒攻擊包括以下三個(gè)階段:可能目標(biāo)檢測(cè),向目標(biāo)擴(kuò)散,在目標(biāo)上激活并執(zhí)行惡意代碼。
5.S7 1200的蠕蟲(chóng)病毒實(shí)現(xiàn)
5.1結(jié)構(gòu)
在S7 1200PLC上實(shí)現(xiàn)蠕蟲(chóng)病毒首先要滿足PLC關(guān)于 大執(zhí)行的循環(huán)時(shí)間限制,所以蠕蟲(chóng)病毒必須每隔幾毫秒就暫停一次,然后在下一次循環(huán)周期開(kāi)始時(shí)重新啟動(dòng)。為了滿足這一要求,本文使用狀態(tài)機(jī)設(shè)計(jì)蠕蟲(chóng)病毒,將病毒的當(dāng)前狀態(tài)保存在一個(gè)全局變量中,每隔循環(huán)周期的開(kāi)始階段會(huì)調(diào)用病毒的特定代碼,確保病毒的運(yùn)行不會(huì)超出PLC的循環(huán)時(shí)間限制。
圖2顯示了病毒的執(zhí)行流程。蠕蟲(chóng)病毒首先與潛在目標(biāo)建立一個(gè)連接,建立連接后蠕蟲(chóng)病毒先檢測(cè)目標(biāo)是否已被感染,如果沒(méi)有被感染則停止目標(biāo)上的用戶程序,并復(fù)制自己并向目標(biāo)傳送自己的代碼,然后重新啟動(dòng)PLC。然后繼續(xù)檢測(cè)潛在目標(biāo)PLC,循環(huán)執(zhí)行上述周期。
圖2 蠕蟲(chóng)病毒的傳播過(guò)程
5.2目標(biāo)檢測(cè)
蠕蟲(chóng)通過(guò)TCP的102端口檢測(cè)潛在目標(biāo),該端口只能被外部的防火墻關(guān)閉,而且沒(méi)有其他服務(wù)會(huì)使用該端口。
S7-1200使用POU的TCON函數(shù)管理TCP連接。源代碼如列表3所示,其中第3行顯示了POU的使用,第9行傳遞了一個(gè)任意的IP地址和端口。只要POU被調(diào)用,PLC就會(huì)嘗試建立連接。這一過(guò)程是異步執(zhí)行的。在稍后的循環(huán)周期中會(huì)驗(yàn)證連接狀態(tài)。返回值DONE表返回連接是否建立。如果返回值為true,則繼續(xù)傳播。如果IP地址和端口的連接無(wú)法建立,則不會(huì)引起錯(cuò)誤。通過(guò)在循環(huán)周期內(nèi)增加一個(gè)不斷增加的計(jì)數(shù)器,以實(shí)現(xiàn)定時(shí)功能。
圖3 利用SCL檢測(cè)目標(biāo)
如果經(jīng)過(guò)200個(gè)周期沒(méi)有建立連接,則蠕蟲(chóng)會(huì)執(zhí)行圖4中的程序。如果沒(méi)有建立連接,則必須調(diào)用POU的TDISCON釋放資源以便建立下一個(gè)連接,如在第13行中所示,IP地址增加。從而實(shí)現(xiàn)對(duì)所有的子網(wǎng)進(jìn)行掃描以尋找開(kāi)放的204端口。