本發(fā)明涉及漏洞自動挖掘領(lǐng)域,尤其涉及一種基于狀態(tài)關(guān)系圖的PLC漏洞挖掘方法。
背景技術(shù):
PLC漏洞挖掘是當(dāng)前工業(yè)控制系統(tǒng)安全的一個非常重要的關(guān)鍵技術(shù),PLC作為工業(yè)控制系統(tǒng)的重要組成部分之一,其安全性也是如今關(guān)注的焦點。在近幾年對工控系統(tǒng)的評估研究中,發(fā)現(xiàn)PLC系統(tǒng)存在著不少安全隱患,如西門子PLC及監(jiān)控軟件APOGEE Insight存在“劫持漏洞”;施耐德電氣公司所發(fā)布的莫迪康(Modicon)M340可編程邏輯控制器(PLC)存在高嚴(yán)重性緩沖區(qū)溢出漏洞;三菱FX3G PLC存在拒絕服務(wù)漏洞,允許攻擊者利用該漏洞通過發(fā)送特殊數(shù)據(jù)包使PLC重啟等。所以對PLC系統(tǒng)的漏洞挖掘是當(dāng)下研究的重點。
PLC(可編程邏輯控制器)是一種采用一類可編程的存儲器,用于其內(nèi)部存儲程序,執(zhí)行邏輯運算、順序控制、定時、計數(shù)與算術(shù)操作等面向用戶的指令,并通過數(shù)字或模擬式輸入/輸出控制各種類型的機械或生產(chǎn)過程。其工作原理是通過反復(fù)執(zhí)行用戶程序來實現(xiàn)控制功能,采用循環(huán)掃描的工作方式,系統(tǒng)周而復(fù)始的以一定的順序完成一系列的具體工作,這些工作包括內(nèi)部處理、通信處理、輸入處理、程序執(zhí)行、輸出處理這五個階段。PLC每進(jìn)行一次掃描循環(huán)所用的時間為掃描周期。PLC分為運行(RUN)和停止(STOP)兩種工作狀態(tài),當(dāng)處于運行狀態(tài)時,上述掃描周期不斷循環(huán);當(dāng)處于停止?fàn)顟B(tài)時,只完成內(nèi)部處理和通信服務(wù)工作。
當(dāng)前對工控系統(tǒng)的漏洞挖掘主要基于模糊測試技術(shù),模糊測試是一種通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。其主要是利用SPIKE、Peach、Sulley、Dfuz和Bunny等工具進(jìn)行模糊測試。當(dāng)前對PLC漏洞挖掘技術(shù)有基于軟硬件編程數(shù)據(jù)的工業(yè)控制系統(tǒng)的漏洞挖掘方法,但是當(dāng)前PLC挖掘的模糊測試效率還比較低,產(chǎn)生的畸形數(shù)據(jù)導(dǎo)致PLC異常的漏洞挖掘方法不適用于運行狀態(tài)下PLC漏洞監(jiān)測。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種基于狀態(tài)關(guān)系圖的PLC漏洞挖掘方法。該方法的基本原理是根據(jù)PLC的運行過程,首先在正常狀態(tài)下生產(chǎn)輸入狀態(tài)圖和輸出狀態(tài)圖,然后在對數(shù)據(jù)輸入、程序處理、數(shù)據(jù)輸出過程注入攻擊數(shù)據(jù),通過對比狀態(tài)圖的差異,判斷PLC是否存在安全漏洞。
本發(fā)明為克服現(xiàn)有技術(shù)的不足采取以下技術(shù)方案實現(xiàn):
本發(fā)明公布了一種基于狀態(tài)關(guān)系圖的PLC漏洞挖掘方法,該方法主要利用采集某時刻輸入映像區(qū)和輸出鎖存區(qū)的數(shù)據(jù),生成狀態(tài),研究輸入狀態(tài)與輸出狀態(tài)之間的邏輯關(guān)系,以此得出邏輯狀態(tài)關(guān)系圖,由此圖來判斷PLC中是否存在壞數(shù)據(jù)注入攻擊,以及是在PLC工作過程中的哪一部分區(qū)域存在何種壞數(shù)據(jù)注入攻擊。
這種方法可以分為三個模塊:狀態(tài)關(guān)系圖生成模塊、壞數(shù)據(jù)注入攻擊模塊和PLC漏洞判斷模塊。
狀態(tài)關(guān)系圖生成模塊:讀取輸入映像區(qū)的數(shù)據(jù),就可以生成某時刻輸入映像區(qū)的狀態(tài)。與此同時,讀取輸出鎖存區(qū)的數(shù)據(jù),就可以生成某時刻輸出鎖存區(qū)的狀態(tài)。然后,通過輸入映像區(qū)的狀態(tài)以及輸出鎖存區(qū)的狀態(tài)之間的邏輯關(guān)系,產(chǎn)生出邏輯狀態(tài)關(guān)系圖。
壞數(shù)據(jù)注入攻擊模塊:在某個時鐘周期內(nèi),在PLC正常運行過程中,對PLC的輸入映像區(qū)和輸出鎖存區(qū)注入壞數(shù)據(jù)。PLC的所有輸入端子的數(shù)據(jù)按順序存入輸入映像區(qū)。然后在程序處理區(qū)中,PLC根據(jù)讀入的輸入數(shù)據(jù),依次執(zhí)行指令中的內(nèi)容,并寫入映像區(qū)。當(dāng)所有指令執(zhí)行結(jié)束后,將輸入映像區(qū)中的狀態(tài)傳輸至輸出鎖存區(qū)中做最后的輸出處理。在壞數(shù)據(jù)注入攻擊后,會導(dǎo)致輸入映像區(qū)、程序處理區(qū)和輸出鎖存區(qū)的數(shù)據(jù)產(chǎn)生差異,通過數(shù)據(jù)之間的邏輯關(guān)系,引發(fā)數(shù)據(jù)之間的關(guān)聯(lián)故障。
PLC漏洞判斷模塊:通過對比正常時候產(chǎn)生的輸入狀態(tài)、輸出狀態(tài)的邏輯關(guān)系來判斷PLC工作過程中的各區(qū)域是否存在壞數(shù)據(jù)注入攻擊,其步驟如下:
步驟1:采集輸入數(shù)據(jù),采集所有輸入端子的數(shù)據(jù);
步驟2:根據(jù)所采集的輸入數(shù)據(jù),生成某時刻的輸入狀態(tài)圖;
步驟3:采集輸出數(shù)據(jù),采集所有輸出端子的數(shù)據(jù);
步驟4:根據(jù)所采集的輸出數(shù)據(jù),生成某時刻的輸出狀態(tài)圖;
步驟5:根據(jù)輸入和輸出的邏輯狀態(tài)關(guān)系圖判斷此時刻的輸入狀態(tài)和輸出狀態(tài)是否符合邏輯關(guān)系,若符合則回到步驟1,因為PLC的工作流程是周而復(fù)始地進(jìn)行,所以開始新一輪的數(shù)據(jù)采集,若不符合則繼續(xù)進(jìn)行PLC漏洞判斷;
步驟6:輸入映像區(qū)攻擊判斷,因為輸入映像區(qū)的數(shù)據(jù)和狀態(tài)是PLC直接由輸入端子順序存入,若輸入端子的狀態(tài)和輸入映像區(qū)的狀態(tài)不一致,則可以判定存在輸入映像區(qū)攻擊,若一致則進(jìn)行步驟7,輸出鎖存區(qū)攻擊判斷;
步驟7:輸出鎖存區(qū)攻擊判斷,因為輸出端子的數(shù)據(jù)和狀態(tài)是由輸出鎖存區(qū)直接輸出處理,若輸出端子的狀態(tài)和輸出鎖存區(qū)的狀態(tài)不一致,則可以判定存在輸出鎖存區(qū)攻擊,若一致則判定攻擊存在于程序處理區(qū)。
本發(fā)明與現(xiàn)有技術(shù)相比的優(yōu)點和積極效果是:
(1)本發(fā)明采用的是PLC運行正常環(huán)境下的狀態(tài)圖,通過數(shù)據(jù)注入攻擊,觸發(fā)PLC狀態(tài)異常,這樣的異常不一定導(dǎo)致PLC停機的嚴(yán)重事故,但是輕微的狀態(tài)變化就可以發(fā)現(xiàn)PLC存在可疑漏洞,在方法上優(yōu)于基于的畸形數(shù)據(jù)包的測試;
(2)本發(fā)明的測試方法可以在PLC正常運行狀態(tài)下進(jìn)行漏洞測試,從真實的工業(yè)控制系統(tǒng)中發(fā)現(xiàn)疑似漏洞,在實用性上優(yōu)于離線的PLC漏洞測試方法。
附圖說明
圖1為系統(tǒng)結(jié)構(gòu)圖;PLC漏洞挖掘方法結(jié)構(gòu)圖;
圖2為狀態(tài)關(guān)系圖生成模塊;
圖3為壞數(shù)據(jù)注入攻擊模塊;
圖4為PLC漏洞判斷流程圖模塊。
圖1為系統(tǒng)結(jié)構(gòu)圖,本發(fā)明主要包括狀態(tài)關(guān)系圖生成模塊、壞數(shù)據(jù)注入攻擊模塊、PLC漏洞判斷模塊。通過輸入輸出狀態(tài)的邏輯關(guān)系判斷是否存在壞數(shù)據(jù)注入攻擊。
圖2為狀態(tài)關(guān)系圖生成模塊,讀取輸入映像區(qū)數(shù)據(jù)和輸出鎖存區(qū)數(shù)據(jù),分別生成某時刻的狀態(tài),通過輸入狀態(tài)以及輸出狀態(tài)之間的邏輯關(guān)系,產(chǎn)生邏輯狀態(tài)關(guān)系圖。
圖3為壞數(shù)據(jù)注入攻擊模塊,在某個時鐘周期內(nèi),在PLC正常運行過程中,對PLC的輸入映像區(qū)和輸出鎖存區(qū)注入壞數(shù)據(jù)。PLC的所有輸入端子的數(shù)據(jù)按順序存入輸入映像區(qū)。然后在程序處理區(qū)中,PLC根據(jù)讀入的輸入數(shù)據(jù),依次執(zhí)行指令中的內(nèi)容,并寫入映像區(qū)。當(dāng)所有指令執(zhí)行結(jié)束后,將輸入映像區(qū)中的狀態(tài)傳輸至輸出鎖存區(qū)中做最后的輸出處理。在壞數(shù)據(jù)注入攻擊后,會導(dǎo)致輸入映像區(qū)、程序處理區(qū)和輸出鎖存區(qū)的數(shù)據(jù)產(chǎn)生差異,通過數(shù)據(jù)之間的邏輯關(guān)系,引發(fā)數(shù)據(jù)之間的關(guān)聯(lián)故障。
圖4為PLC漏洞判斷流程圖,包括以下步驟,
步驟1:采集輸入數(shù)據(jù),采集所有輸入端子的數(shù)據(jù);
步驟2:根據(jù)所采集的輸入數(shù)據(jù),生成某時刻的輸入狀態(tài)圖;
步驟3:采集輸出數(shù)據(jù),采集所有輸出端子的數(shù)據(jù);
步驟4:根據(jù)所采集的輸出數(shù)據(jù),生成某時刻的輸出狀態(tài)圖;
步驟5:根據(jù)輸入和輸出的邏輯狀態(tài)關(guān)系圖判斷此時刻的輸入狀態(tài)和輸出狀態(tài)是否符合邏輯關(guān)系,若符合則回到步驟1,因為PLC的工作流程是周而復(fù)始地進(jìn)行,所以開始新一輪的數(shù)據(jù)采集,若不符合則繼續(xù)進(jìn)行PLC漏洞判斷;
步驟6:輸入映像區(qū)攻擊判斷,因為輸入映像區(qū)的數(shù)據(jù)和狀態(tài)是PLC直接由輸入端子順序存入,若輸入端子的狀態(tài)和輸入映像區(qū)的狀態(tài)不一致,則可以判定存在輸入映像區(qū)攻擊,若一致則進(jìn)行步驟7,輸出鎖存區(qū)攻擊判斷;
步驟7:輸出鎖存區(qū)攻擊判斷,因為輸出端子的數(shù)據(jù)和狀態(tài)是由輸出鎖存區(qū)直接輸出處理,若輸出端子的狀態(tài)和輸出鎖存區(qū)的狀態(tài)不一致,則可以判定存在輸出鎖存區(qū)攻擊,若一致則判定攻擊存在于程序處理區(qū)。