劉金永, 王 勇, 李雙飛, 朱毅文
(1.上海電力大學(xué), 上海 200090; 2.上海云劍信息技術(shù)有限公司, 上海 200433)
電力網(wǎng)的穩(wěn)定運行對國民經(jīng)濟和社會穩(wěn)定具有不可替代的作用,但是近年發(fā)生了許多電力系統(tǒng)被黑客攻擊的事件,如伊朗震網(wǎng)病毒事故,因此電力網(wǎng)的信息安全已經(jīng)上升到國家安全層面。監(jiān)控和數(shù)據(jù)采集(Supervisory Control and Data Acquisition,SCADA)系統(tǒng)作為智能配電網(wǎng)發(fā)展的重要組成部分,是提高供電可靠性、提升優(yōu)質(zhì)服務(wù)水平以及提高配電網(wǎng)精益化管理水平的重要手段,是配電網(wǎng)現(xiàn)代化、智能化發(fā)展的必然趨勢。可編程邏輯控制器(Programmable Logic Controller,PLC)是現(xiàn)代工業(yè)控制系統(tǒng)中的一個重要組成部分,特別是在SCADA系統(tǒng)中。干擾PLC的正常運行可能會導(dǎo)致嚴(yán)重的損害,威脅著人們的生命及財產(chǎn)安全,如烏克蘭大面積停電事故。
目前,隨著技術(shù)的變化,我國正在逐步走向工業(yè)互聯(lián)網(wǎng),人們開始將SCADA連接到互聯(lián)網(wǎng)上,PLC設(shè)備接入互聯(lián)網(wǎng)后將會面臨更大的安全性問題。PLC的安全性已經(jīng)引起廣泛關(guān)注,專家學(xué)者對PLC設(shè)備從硬件和軟件兩大方面進行了研究,其中包括PLC的邏輯漏洞、通信協(xié)議漏洞等。針對西門子PLC結(jié)構(gòu)以及通信協(xié)議分析,基于訪問控制問題的攻擊屢見不鮮[1]。針對訪問控制問題,有研究者利用此漏洞對PLC成功進行了DoS攻擊[2]。利用訪問控制問題,攻擊者可以以合法的方式,進行非法的操作。文獻[3]針對此問題提出了一種采用縱深防御措施來保護系統(tǒng),從而使系統(tǒng)有效防止誤操作或者攻擊。對于已知問題我們可以采取安全防護措施以彌補缺陷,防止被黑客利用,但是對于未知漏洞卻無能為力,因此有研究者對PLC設(shè)備進行漏洞掃描工作。張亞豐等人[4]提出了基于心跳的異常監(jiān)測與定位方法,對被測嵌入式設(shè)備進行異常行為監(jiān)測和異常用例定位。在漏洞掃描方面,國外的研究者也取得了重大突破。PALMATIER T E[5]提出了一種通用的PLC固件分析方法,并通過概念驗證實驗來證明合法固件是如何更新并上傳到PLC的。德蒙福特大學(xué)COFFEY K等人[6]研究了在各種不同網(wǎng)絡(luò)上檢測資產(chǎn)的不同方法,對在SCADA網(wǎng)絡(luò)上執(zhí)行掃描的可行性進行評估,并設(shè)計開發(fā)了網(wǎng)絡(luò)掃描儀,以滿足SCADA網(wǎng)絡(luò)的要求。許多學(xué)者對工控協(xié)議的模糊測試方法進行了大量的研究。黃河等人[7]則利用循環(huán)神經(jīng)網(wǎng)絡(luò)對Modbus TCP協(xié)議進行模糊測試,測試的效率更加高效。文獻[8]基于改進后的CSSR算法對協(xié)議進行結(jié)構(gòu)分析,并用心跳監(jiān)測和定位的異常監(jiān)控系統(tǒng)提高模糊測試的效率。賴英旭等人[9]采用可變字節(jié)值概率統(tǒng)計方法、長度域?qū)W習(xí)方法、Apriori和Needle-man/Wunsch算法學(xué)習(xí)私有協(xié)議特征,有效提高了私有協(xié)議的測試用例接收率。阮偉等人[10]提出私有協(xié)議的解析方法和入侵檢測方法,但并沒有提出模糊測試的針對性方法。
目前,研究者已對工控協(xié)議分析并借助深度學(xué)習(xí)設(shè)計模糊測試的方法,但是對私有協(xié)議針對性不強,因此本文提出針對私有協(xié)議的特性,設(shè)計模糊測試的方法,提高模糊測試漏洞檢測的效率。本文的工作主要是針對系統(tǒng)中核心的設(shè)備控制器進行漏洞掃描,控制器不僅僅局限于某種特定的型號,泛化性較強。
本文首先對西門子的通信協(xié)議進行分析,并針對存在的問題進行攻擊性測試驗證漏洞的真實存在性。
西門子私有通信協(xié)議自使用以來不斷地更新?lián)Q代,從最初的S7協(xié)議,到S7Comm再到現(xiàn)在有更多的安全措施的S7Comm plus協(xié)議,但協(xié)議的結(jié)構(gòu)仍然使用最初的S7協(xié)議結(jié)構(gòu)。
S7通信協(xié)議是建立在TCP/IP提供的網(wǎng)絡(luò)傳輸功能之上,處于OSI參考模型第7層的會話層、表示層和應(yīng)用層。其中TPKT協(xié)議處于會話層,是一個傳輸服務(wù)協(xié)議,主要用來在COTP和TCP之間建立橋梁。COTP協(xié)議處于表示層,定義了數(shù)據(jù)傳輸?shù)幕締挝?。?yīng)用層則是用S7協(xié)議來傳輸PLC的數(shù)據(jù)。
私有協(xié)議不公開協(xié)議規(guī)約,構(gòu)建Fuzzing的測試用例比較困難,可能存在安全漏洞。S7協(xié)議同樣存在身份認(rèn)證缺陷,沒有進行相應(yīng)的身份認(rèn)證機制。我們可以構(gòu)造數(shù)據(jù)包對其進行操作,并且如果設(shè)備固件版本較低,通過構(gòu)造的數(shù)據(jù)包可以讓設(shè)備停止工作。S7協(xié)議雖然是私有協(xié)議,但是已有研究者對其進行了協(xié)議解析,目前也有相關(guān)的Wireshark協(xié)議解析插件,可以對S7協(xié)議進行解析。雖然部分內(nèi)容仍然沒有得到解析,但是對于其主要的功能碼、數(shù)據(jù)類型等重要信息都可以正確解析。因此,S7協(xié)議存在的問題也會慢慢地暴露出來,對于存在的未知漏洞應(yīng)及時發(fā)掘并進行修復(fù)。
根據(jù)私有協(xié)議的特點和掃描方法的效率,PLC漏洞掃描需要實現(xiàn)的功能應(yīng)包括以下幾個方面:獲取PLC網(wǎng)絡(luò)地址、硬件型號、軟件版本號等信息;對PLC安全漏洞進行檢測并輸出漏洞相關(guān)信息;由于需要應(yīng)用于工業(yè)安全裝置,所以系統(tǒng)應(yīng)盡可能輕量且方便配置。
PLC漏洞檢測系統(tǒng)設(shè)計采用以下3大模塊:PLC信息掃描,獲取設(shè)備版本信息;CVE漏洞庫匹配,根據(jù)掃描結(jié)果輸出漏洞信息;Fuzzing漏洞檢測,對潛在漏洞進行掃描并輸出結(jié)果。
出于輕量化考慮,本文系統(tǒng)在Linux平臺設(shè)計實現(xiàn),漏洞信息庫存儲于SQLite數(shù)據(jù)庫,采用模塊化設(shè)計,易于擴展。
在運行系統(tǒng)時,PLC信息掃描模塊首先會通過Nmap調(diào)用工業(yè)系統(tǒng)設(shè)備信息掃描腳本對PLC信息進行掃描,識別設(shè)備版本信息,進而在CVE漏洞信息庫模塊檢索SQLite vul數(shù)據(jù)庫中的相關(guān)漏洞信息并輸出到運行界面,最后執(zhí)行Fuzzing漏洞檢測模塊,調(diào)用ISF工控協(xié)議組件和Kitty Fuzzing框架實現(xiàn)對未知漏洞檢測。
主機和PLC設(shè)備使用S7進行通信時,不同PLC的CPU機架號、插槽號和功能碼及值類型長度等通信數(shù)據(jù)包都將會發(fā)生改變,因此在設(shè)備已有的漏洞掃描模塊和未知漏洞檢測的模糊測試模塊都需要得到準(zhǔn)確的設(shè)備信息。信息掃描模塊得到的信息準(zhǔn)確性對后面工作的效率有著至關(guān)重要的作用。
針對PLC的掃描模塊開源資料包很多,根據(jù)掃描模塊的特點和掃描效率,本文借助Python調(diào)用Nmap,Nmap根據(jù)指定IP地址、端口號調(diào)用所創(chuàng)建的工業(yè)系統(tǒng)掃描NSE腳本,進行SYN或UDP掃描,獲取設(shè)備基本硬件和版本號信息。其中,NSE腳本針對 SIMATIC S7工控系統(tǒng)設(shè)備,通過構(gòu)造S7協(xié)議數(shù)據(jù)包,與設(shè)備建立通信。該腳本使用set_nmap()函數(shù)將主機端口信息傳入Nmap,在與PLC設(shè)備建立通信連接后,分別發(fā)送兩次SZL請求數(shù)據(jù)包,依次解析包含基本硬件信息和系統(tǒng)名、模塊類型、序列號、設(shè)備標(biāo)識、版權(quán)額外信息的響應(yīng)。PLC信息掃描模塊執(zhí)行流程如圖1所示。
圖1 PLC信息掃描模塊執(zhí)行流程
PLC信息掃描算法描述如下。
輸入:IP和端口號。
輸出:PLC版本型號信息。
步驟:
1.初始化環(huán)境變量;
2.WHILE 掃描目標(biāo)列表!= NULL;
主機發(fā)現(xiàn);
端口掃描;
服務(wù)于版本偵測;
腳本掃描;
掃描指向列表下一個目標(biāo);
WEND
3.輸出掃描結(jié)果。
工業(yè)互聯(lián)大背景下,根據(jù)工業(yè)互聯(lián)網(wǎng)安全應(yīng)急響應(yīng)中心(ICS-CERT)數(shù)據(jù)顯示,我國電力系統(tǒng)網(wǎng)絡(luò)安全存在很多問題,部分設(shè)備存在嚴(yán)重安全漏洞,可能的風(fēng)險包括拒絕服務(wù)攻擊、遠(yuǎn)程命令執(zhí)行以及信息泄露。因此,根據(jù)上一步掃描得到的信息,匹配響應(yīng)漏洞信息并輸出到主界面,得到設(shè)備已經(jīng)存在的漏洞。這對于系統(tǒng)安全性同樣有很大的意義。此外,還可以根據(jù)模糊測試挖掘的漏洞信息,匹配數(shù)據(jù)庫信息輸出漏洞的威脅等級,訪問向量等信息。
基于CVE工控系統(tǒng)行業(yè)漏洞庫,選擇部分漏洞信息使用SQLite建立本文所需要調(diào)用的漏洞信息庫,主要由漏洞列表和漏洞詳情表組成。本文用于調(diào)用工控設(shè)備的漏洞信息如表1所示。
表1 漏洞信息
模糊測試是一種介于完全手工滲透測試與完全自動化測試之間的安全性測試類型。能夠在一項產(chǎn)品投入市場使用之前對潛在的安全性問題進行提示。隨著模糊測試的廣泛使用,有關(guān)模糊測試的工具也越來越多。主要的工業(yè)控制系統(tǒng)模糊測試工具有Sulley,Peach,Kitty等,各種模糊測試工具都有各自的特點和適用的場景。Sulley模糊測試是一種基于Python的Fuzzing框架,主要應(yīng)用于網(wǎng)絡(luò)協(xié)議方面的測試。Peach 3是一種面向Data Cosumer的跨平臺模糊測試,對UEFI network test來說更為有效。
本文中使用Kitty Fuzzing框架運行于非TCP/IP通道上的私有和內(nèi)部協(xié)議,是一個通用、抽象的框架,應(yīng)該包含所有我們能想到的模糊測試過程中用到的所有通用功能,并且能方便用戶擴展,以便用來攻擊特定目標(biāo)。
2.3.1 測試策略設(shè)計
S7協(xié)議通信中啟動、停止、下載程序、上載程序和讀/寫數(shù)據(jù)等關(guān)鍵事件,在每一項關(guān)鍵事件中的通信報文中大體相同,但又有所區(qū)別,因此針對S7協(xié)議設(shè)計針對協(xié)議字段類型的測試策略。對每個字段類型進行測試,例如針對啟動關(guān)鍵事件中的功能碼0x28進行測試,此字段占兩個字節(jié),針對這兩個字節(jié)進行變異測試,其他字節(jié)按照合法數(shù)據(jù)進行測試。
關(guān)鍵事件的通信報文中,字段之間、報文之間都有關(guān)聯(lián),因此本文設(shè)計了多字段關(guān)聯(lián)測試策略。同樣以停止事件為例,通信報文中的功能碼為0x28,但是功能碼為0x28的事件不一定是停止事件,也有可能是其他關(guān)鍵事件,評斷是哪個事件還要看通信報文PI的內(nèi)容,因此字段關(guān)聯(lián)校驗也非常關(guān)鍵。例外在通信報文中,參數(shù)字段的項目數(shù)和數(shù)據(jù)字段中的項目數(shù)是保持一致的,當(dāng)兩者不一致時,則為畸形報文。如果設(shè)備沒有對相應(yīng)畸形報文的處理機制,設(shè)備接受到畸形報文時就會出現(xiàn)故障。
2.3.2 數(shù)據(jù)變異算法設(shè)計
Kitty實現(xiàn)了Fuzzer主循環(huán),并為每個用于創(chuàng)建完整模糊測試會話的元素的數(shù)據(jù)和基類建模提供了語法。但是,Kitty無法完成類的特定實現(xiàn)。Kitty定義了與目標(biāo)執(zhí)行數(shù)據(jù)事務(wù)的接口和基類,主要有數(shù)據(jù)模型、目標(biāo)、控制器、監(jiān)控、模糊器和接口組成。數(shù)據(jù)模型定義了由模糊器發(fā)送的消息結(jié)構(gòu),包括將消息分離為字段(例如S7協(xié)議的標(biāo)頭、長度和有效負(fù)載)、這些字段的類型(例如S7協(xié)議的字符串,校驗和和反重放算法計算規(guī)則)以及它們之間的關(guān)系(例如S7協(xié)議的屬性塊中的長度,開頭標(biāo)識符,校驗和和計數(shù))。數(shù)據(jù)模型還描述了將不同消息鏈接在一起以形成模糊測試會話的順序。這在嘗試模糊系統(tǒng)的更深層部分時非常有用,例如利用S7協(xié)議和設(shè)備實行3次連接以模糊系統(tǒng)中只有經(jīng)過身份驗證的用戶才能訪問的部分。數(shù)據(jù)模型還可以指定發(fā)送消息的順序是模糊的。
數(shù)據(jù)模型算法用來構(gòu)造模糊測試數(shù)據(jù),由3部分組成。首先列出S7Comm協(xié)議可用字段,這些字段組成了Kitty的基本語法。之后,使用可用的編碼器進行編碼。最后提供了有關(guān)如何使用前兩部分中列出的字段、容器和編碼器組成完整模板的示例。數(shù)據(jù)模型算法中有S7協(xié)議基本塊、屬性塊字段的計算、變異字段的生成等。
其中基本塊字段是數(shù)據(jù)模型的基本構(gòu)建塊。每個字段都是獨立和離散的。屬性塊字段的計算是默認(rèn)情況下從默認(rèn)值范圍之外的屬性計算其值的字段,例如,其他字段的長度或校驗和等。這些字段也可以模糊,但是當(dāng)它們沒有模糊時,將計算其字段值,以確保其呈現(xiàn)為有效值。
數(shù)據(jù)模型算法中變異字段生成最為關(guān)鍵,直接關(guān)系到模糊測試的效率。變異模糊化的策略是采取一些有效的信息并以各種方式對其進行變異。
變異生成字段程序算法描述如下。
輸入:有效字段。
輸出:變異字段。
步驟:
1.定義字段執(zhí)行N個連續(xù)位的位翻轉(zhuǎn)突變類;
2.定義從默認(rèn)值復(fù)制一個字節(jié)塊,每個突變向前移動一個字節(jié)類;
3.定義使用多個重復(fù)執(zhí)行塊復(fù)制;
4.定義用于執(zhí)行塊級突變的基類;
5.定義從默認(rèn)值中刪除一個字節(jié)塊,每個突變向前移動一個字節(jié)類;
6.定義將一個字節(jié)塊從默認(rèn)值設(shè)置為特定值,每個突變向前移動一個字節(jié)類;
7.定義翻轉(zhuǎn)消息中連續(xù)字節(jié)的數(shù)量,每個突變向前移動一個字節(jié)類;
8.根據(jù)輸入字段格式調(diào)用所定義的類進行變異;
9.將變異的字段存儲到容器中。
2.2.3 Fuzzing漏洞檢測模塊執(zhí)行流程及算法描述
使用Kitty Fuzzing框架結(jié)合ISF中的工控協(xié)議組件對西門子S7Comm協(xié)議執(zhí)行Fuzzing測試協(xié)議進行Fuzzing漏洞檢測。模塊執(zhí)行流程如圖2所示。
Fuzzing漏洞檢測算法描述如下。
輸入:IP和端口號。
輸出:Fuzzing漏洞檢測結(jié)果。
步驟:
1.初始化環(huán)境變量;
2.有變異字段生成測試用例;
3.向目標(biāo)發(fā)送測試數(shù)據(jù)包;
4.接收目標(biāo)返回響應(yīng);
5.輸出測試日志。
圖2 Fuzzing漏洞檢測模塊執(zhí)行流程
實驗采用2臺西門子PLC(型號SiemensS7-1200)作為通信的主站和從站。另外使用2臺電腦作為通信控制端(系統(tǒng)采用Windows 7 x64)和漏洞檢測端系統(tǒng)采用(Windows 10 x64)。其具體的通信網(wǎng)絡(luò)拓?fù)鋱D如圖3所示。
圖3 PLC通信網(wǎng)絡(luò)拓?fù)?/p>
選擇IP地址為192.168.0.200的PLC,型號為Siemens S7-1200,執(zhí)行嗅探模塊,系統(tǒng)輸出了目標(biāo)設(shè)備類型、型號、硬件版本號等信息。掃描設(shè)備信息如表2所示。
表2 掃描設(shè)備信息
系統(tǒng)將目標(biāo)PLC版本信息與修改后的CVE漏洞庫進行匹配,輸出相關(guān)漏洞信息,包括CVE ID、威脅等級、威脅利用難易性、機密性、完整性、可用性影響、詳細(xì)描述和參考鏈接等。
掃描出的已知漏洞結(jié)果有3個,根據(jù)掃描結(jié)果和漏洞庫信息進行匹配,并輸出結(jié)果。掃描已知漏洞具體信息如表3所示。
表3 掃描已知漏洞具體信息
在CVE漏洞掃描完成后,系統(tǒng)調(diào)用Fuzzing模塊對PLC進行未知漏洞檢測。首先根據(jù)模糊測試中的數(shù)據(jù)模型中的有效數(shù)據(jù)和設(shè)備建立連接,隨后給設(shè)備發(fā)送測試用例,同時有監(jiān)視器對設(shè)備的異常狀態(tài)進行監(jiān)視,一旦設(shè)備出現(xiàn)異常狀態(tài),記錄此次過程,并輸出測試結(jié)果。終端與Web所顯示檢測結(jié)果分別如圖4所示。經(jīng)過多次實驗驗證,未能掃描出未知漏洞。
圖4 未知漏洞掃描
3.5.1 漏洞掃描結(jié)果
本文使用基于OpenVAS的虛擬機系統(tǒng)Greenbone Security Manager(GSM)對目標(biāo)PLC進行漏洞掃描,為PLC漏洞檢測系統(tǒng)掃描結(jié)果提供參照比對,驗證系統(tǒng)有效性。測試過程如下:首先,運行GSM系統(tǒng),查看Web Interface配置信息并打開相應(yīng)Web接口界面;然后,登錄到控制臺,創(chuàng)建高級掃描任務(wù);最后,完成對目標(biāo)PLC掃描。深度掃描歷時約10 min,結(jié)果顯示目標(biāo)PLC存在一個ICMP Flood漏洞,可能導(dǎo)致主機宕機,并給出了解決方案、漏洞檢測方法和參考鏈接等信息。掃描詳情如圖5所示。
圖5 OpenVAS漏洞掃描詳情
漏洞信息為p-smash DOS(ICMP 9 flood)漏洞,攻擊者可以利用這個漏洞讓主機設(shè)備持續(xù)崩潰,一旦攻擊者攻擊成功,正在工作的PLC工作異常會給電網(wǎng)造成不可估計的損害。
3.5.2 漏洞檢測對比
本文系統(tǒng)共檢測到3個數(shù)據(jù)處理或輸入驗證方面的安全漏洞,而OpenVAS檢測發(fā)現(xiàn)設(shè)備可能會因ICMP洪泛攻擊崩潰。在漏洞數(shù)據(jù)庫的選擇上,本文系統(tǒng)使用CVE漏洞庫,OpenVAS使用NVT。綜合測試結(jié)果比較如表4所示。
表4 漏洞檢測率比較
由表4可知,在漏洞檢測率方面,本文所提方法能夠更加有效地檢測到PLC的已知與未知漏洞,但是相比于OpenVAS缺少精確的漏洞驗證機制,需要進一步的人工分析,漏洞數(shù)據(jù)庫也需要進行手動更新。
在漏洞信息完整性方面,本文所提方法與OpenVAS均提供了完整的漏洞信息,包括漏洞詳情、威脅等級、修復(fù)建議等。此外,本系統(tǒng)還給出漏洞威脅利用難易度、機密性影響、完整性影響、可用性影響等額外信息,相比于OpenVAS更具有參考價值。
在安裝、配置、使用過程中,本文所提方法均有優(yōu)勢,操作簡便,架構(gòu)與交互界面設(shè)計復(fù)雜度遠(yuǎn)低于OpenVAS。在擴展性和可移植性方面,由于二者都采用模塊化設(shè)計,且不同模塊間預(yù)留了必要接口,能夠方便地實現(xiàn)擴展功能。此外,依托Python語言的跨平臺特性,二者通過調(diào)用必要的Python開發(fā)庫很好地實現(xiàn)了多平臺支持,為漏洞檢測提供了極大便利。
本文通過對PLC、工業(yè)網(wǎng)絡(luò)協(xié)議以及漏洞檢測等相關(guān)技術(shù)的研究,借助SQLite數(shù)據(jù)庫、Kitty與ISF框架,實現(xiàn)了對PLC存在的CVE和未知漏洞檢測。測試結(jié)果驗證了該方法的可用性,且相較于通用漏洞掃描工具能夠以較快速度給出掃描結(jié)果,但同時也反映出其PLC潛在漏洞檢測方面存在的局限性,主要體現(xiàn)在對最新版本S7Comm plus私有協(xié)議進行Fuzzing時未挖出未知漏洞,對PLC的版本與漏洞信息尚未能精準(zhǔn)識別。因此,下一步的工作主要是改進完善模糊測試的方法,使其PLC版本固件掃描更加精確和未知漏洞檢測效率更高。