金先濤,李丹,鐘晶,譚淑慧
(工業(yè)和信息化部電子第五研究所,廣東 廣州 511370)
可編程邏輯控制器(PLC:Programing Logic Controller)是一種很常見的工業(yè)控制系統(tǒng)(ICS:Industrial Control System)設(shè)備,用于接收和處理輸入設(shè)備的數(shù)據(jù),以及對輸出設(shè)備進(jìn)行控制。用戶通過通用操作系統(tǒng)(如Windows、Linux等),使用編輯器編寫梯形圖程序、ST程序等,然后將程序通過通訊接口、Web接口或移動存儲設(shè)備裝載到PLC設(shè)備內(nèi)部運(yùn)行。由于PLC和編輯器平臺分離,若將不可信的PLC程序裝載進(jìn)PLC運(yùn)行,必然引發(fā)不可預(yù)知的后果。密碼技術(shù)是保障網(wǎng)絡(luò)安全的核心技術(shù),是構(gòu)建網(wǎng)絡(luò)信任的基石。利用密碼在安全認(rèn)證、加密保護(hù)和信任傳遞等方面的作用,能夠確保PLC裝載的是可信任的固件,避免發(fā)生安全問題。
商用密碼,是指采用特定變換的方法對不屬于國家秘密的信息等進(jìn)行加密保護(hù)、安全認(rèn)證的技術(shù)、產(chǎn)品和服務(wù)。商用密碼技術(shù)是商用密碼的核心,國家將商用密碼技術(shù)列入國家秘密,任何單位和個人都有責(zé)任和義務(wù)保護(hù)商用密碼技術(shù)的秘密。商用密碼的應(yīng)用領(lǐng)域十分廣泛,主要用于對不涉及國家秘密內(nèi)容但又具有敏感性的內(nèi)部信息、行政事務(wù)信息和經(jīng)濟(jì)信息等進(jìn)行加密保護(hù)。比如:各種安全認(rèn)證、網(wǎng)上銀行和數(shù)字簽名等。但在PLC固件完整性保護(hù)方面,其研究和實踐并不多見。
為了保障商用密碼安全,國家密碼管理局制定了一系列的密碼標(biāo)準(zhǔn),包括SSF33、SM1(SCB2)、SM2、SM3、SM4、SM7、SM9和祖沖之密碼算法等等。其中,SSF33、SM1、SM4、SM7和祖沖之密碼是對稱算法;SM2、SM9是非對稱算法;SM3是哈希算法。
目前已經(jīng)公布了算法文本的包括SM2橢圓曲線公鑰密碼算法、SM3密碼雜湊算法、SM4分組密碼算法和SM9標(biāo)識密碼算法等。
本文選取的PLC對象為OpenPLC,OpenPLC作為第一個全功能標(biāo)準(zhǔn)化的開源PLC,其作用是為自動化研究提供低成本的工業(yè)解決方案[3]。OpenPLC項目是根據(jù)IEC-61131-3標(biāo)準(zhǔn)創(chuàng)建的,該標(biāo)準(zhǔn)支持5種編程語言。
OpenPLC項目包括3個部分:運(yùn)行系統(tǒng)(Run time)、編輯器(Editor)和HMIBuilder(ScadaBR)。運(yùn)行系統(tǒng)應(yīng)安裝在設(shè)備上,并負(fù)責(zé)執(zhí)行PLC程序。編輯器是在計算機(jī)上運(yùn)行的軟件,用于創(chuàng)建PLC程序。最后,ScadaBR是HMI Builder。使用ScadaBR可以創(chuàng)建漂亮的基于Web的動畫,以反映對象的過程狀態(tài)。ScadaBR通過Modbus/TCP與OpenPLC Runtime通信[4]。
2.1.1 編輯器運(yùn)行過程
PLC程序的創(chuàng)建和編譯過程如圖1所示。在將st文件翻譯為C語言文件的過程中,使用到了MATIEC開源軟件,這是一款開源的IEC 61131-3編譯器,能夠?qū)t文本翻譯為C程序文件[1-2],最后通過平臺編譯器生成共享庫。
圖1 Editor編輯器運(yùn)行過程
2.1.2 Runtime運(yùn)行過程
Openplc Runtime對外提供的管理交互接口是http,基于flask框架開發(fā)。
在Web界面中,用戶可以上傳PLC程序、配置擴(kuò)展從設(shè)備(如modbus、dnp3協(xié)議設(shè)備)、監(jiān)控PLC運(yùn)行狀態(tài)等。由于用戶上傳的是st文件,Runtime需要編譯鏈接為可執(zhí)行文件openplc.elf,并保存在core/目錄下,這點與Editor仿真時的編譯目標(biāo)不同,如圖2所示。
圖2 Runtime運(yùn)行過程
OpenPLC固件的生命周期為:梯形圖程序->ST程序->C語言程序->目標(biāo)二進(jìn)制代碼(固件)->向PLC刷入固件。 根據(jù)OpenPLC固件的生命周期,選取目標(biāo)二進(jìn)制代碼(固件)為完整性計算起點,通過國密算法,對固件做hash計算和SM2私鑰簽名;在OpenPLC端,對帶簽名的PLC程序進(jìn)行驗簽,驗簽通過則存入數(shù)據(jù)庫,否則拒絕該P(yáng)LC程序的上傳[5]。如圖3所示。
圖3 Runtime運(yùn)行過程
為了驗證固件的完整性,選取GMSSL國密算法庫作為簽名和驗簽工具。GmSSL是一個開源的密碼工具箱,支持SM2/SM3/SM4/SM9/ZUC等國密(國家商用密碼)算法、SM2國密數(shù)字證書及基于SM2證書的SSL/TLS安全通信協(xié)議,支持國密硬件密碼設(shè)備,提供符合國密規(guī)范的編程接口與命令行工具,可以用于構(gòu)建PKI/CA、安全通信和數(shù)據(jù)加密等符合國密標(biāo)準(zhǔn)的安全應(yīng)用。
在本次驗證中,首先使用GMSSL庫生成SM2公私鑰對,其中私鑰命名為skey.pem,公鑰命名為vkey.pem。在Editor編輯器中,利用私鑰對st文件簽名,合成簽名文件signed_file.st;Runtime運(yùn)行系統(tǒng)通過http接口收到signed_file.st后,首先調(diào)用公鑰vkey.pem對簽名文件進(jìn)行驗簽,驗簽通過才將st文件保存,否則報錯返回。
signed_file.st文件里不僅包含原st內(nèi)容,還包含簽名數(shù)據(jù),為了保證驗簽準(zhǔn)確性,為signed_file.st文件設(shè)計了文件格式,如圖4所示。
圖4 簽名文件格式
3.2.1 驗證系統(tǒng)的網(wǎng)絡(luò)架構(gòu)
OpenPLC通過Modbus/TCP協(xié)議接口,擴(kuò)展遠(yuǎn)程IO從站,其網(wǎng)絡(luò)架構(gòu)如圖5所示。
圖5 OpenPLC網(wǎng)絡(luò)架構(gòu)
針對該網(wǎng)絡(luò)架構(gòu),通過編輯器,編寫了梯形圖程序,用于控制線圈Q100.0,同時帶有自鎖功能,如圖6所示。
圖6 梯形圖程序
按鈕I100.0為啟動開關(guān),按鈕I100.1為停止開關(guān)。IQ100地址映射到Modbus/TCP從站,如圖7所示。
圖7 Modbus從站設(shè)備配置
3.2.2 驗證過程
通過Editor,對以上程序進(jìn)行編譯,生成帶簽名的st文件;在OpenPLC runtime端,通過http接口接收st文件,并對st文件進(jìn)行驗簽,只有驗簽通過,才能保存st文件,并編譯為可執(zhí)行代碼,如圖8所示。
圖8 驗簽成功與編譯過程
加載非法簽名的st文件時,將被OpenPLCruntime拒絕提交。
圖9 驗簽失敗
本文通過對OpenPLC的源碼分析,選取了合適的簽名與驗簽的時機(jī),并應(yīng)用GMSSL國密算法庫,對PLC的固件進(jìn)行了簽名和驗簽,保證了PLC固件的完整性。經(jīng)過實際測試,驗證了國密算法在PLC固件完整性應(yīng)用上的可行性。