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