陳大偉,徐茹枝
(華北電力大學(xué) 控制與計算機工程學(xué)院,北京 102206)
隨著網(wǎng)絡(luò)與信息技術(shù)在工業(yè)控制系統(tǒng)中的廣泛應(yīng)用,針對工控系統(tǒng)的攻擊行為也與日俱增,例如2000年澳大利亞的MaroochyShire排水系統(tǒng)受到攻擊,導(dǎo)致800 000 L污水未經(jīng)處理直接排放;2010年伊朗核電站遭受“震網(wǎng)”病毒攻擊;2015年烏克蘭電網(wǎng)遭受攻擊而導(dǎo)致部分地區(qū)停電。這些嚴重的安全事故反映了保障工控系統(tǒng)安全的迫切性。
PLC(Programmable Logic Controller)在工業(yè)控制系統(tǒng)中扮演著重要的角色,其幾乎可以控制工業(yè)過程中的所有關(guān)鍵要素,被認為是 “現(xiàn)代工業(yè)控制系統(tǒng)的大腦”。在工業(yè)環(huán)境下,未能及時且正確地執(zhí)行一個或多個I/O操作可能導(dǎo)致工業(yè)過程的失敗,從而導(dǎo)致不可接受的后果,所以確保PLC安全可靠運行至關(guān)重要。因此,對工業(yè)控制系統(tǒng)中PLC的安全漏洞和利用控制流完整性對PLC進行保護的研究具有重要意義。
根據(jù)PLC設(shè)備的特點以及程序的執(zhí)行流程和控制邏輯,PLC存在的安全漏洞被分為3種類型:固件修改漏洞、配置操作漏洞和控制流劫持漏洞[1]。
PLC擁有以太網(wǎng)模塊,且制造商也提供了升級或替換以太網(wǎng)卡的服務(wù),但在大多數(shù)情況下,固件上傳到現(xiàn)場設(shè)備的以太網(wǎng)卡時沒有有效的安全保護機制,攻擊者利用PLC的以太網(wǎng)模塊上載惡意固件,實現(xiàn)對PLC的攻擊[2]。PLC的固件提供了系統(tǒng)輸入和物理輸出之間的軟件驅(qū)動接口,這使得攻擊者在用戶級就可以進行修改,利用PLC的固件更新執(zhí)行惡意二進制代碼[3]。針對PLC的固件修改漏洞,固件完整性驗證方法[4-5]能有效地檢測或阻止固件修改漏洞的攻擊,并且這種驗證方法可以在PLC存儲新固件或運行時執(zhí)行。
攻擊者通過PLC的配置操作漏洞上傳惡意的控制邏輯來改變原有的物理控制過程,從而達到攻擊目的。配置操作漏洞產(chǎn)生的原因是工程人員編寫代碼時過于注重系統(tǒng)功能,忽視了代碼可能產(chǎn)生的漏洞和安全缺陷,例如旁路跳過、缺少某些線圈或輸出、指令復(fù)用、硬編碼使用、缺乏認證、缺少診斷和預(yù)警信息等。
公開的PLC控制流劫持漏洞逐年增加,如表1所示。
表1 PLC的控制流劫持漏洞
由表1可以看出,PLC的控制流劫持攻擊主要通過PLC設(shè)備無法發(fā)現(xiàn)的漏洞來實現(xiàn)。
針對PLC的控制流劫持攻擊,現(xiàn)存的防御方法并不完善,所以本文研究的重點是PLC的控制流劫持防御,以此提出了針對PLC的控制流完整性機制,提高了工控系統(tǒng)中PLC的安全性。
二進制安全中,漏洞利用的主要目的為劫持目標設(shè)備的控制流,使目標設(shè)備按照攻擊者的意圖執(zhí)行,或使攻擊者獲取目標系統(tǒng)的控制權(quán),以此全面控制目標設(shè)備[7]??刂屏鹘俪止裟軌?qū)崿F(xiàn)的主要原因是PLC對數(shù)據(jù)和代碼沒有進行明確區(qū)分,PLC的存儲器結(jié)構(gòu),如圖1所示。
圖1 PLC的存儲器結(jié)構(gòu)Figure 1.Structure of memory of PLC
隨著攻擊者的攻擊手段不斷進化,DEP(Data Execution Prevention)和ASLR(Address Space Layout Randomization)防御機制已經(jīng)被證實無法有效抵御控制流劫持攻擊,例如可利用代碼重用攻擊繞過DEP保護。代碼重用攻擊利用程序中正常的代碼片段,拼接成惡意代碼實現(xiàn)控制流劫持攻擊,不需要注入代碼就可以遠程執(zhí)行任意代碼。已知的代碼重用攻擊包括Ret2Libc、ROP、JOP、Ret2ZP等。
PLC、通用計算機和手機設(shè)備均可能遭受代碼重用攻擊,但PLC存在一定特殊性,例如ARM中的函數(shù)參數(shù)是通過寄存器傳遞而不是堆棧,故使用ARM體系結(jié)構(gòu)的PLC不會直接受到Ret2Libc攻擊,但會受到Ret2ZP攻擊[8]。針對PLC的代碼重用攻擊是下一步研究的重點。
由以上分析可知,PLC存在安全漏洞的原因如下:(1)PLC與馮諾依曼體系結(jié)構(gòu)相似,其可編程性為攻擊者編寫攻擊代碼提供了程序運行的環(huán)境;(2)PLC作為下位機,與上位機的通信協(xié)議存在缺陷,使得惡意程序容易獲得PLC的操作權(quán)限;(3)PLC的內(nèi)存讀寫是弱保護,使得惡意程序容易獲得PLC的操作權(quán)限。
控制流完整性已經(jīng)被公認為是一種有效的針對控制流劫持的防御方法[9]。通過對控制流程圖的分析,獲取程序中控制轉(zhuǎn)移指令,的目標白名單,包括間接跳轉(zhuǎn)、間接調(diào)用和函數(shù)返回指令。在程序的執(zhí)行過程中,核對控制轉(zhuǎn)移指令的目標是否在白名單中,以此有效地檢測出攻擊者對目標設(shè)備的劫持。
控制流完整性可以分為細粒度的控制流完整性和粗粒度的控制流完整性。細粒度的控制流完整性檢查程序中的每條控制轉(zhuǎn)移指令,確保每條指令都只能轉(zhuǎn)移到自身的目標集合中,因此帶來了很大的性能開銷,而較大的性能開銷則限制了這類安全機制的廣泛引入。粗粒度的控制流完整性通過放寬一定的檢查條件來降低性能開銷,例如CCFIR驗證目標比傳統(tǒng)的控制流完整性機制更快且更簡單[10],剝離二進制文件的技術(shù)同樣有效降低了控制流完整性機制的性能開銷[11]。但是,更加寬松的檢查條件使得粗粒度的控制流完整性有可能被攻擊者繞過[12],例如攻擊者可以針對粗粒度的控制流完整性構(gòu)建圖靈完備的代碼重用攻擊[13]。因此,粗粒度的控制流完整性機制雖然有效降低了性能開銷,但安全性得不到充分保證。
確保控制流完整性機制的安全性以及解決控制流完整性機制的性能開銷是當前研究的熱點,例如通過改進上下文敏感和字段敏感指針構(gòu)建內(nèi)核級的細粒度控制流程圖[14]或強制為每個具體輸入計算控制流程圖[15],以此提高控制流完整性機制的安全性并降低性能開銷。
較大的性能開銷會影響設(shè)備運行效率并破壞PLC的實時性,但PLC是硬實時設(shè)備,在關(guān)鍵基礎(chǔ)設(shè)施中不能因控制流完整性而破壞PLC的實時性。
控制流完整性機制大多應(yīng)用于通用計算機,但其對嵌入式設(shè)備同樣有效[16],例如針對ARM處理器驅(qū)動的設(shè)備[17]。大部分PLC使用ARM體系結(jié)構(gòu)。針對PLC這種特殊嵌入式設(shè)備的制流完整性研究較少,因此設(shè)計針對PLC的更加安全且性能開銷較低的控制流完整性機制是本文研究的重點。
設(shè)計PLC的控制流完整性機制,考慮以下因素,即PLC控制流完整性機制的設(shè)計原則:(1)運行現(xiàn)代操作系統(tǒng)。某些不具備操作系統(tǒng)的嵌入式設(shè)備稱為低功耗嵌入式設(shè)備。但大多數(shù)PLC擁有真正的操作系統(tǒng),針對PLC的保護方案是具有現(xiàn)代操作系統(tǒng)的嵌入式設(shè)備。設(shè)計PLC的控制流完整性機制時考慮PLC運行實時操作系統(tǒng);(2)不考慮硬件修改。性能開銷是限制控制流完整性機制發(fā)展的主要障礙,設(shè)計針對PLC的控制流完整性機制時應(yīng)著重解決性能開銷問題,但不必考慮引入嵌入式設(shè)備的硬件,應(yīng)通過改進控制流完整性機制解決性能開銷問題;(3)不依賴于虛擬化。大多數(shù)嵌入式設(shè)備的處理器不支持虛擬化。任何純粹基于虛擬化的設(shè)計方案都不適用;(4)安全性??刂屏魍暾詸C制應(yīng)有足夠的安全性,不能被攻擊者繞過且不能增加系統(tǒng)風險;(5)性能開銷。性能開銷是控制流完整性機制的最大弊端,也是限制諸多PLC安全機制發(fā)展的最大屏障。設(shè)計針對PLC的控制流完整性機制時,解決性能開銷問題至關(guān)重要;(6)實時性。首先考慮PLC的實時性,嚴格的實時性作為第一要素,不能因安全性而破壞PLC的實時性和可用性,應(yīng)衡量和取舍PLC的安全性及實時性。
ARM體系結(jié)構(gòu)是PLC最常用的體系結(jié)構(gòu),如Allen-Bradley、Schneider Electric、Honeywell、WAGO等供應(yīng)商制造的PLC均使用ARM體系結(jié)構(gòu)。本文主要針對使用了ARM體系結(jié)構(gòu)的PLC進行研究。
PLC程序的一個掃描周期如圖2所示:讀取輸入、執(zhí)行控制邏輯代碼、更新輸出。PLC運行時,首先掃描輸入值并將其存儲到變量表中,然后執(zhí)行相應(yīng)的控制邏輯,更新輸出值。其中變量表是一個虛表,包含了控制邏輯所需要的所有變量:計數(shù)器、定時器、輸入和輸出等。PLC控制邏輯的兩種主要類型為基于字節(jié)碼的邏輯和基于二進制的邏輯。經(jīng)分析,控制流完整性對兩種邏輯均適用。
圖2 PLC程序掃描過程Figure 2. Scanning process of program of PLC
由圖2可以看出,PLC的程序掃描是一個不停循環(huán)的過程,在一個程序掃描周期中,任何I/O值的變化都會被忽略,直到下一個程序掃描周期中才會被更新。
根據(jù)PLC設(shè)備的特點、程序的執(zhí)行流程和控制邏輯,基于插樁技術(shù),設(shè)計針對PLC的控制流完整性機制??傮w設(shè)計思路如圖3所示。
圖3 總體設(shè)計思路Figure 3. General design idea
基于ARM體系結(jié)構(gòu)的應(yīng)用程序在執(zhí)行流程中有兩個位置可以被攻擊者利用:一是通過修改間接函數(shù)調(diào)用中的寄存器值來實現(xiàn)控制流劫持;二是在返回指令之前修改返回地址的值來實現(xiàn)控制流劫持。PLC的控制流完整性機制在實際的調(diào)用或返回之前檢查這兩個位置,如圖4所示。
圖4 控制流驗證示例Figure 4. Example of control-flow verification
控制流程圖由編譯器產(chǎn)生,覆蓋了PLC運行時控制邏輯的整個控制過程。每一個校驗指令中的ID都是唯一的,通過將ID添加到控制流程圖中,驗證機制使用ID來立即識別應(yīng)用程序執(zhí)行流在控制流程圖中的位置。
在ARM體系結(jié)構(gòu)中,通過發(fā)現(xiàn)BLX指令來識別間接函數(shù)調(diào)用。同時,尋找ARM指令集中所有的返回指令,例如 BX LR、POP R11等。在這些轉(zhuǎn)移指令之前插入校驗指令,利用控制流程圖檢查轉(zhuǎn)移指令的目標地址是否合法,以此確保PLC控制流的完整性。
同時,PLC具有硬實時性的特點,以一種可預(yù)測的方式執(zhí)行任務(wù),以此滿足對實時性的要求。在一些關(guān)鍵基礎(chǔ)設(shè)施中,不能因控制流完整性的驗證而導(dǎo)致PLC的可用性和實時性被破壞,例如污水處理系統(tǒng)中所使用的PLC設(shè)備必須能夠?qū)τ捎诮涤暌鸬乃蛔兓龀鰧崟r響應(yīng);發(fā)電廠中的PLC設(shè)備必須通過毫秒級的發(fā)電機斷路器對發(fā)電機做出實時反應(yīng)等。
由于PLC運行時的實時性限制,每個PLC程序掃描周期中處理器消耗的周期數(shù)都必須受限制且應(yīng)是可預(yù)測的。因此,本文重點考慮了PLC的可用性和實時性,借鑒循環(huán)緩沖區(qū)的方法[18],在控制流完整性機制的基礎(chǔ)上引入循環(huán)的影子堆棧,允許PLC根據(jù)實時性,限制控制流完整性機制的檢查時間。同時,將控制流完整性檢查機制的優(yōu)先級設(shè)置的較低,以此確保PLC的可用性和實時性。影子堆棧的引入則避免了嵌入式系統(tǒng)中的優(yōu)先級倒置問題。
PLC控制流完整性機制的總體架構(gòu)及控制流保護過程如圖5所示。
圖5 PLC控制流保護過程Figure 5. Control-flow protection of PLC
由圖5可以看出,循環(huán)緩沖區(qū)確保PLC的實時操作系統(tǒng)可以隨時停止控制流完整性校驗,以此保證了PLC的I/O操作具有足夠的資源。
在OpenPLC[19]上執(zhí)行控制流劫持實驗,以評估PLC控制流完整性機制的保護效果。使用ROPgadgets工具查看程序內(nèi)部是否有可以利用的代碼片段,并通過seed48(·)函數(shù)間接實現(xiàn)參數(shù)傳遞。經(jīng)過實驗驗證,控制流完整性機制能有效檢測出控制流違規(guī)并識別出轉(zhuǎn)移控制流的函數(shù)。經(jīng)過簡單的控制邏輯測試,PLC控制流完整機制的性能開銷如表2所示。
表2 性能開銷
由表2可以看出,本文提出的防御機制在平均情況下性能開銷約為3.6%,最差情況下性能開銷約為5.2%,保證了PLC的實時性。
工業(yè)控制控系統(tǒng)是專業(yè)性較強的系統(tǒng),PLC應(yīng)用的領(lǐng)域也比較固定,使用控制流完整性機制可以有效阻止由PLC安全漏洞所帶來的惡意攻擊問題。設(shè)計針對PLC的高效控制流完整性機制可大幅提升PLC的安全性,從而顯著提高工業(yè)控制系統(tǒng)的安全性。對PLC控制流完整性機制的下一步研究思路如下:進一步解決控制流完整性機制帶來的性能開銷問題;保證PLC在復(fù)雜控制邏輯下的實時性;找到合適的部署方式。
PLC設(shè)備的特點和控制邏輯帶來了不同的安全漏洞,對工業(yè)控制系統(tǒng)的安全性產(chǎn)生了嚴重威脅。本文分析了控制流完整性機制并將其引入到PLC設(shè)備中,提出了針對PLC的控制流完整性機制,以便有效地應(yīng)對PLC中存在的安全威脅,并以此提高工業(yè)控制系統(tǒng)的安全性。但是本研究仍具有一定的局限性,在今后的研究中需要對PLC的安全漏洞進一步挖掘,并對PLC的控制流完整性機制所帶來的性能開銷以及部署問題做進一步研究。