祁志榮 呂世民 鄭乾坤
1(中安聯(lián)合煤化有限責(zé)任公司電儀中心 安徽淮南 232092) 2(寧波和利時(shí)信息安全研究院有限公司工程服務(wù)部 浙江寧波 315048)
Modbus協(xié)議是工業(yè)控制系統(tǒng)最受歡迎的協(xié)議之一,但是隨著工業(yè)控制系統(tǒng)的發(fā)展,主站與從站的聯(lián)系已不能滿足與外界封閉的交流方式,因此,Modbus協(xié)議逐步與當(dāng)前主流協(xié)議TCP接軌,形成ModbusTCP協(xié)議,在保留工業(yè)控制系統(tǒng)特點(diǎn)的同時(shí),能夠獨(dú)立于計(jì)算機(jī)硬件與操作系統(tǒng),已成功應(yīng)用到當(dāng)前的ICS中,提升主站與從站設(shè)備的通信效率.然而,協(xié)議因?yàn)槔^承TCP協(xié)議固有的設(shè)計(jì)缺陷,使得ModbusTCP協(xié)議面臨諸多網(wǎng)絡(luò)攻擊的風(fēng)險(xiǎn),比如中間人攻擊,因此,ModbusTCP的安全性成為當(dāng)前工業(yè)控制系統(tǒng)主要提升的領(lǐng)域之一.
針對(duì)Modbus協(xié)議的研究,業(yè)界已有多種研究方案:Fovino等人[1]提出在Modbus協(xié)議中加入時(shí)間戳和哈希字段,并用私鑰加密,該方法能夠在一定程度上保證數(shù)據(jù)的完整性、可認(rèn)證性和防止重放攻擊;詹靜等人[2]提出一種基于遠(yuǎn)程認(rèn)證的可信Modbus協(xié)議,實(shí)現(xiàn)了通信雙方身份和狀態(tài)的雙向認(rèn)證,保證數(shù)據(jù)傳輸過(guò)程的完整性和安全性; 張波等人[3]提出一種橢圓曲線公鑰算法,實(shí)現(xiàn)身份認(rèn)證和完整性保護(hù),采用密鑰控制通信注冊(cè)機(jī)制與時(shí)間戳檢測(cè)機(jī)制組合防止重放攻擊;Aamir等人[4]提出設(shè)計(jì)加密緩沖器,添加特殊字段檢測(cè)安全發(fā)展和傳輸過(guò)程中的敏感信息,增強(qiáng)傳輸和加密安全性;Luo等人[5]提出Modbus增強(qiáng)協(xié)議,該協(xié)議能夠抵御重放攻擊和加密關(guān)鍵數(shù)據(jù)字段,并且確保通信雙方都可以被認(rèn)證,提升工業(yè)控制網(wǎng)絡(luò)的安全性.上述研究雖然彌補(bǔ)了ModbusTCP協(xié)議的一些缺陷,但均無(wú)法同時(shí)滿足安全性強(qiáng)和低開(kāi)銷的要求,因此,本文提出基于SM2與SM4加密算法,并經(jīng)過(guò)多組實(shí)驗(yàn)對(duì)比顯示,本文方案在安全性、計(jì)算開(kāi)銷和空間開(kāi)銷方面能夠得到一定提升.
Modbus協(xié)議是由MODICON公司于1979年開(kāi)發(fā)的一種工業(yè)現(xiàn)場(chǎng)總線協(xié)議標(biāo)準(zhǔn),之后,在1996年施耐德公司推出基于以太網(wǎng)TCP/IP的Modbus協(xié)議——ModbusTCP.該協(xié)議布置于應(yīng)用層, ModbusTCP數(shù)據(jù)幀可分為2部分,分別為報(bào)文頭(MBAP)+幀結(jié)構(gòu)(PDU).MBAP長(zhǎng)度為7B,由4個(gè)字段組成,第1個(gè)字段作為報(bào)文的序列號(hào),第2個(gè)字段表示ModbusTCP協(xié)議,第3個(gè)字段表示接下來(lái)的字段長(zhǎng)度,最后以1個(gè)字段表示設(shè)備地址;PDU由功能碼和數(shù)據(jù)組成,功能碼長(zhǎng)度為1B,數(shù)據(jù)長(zhǎng)度由具體功能決定,其報(bào)文根據(jù)對(duì)象不同設(shè)置8個(gè)功能碼.
ModbusTCP協(xié)議安全方案對(duì)原始ModbusTCP報(bào)文進(jìn)行了改造,在原始ModbusTCP報(bào)文中增加了Random字段和SIGN字段,使其成為ModbusTCP安全報(bào)文.
本文提出的ModbusTCP安全方案為實(shí)現(xiàn)在真實(shí)工業(yè)控制環(huán)境中的1主多從模式,在ModbusTCP主站中配置了1張含有所連接的ModbusTCP從站的地址、從站對(duì)應(yīng)的SM2公鑰和與從站配置的預(yù)共享密鑰的預(yù)置表.ModbusTCP從站中配置了1張含有主站IP地址、主站的SM2公鑰、主站配置的預(yù)共享密鑰和以功能碼作為訪問(wèn)控制內(nèi)容的預(yù)置表,其中,主站配置表中的初始SM2公鑰為空.除此之外,為了增加防重放攻擊的機(jī)制,在主站和從站中配有隨機(jī)數(shù)表,表中記錄了每條消息的隨機(jī)數(shù),為了防止內(nèi)存開(kāi)銷過(guò)大,該表每30s格式化1次.
本文方案分為注冊(cè)階段和數(shù)據(jù)安全傳輸階段.在注冊(cè)階段,ModbusTCP主站將自身SM2公鑰注冊(cè)到ModbusTCP客戶端中的預(yù)置表中,以便在數(shù)據(jù)安全傳輸階段通過(guò)該SM2公鑰進(jìn)行驗(yàn)簽操作,從而驗(yàn)證數(shù)據(jù)發(fā)送方的合法身份.在數(shù)據(jù)安全傳輸階段,本文方案通過(guò)預(yù)共享的SM4密鑰對(duì)傳輸?shù)年P(guān)鍵數(shù)據(jù)進(jìn)行加密,并對(duì)數(shù)據(jù)進(jìn)行哈希操作,防止攻擊者通過(guò)中間人攻擊惡意獲取數(shù)據(jù)或篡改數(shù)據(jù).通過(guò)在注冊(cè)階段接收的SM2公鑰對(duì)數(shù)據(jù)發(fā)送方的身份進(jìn)行認(rèn)證,防止攻擊者冒充合法身份連入到ModbusTCP網(wǎng)絡(luò)中.
2.2.1 注冊(cè)階段
在該階段ModbusTCP主站將自己的SM2公鑰傳遞給ModbusTCP主站,以便在數(shù)據(jù)安全傳輸階段驗(yàn)證ModbusTCP主站的身份.注冊(cè)階段如下:
1) ModbusTCP主站連接ModbusTCP從站,并通過(guò)從站地址在預(yù)配置表中獲取對(duì)應(yīng)的預(yù)共享密鑰Key,將Key和自身SM2公鑰PKc作為SM3算法的哈希輸入生成哈希值H1,并將PKc與H1發(fā)送至ModbusTCP從站.即
SendMsg=PKc+H(PKc‖Key).
2) ModbusTCP從站接收到消息后通過(guò)Modbus 主站的IP地址在預(yù)置表中獲取對(duì)應(yīng)的預(yù)共享密鑰Key,并通過(guò)接收到的SendMsg中的PKc和Key為輸入,通過(guò)SM3算法計(jì)算哈希值H2,若H2和H1相等,則證明ModbusTCP主站發(fā)來(lái)的SM2公鑰PKc沒(méi)有被非法篡改,此時(shí),ModbusTCP從站將PKc放入預(yù)置表對(duì)應(yīng)的位置.
2.2.2 數(shù)據(jù)安全傳輸階段
注冊(cè)階段結(jié)束后進(jìn)入數(shù)據(jù)安全傳輸階段.在該階段對(duì)ModbusTCP的關(guān)鍵數(shù)據(jù)進(jìn)行安全傳輸.因?yàn)闊o(wú)論是ModbusTCP主站還是ModbusTCP從站,都會(huì)接收消息和發(fā)送消息,所以在該階段以發(fā)送方和接收方作為主體進(jìn)行說(shuō)明.
1) 對(duì)于發(fā)送方,進(jìn)行如下操作:
① 發(fā)送方隨機(jī)生成1個(gè)16B的隨機(jī)數(shù)R,并放入ModbusTCP安全報(bào)文的Random字段中.
② 發(fā)送方通過(guò)接收方地址在預(yù)置表中獲取預(yù)共享密鑰Key,并運(yùn)用SM4算法對(duì)ModbusTCP報(bào)文中的功能碼、數(shù)據(jù)域和隨機(jī)數(shù)R進(jìn)行加密生成密文C1,即
C1=EKey(Function Code‖Data‖Random).
③ 發(fā)送方通過(guò)自身私鑰對(duì)密文C1進(jìn)行簽名S1,即
S1=SIGSK(C1),
并將簽名S1放入ModbusTCP安全報(bào)文的SIGN字段中,之后發(fā)送方將ModbusTCP安全報(bào)文發(fā)送至接收方.
2) 對(duì)于接收方進(jìn)行如下操作:
① 接收方接收到發(fā)送方發(fā)送的ModbusTCP安全報(bào)文后,通過(guò)地址在預(yù)置表中找到發(fā)送方對(duì)應(yīng)的預(yù)共享密鑰Key和公鑰PK.通過(guò)PK驗(yàn)證簽名S1,若簽名驗(yàn)證通過(guò),則在證明消息發(fā)送方合法身份的同時(shí),還驗(yàn)證了發(fā)送數(shù)據(jù)的完整性.若身份認(rèn)證通過(guò)則進(jìn)行下一步,若簽名驗(yàn)證不通過(guò),則丟棄此消息.
② 若發(fā)送方身份驗(yàn)證通過(guò),則通過(guò)預(yù)共享密鑰Key解密密文C1,獲得明文P1,即
P1=DKey(C1).
由于在上一步中已經(jīng)對(duì)發(fā)送方身份和數(shù)據(jù)完整性進(jìn)行了驗(yàn)證,則此時(shí):
P1=Function Code‖Data‖Random.
③ 將Random字段中的隨機(jī)數(shù)R與隨機(jī)數(shù)表中的數(shù)據(jù)作比較,若R在隨機(jī)數(shù)表中,則證明此消息為重放的消息并丟棄.若R不在隨機(jī)數(shù)表中,則將R放入隨機(jī)數(shù)表中,并通過(guò)功能碼和數(shù)據(jù)作出相應(yīng)的操作.
④ 若接收方為ModbusTCP從站,則將主站發(fā)送的功能碼與本地預(yù)置表中的允許訪問(wèn)的功能碼進(jìn)行比對(duì),若允許訪問(wèn)則進(jìn)行下一步,否則丟棄該報(bào)文.
1) 中間人攻擊.由于原始ModbusTCP協(xié)議在數(shù)據(jù)傳輸過(guò)程中數(shù)據(jù)以明文形式傳輸,因此攻擊者一般通過(guò)中間人攻擊獲取傳輸?shù)臄?shù)據(jù),導(dǎo)致數(shù)據(jù)的非法泄露和非法篡改.ModbusTCP安全方案通過(guò)SM4算法對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密,此時(shí)攻擊者通過(guò)中間人攻擊獲取到的為密文信息,由于SM4密鑰在編碼階段就預(yù)編碼到系統(tǒng)中,所以敵手無(wú)法獲取此SM4密鑰,從而無(wú)法破解密文.
2) 身份認(rèn)證.由于原始的ModbusTCP協(xié)議不具備身份認(rèn)證功能,即任何實(shí)體都可以充當(dāng)為合法的身份加入到ModbusTCP網(wǎng)絡(luò)中,接收方將所有接收到的消息都認(rèn)作合法消息,造成數(shù)據(jù)非法泄露和操作非法指令等.本文的ModbusTCP安全方案通過(guò)SM2算法用SM2私鑰對(duì)消息進(jìn)行簽名,接收方接收到消息后先通過(guò)SM2公鑰進(jìn)行驗(yàn)簽,由于私鑰只存在于合法身份中,所以若驗(yàn)簽通過(guò),證明該消息是合法身份則進(jìn)行簽名,之后才會(huì)進(jìn)行后續(xù)操作,否則丟棄該消息.由于攻擊者無(wú)法獲取合法身份的SM2私鑰,所以由攻擊者發(fā)出的消息也無(wú)法通過(guò)身份驗(yàn)證.
3) 數(shù)據(jù)完整性驗(yàn)證.數(shù)字簽名不僅可以保證消息發(fā)送方的身份,在驗(yàn)證過(guò)程中,SM2的輸入為簽名數(shù)據(jù)和簽名,若簽名數(shù)據(jù)被篡改,簽名也無(wú)法通過(guò)驗(yàn)證,因此SM2簽名驗(yàn)簽同樣有數(shù)據(jù)完整性驗(yàn)證的功能.
4) 防重放攻擊.原ModbusTCP協(xié)議中沒(méi)有防重發(fā)攻擊機(jī)制,這意味著攻擊者在捕獲到報(bào)文后可以多次發(fā)送相同的報(bào)文給接收方,此時(shí),接收方會(huì)多次重復(fù)地執(zhí)行相同的操作,導(dǎo)致資源的浪費(fèi).ModbusTCP安全報(bào)文中增加了隨機(jī)數(shù)字段,發(fā)送方每次發(fā)送消息前生成一串隨機(jī)數(shù)并將其放入隨機(jī)數(shù)字段,接收方每次接收到消息后將該隨機(jī)數(shù)與本地隨機(jī)數(shù)表進(jìn)行比對(duì),若存在相同的隨機(jī)數(shù),則證明該消息之前已經(jīng)收到過(guò),視為重放消息并丟棄,若沒(méi)有相同隨機(jī)數(shù),則將該消息視為非重放消息,并將該隨機(jī)數(shù)放入隨機(jī)數(shù)表中.
為了驗(yàn)證本文方案的有效性,本節(jié)通過(guò)Wireshark軟件捕獲改進(jìn)的ModbusTCP數(shù)據(jù)包,其中圖1(a)為發(fā)送方發(fā)送的ModbusTCP安全報(bào)文,圖1(b)為接收方返回的ModbusTCP安全報(bào)文:
圖1 ModbusTCP安全報(bào)文
通過(guò)圖2可知,截獲到的報(bào)文消息內(nèi)容為一串密文字符且功能碼未知,保證了ModbusTCP報(bào)文的安全性.這是因?yàn)楸疚乃岬腗odbusTCP安全方案將功能碼和數(shù)據(jù)明文數(shù)據(jù)加密成密文后再進(jìn)行傳輸,即使敵手通過(guò)中間人攻擊獲取到傳遞的消息,由于不知道會(huì)話密鑰,也無(wú)法解密并獲取到明文,不僅無(wú)法得知截獲消息的作用,而且無(wú)法得知截獲的消息主要內(nèi)容.
圖2 發(fā)送方和接收方計(jì)算開(kāi)銷
表1為不同方案的計(jì)算開(kāi)銷對(duì)比,其中H代表哈希算法,SM4代表1次SM4對(duì)稱加密算法,e代表1次指數(shù)運(yùn)算,dp代表1次點(diǎn)乘運(yùn)算.
表1 不同方案計(jì)算開(kāi)銷對(duì)比
如表1所示,文獻(xiàn)[4]采用1次公鑰加解密和公鑰簽名驗(yàn)簽操作,所以在文獻(xiàn)[4]中,發(fā)送方和接收方各用了2個(gè)計(jì)算開(kāi)銷較大的指數(shù)運(yùn)算.文獻(xiàn)[5]分別在身份認(rèn)證、密鑰協(xié)商和數(shù)據(jù)傳輸過(guò)程中運(yùn)用到1次數(shù)字簽名和驗(yàn)簽的操作,并且在密鑰協(xié)商過(guò)程中用公鑰加密算法加密協(xié)商的會(huì)話密鑰,所以文獻(xiàn)[5]中的發(fā)送方和接收方的計(jì)算開(kāi)銷中存在大量的點(diǎn)乘運(yùn)算.而本文方案只需要用1次簽名和驗(yàn)簽運(yùn)算就可以解決ModbusTCP協(xié)議的身份認(rèn)證問(wèn)題和數(shù)據(jù)的完整性問(wèn)題.所以發(fā)送方和接收方只用1次計(jì)算開(kāi)銷較大的指數(shù)運(yùn)算.通過(guò)實(shí)驗(yàn)結(jié)果對(duì)比,本文方案的計(jì)算開(kāi)銷優(yōu)于其他文獻(xiàn)方案.
此外,為了清楚地評(píng)估本文所提方案的計(jì)算開(kāi)銷,在實(shí)驗(yàn)階段分別統(tǒng)計(jì)了數(shù)據(jù)大小為50B,100B,150B,200B,250B時(shí)本文方案的計(jì)算開(kāi)銷.其中,圖2(a)為發(fā)送方不同數(shù)據(jù)大小的計(jì)算開(kāi)銷,圖2(b)為接收方不同數(shù)據(jù)大小的計(jì)算開(kāi)銷.如圖2所示,本文方案發(fā)送方整體計(jì)算開(kāi)銷在17ms左右,接收方整體計(jì)算開(kāi)銷在20ms左右.
目前工業(yè)控制系統(tǒng)協(xié)議大多應(yīng)用于輕量化的終端中,其計(jì)算能力和存儲(chǔ)能力都是有限的,所以一個(gè)工業(yè)控制協(xié)議的安全方案除了計(jì)算開(kāi)銷,其存儲(chǔ)開(kāi)銷的考量也是非常重要的.該階段主要統(tǒng)計(jì)了不同方案在系統(tǒng)初始化時(shí)花費(fèi)的存儲(chǔ)開(kāi)銷.表2為本文方案與其他方案在存儲(chǔ)方面的開(kāi)銷對(duì)比:
表2 不同方案存儲(chǔ)開(kāi)銷對(duì)比
本文針對(duì)傳統(tǒng)ModbusTCP協(xié)議缺乏身份驗(yàn)證、數(shù)據(jù)明文傳輸、重放攻擊威脅等問(wèn)題,提出一種ModbusTCP安全增強(qiáng)方案,在該方案中,通過(guò)SM2簽名算法實(shí)現(xiàn)的ModbusTCP主站與從站段之間的身份認(rèn)證和數(shù)據(jù)完整性檢測(cè),利用對(duì)稱加密算法SM4實(shí)現(xiàn)了ModbusTCP協(xié)議傳輸中的數(shù)據(jù)加密傳輸,通過(guò)隨機(jī)數(shù)的形式實(shí)現(xiàn)了ModbusTCP防重放的機(jī)制,實(shí)驗(yàn)結(jié)果表明本文方案在確保安全性的同時(shí),帶來(lái)的額外開(kāi)銷也是可接受的.