祁志荣 吕世民 郑乾坤
1(中安联合煤化有限责任公司电仪中心 安徽淮南 232092) 2(宁波和利时信息安全研究院有限公司工程服务部 浙江宁波 315048)
Modbus协议是工业控制系统最受欢迎的协议之一,但是随着工业控制系统的发展,主站与从站的联系已不能满足与外界封闭的交流方式,因此,Modbus协议逐步与当前主流协议TCP接轨,形成ModbusTCP协议,在保留工业控制系统特点的同时,能够独立于计算机硬件与操作系统,已成功应用到当前的ICS中,提升主站与从站设备的通信效率.然而,协议因为继承TCP协议固有的设计缺陷,使得ModbusTCP协议面临诸多网络攻击的风险,比如中间人攻击,因此,ModbusTCP的安全性成为当前工业控制系统主要提升的领域之一.
针对Modbus协议的研究,业界已有多种研究方案:Fovino等人[1]提出在Modbus协议中加入时间戳和哈希字段,并用私钥加密,该方法能够在一定程度上保证数据的完整性、可认证性和防止重放攻击;詹静等人[2]提出一种基于远程认证的可信Modbus协议,实现了通信双方身份和状态的双向认证,保证数据传输过程的完整性和安全性; 张波等人[3]提出一种椭圆曲线公钥算法,实现身份认证和完整性保护,采用密钥控制通信注册机制与时间戳检测机制组合防止重放攻击;Aamir等人[4]提出设计加密缓冲器,添加特殊字段检测安全发展和传输过程中的敏感信息,增强传输和加密安全性;Luo等人[5]提出Modbus增强协议,该协议能够抵御重放攻击和加密关键数据字段,并且确保通信双方都可以被认证,提升工业控制网络的安全性.上述研究虽然弥补了ModbusTCP协议的一些缺陷,但均无法同时满足安全性强和低开销的要求,因此,本文提出基于SM2与SM4加密算法,并经过多组实验对比显示,本文方案在安全性、计算开销和空间开销方面能够得到一定提升.
Modbus协议是由MODICON公司于1979年开发的一种工业现场总线协议标准,之后,在1996年施耐德公司推出基于以太网TCP/IP的Modbus协议——ModbusTCP.该协议布置于应用层, ModbusTCP数据帧可分为2部分,分别为报文头(MBAP)+帧结构(PDU).MBAP长度为7B,由4个字段组成,第1个字段作为报文的序列号,第2个字段表示ModbusTCP协议,第3个字段表示接下来的字段长度,最后以1个字段表示设备地址;PDU由功能码和数据组成,功能码长度为1B,数据长度由具体功能决定,其报文根据对象不同设置8个功能码.
ModbusTCP协议安全方案对原始ModbusTCP报文进行了改造,在原始ModbusTCP报文中增加了Random字段和SIGN字段,使其成为ModbusTCP安全报文.
本文提出的ModbusTCP安全方案为实现在真实工业控制环境中的1主多从模式,在ModbusTCP主站中配置了1张含有所连接的ModbusTCP从站的地址、从站对应的SM2公钥和与从站配置的预共享密钥的预置表.ModbusTCP从站中配置了1张含有主站IP地址、主站的SM2公钥、主站配置的预共享密钥和以功能码作为访问控制内容的预置表,其中,主站配置表中的初始SM2公钥为空.除此之外,为了增加防重放攻击的机制,在主站和从站中配有随机数表,表中记录了每条消息的随机数,为了防止内存开销过大,该表每30s格式化1次.
本文方案分为注册阶段和数据安全传输阶段.在注册阶段,ModbusTCP主站将自身SM2公钥注册到ModbusTCP客户端中的预置表中,以便在数据安全传输阶段通过该SM2公钥进行验签操作,从而验证数据发送方的合法身份.在数据安全传输阶段,本文方案通过预共享的SM4密钥对传输的关键数据进行加密,并对数据进行哈希操作,防止攻击者通过中间人攻击恶意获取数据或篡改数据.通过在注册阶段接收的SM2公钥对数据发送方的身份进行认证,防止攻击者冒充合法身份连入到ModbusTCP网络中.
2.2.1 注册阶段
在该阶段ModbusTCP主站将自己的SM2公钥传递给ModbusTCP主站,以便在数据安全传输阶段验证ModbusTCP主站的身份.注册阶段如下:
1) ModbusTCP主站连接ModbusTCP从站,并通过从站地址在预配置表中获取对应的预共享密钥Key,将Key和自身SM2公钥PKc作为SM3算法的哈希输入生成哈希值H1,并将PKc与H1发送至ModbusTCP从站.即
SendMsg=PKc+H(PKc‖Key).
2) ModbusTCP从站接收到消息后通过Modbus 主站的IP地址在预置表中获取对应的预共享密钥Key,并通过接收到的SendMsg中的PKc和Key为输入,通过SM3算法计算哈希值H2,若H2和H1相等,则证明ModbusTCP主站发来的SM2公钥PKc没有被非法篡改,此时,ModbusTCP从站将PKc放入预置表对应的位置.
2.2.2 数据安全传输阶段
注册阶段结束后进入数据安全传输阶段.在该阶段对ModbusTCP的关键数据进行安全传输.因为无论是ModbusTCP主站还是ModbusTCP从站,都会接收消息和发送消息,所以在该阶段以发送方和接收方作为主体进行说明.
1) 对于发送方,进行如下操作:
① 发送方随机生成1个16B的随机数R,并放入ModbusTCP安全报文的Random字段中.
② 发送方通过接收方地址在预置表中获取预共享密钥Key,并运用SM4算法对ModbusTCP报文中的功能码、数据域和随机数R进行加密生成密文C1,即
C1=EKey(Function Code‖Data‖Random).
③ 发送方通过自身私钥对密文C1进行签名S1,即
S1=SIGSK(C1),
并将签名S1放入ModbusTCP安全报文的SIGN字段中,之后发送方将ModbusTCP安全报文发送至接收方.
2) 对于接收方进行如下操作:
① 接收方接收到发送方发送的ModbusTCP安全报文后,通过地址在预置表中找到发送方对应的预共享密钥Key和公钥PK.通过PK验证签名S1,若签名验证通过,则在证明消息发送方合法身份的同时,还验证了发送数据的完整性.若身份认证通过则进行下一步,若签名验证不通过,则丢弃此消息.
② 若发送方身份验证通过,则通过预共享密钥Key解密密文C1,获得明文P1,即
P1=DKey(C1).
由于在上一步中已经对发送方身份和数据完整性进行了验证,则此时:
P1=Function Code‖Data‖Random.
③ 将Random字段中的随机数R与随机数表中的数据作比较,若R在随机数表中,则证明此消息为重放的消息并丢弃.若R不在随机数表中,则将R放入随机数表中,并通过功能码和数据作出相应的操作.
④ 若接收方为ModbusTCP从站,则将主站发送的功能码与本地预置表中的允许访问的功能码进行比对,若允许访问则进行下一步,否则丢弃该报文.
1) 中间人攻击.由于原始ModbusTCP协议在数据传输过程中数据以明文形式传输,因此攻击者一般通过中间人攻击获取传输的数据,导致数据的非法泄露和非法篡改.ModbusTCP安全方案通过SM4算法对传输的数据进行加密,此时攻击者通过中间人攻击获取到的为密文信息,由于SM4密钥在编码阶段就预编码到系统中,所以敌手无法获取此SM4密钥,从而无法破解密文.
2) 身份认证.由于原始的ModbusTCP协议不具备身份认证功能,即任何实体都可以充当为合法的身份加入到ModbusTCP网络中,接收方将所有接收到的消息都认作合法消息,造成数据非法泄露和操作非法指令等.本文的ModbusTCP安全方案通过SM2算法用SM2私钥对消息进行签名,接收方接收到消息后先通过SM2公钥进行验签,由于私钥只存在于合法身份中,所以若验签通过,证明该消息是合法身份则进行签名,之后才会进行后续操作,否则丢弃该消息.由于攻击者无法获取合法身份的SM2私钥,所以由攻击者发出的消息也无法通过身份验证.
3) 数据完整性验证.数字签名不仅可以保证消息发送方的身份,在验证过程中,SM2的输入为签名数据和签名,若签名数据被篡改,签名也无法通过验证,因此SM2签名验签同样有数据完整性验证的功能.
4) 防重放攻击.原ModbusTCP协议中没有防重发攻击机制,这意味着攻击者在捕获到报文后可以多次发送相同的报文给接收方,此时,接收方会多次重复地执行相同的操作,导致资源的浪费.ModbusTCP安全报文中增加了随机数字段,发送方每次发送消息前生成一串随机数并将其放入随机数字段,接收方每次接收到消息后将该随机数与本地随机数表进行比对,若存在相同的随机数,则证明该消息之前已经收到过,视为重放消息并丢弃,若没有相同随机数,则将该消息视为非重放消息,并将该随机数放入随机数表中.
为了验证本文方案的有效性,本节通过Wireshark软件捕获改进的ModbusTCP数据包,其中图1(a)为发送方发送的ModbusTCP安全报文,图1(b)为接收方返回的ModbusTCP安全报文:
图1 ModbusTCP安全报文
通过图2可知,截获到的报文消息内容为一串密文字符且功能码未知,保证了ModbusTCP报文的安全性.这是因为本文所提的ModbusTCP安全方案将功能码和数据明文数据加密成密文后再进行传输,即使敌手通过中间人攻击获取到传递的消息,由于不知道会话密钥,也无法解密并获取到明文,不仅无法得知截获消息的作用,而且无法得知截获的消息主要内容.
图2 发送方和接收方计算开销
表1为不同方案的计算开销对比,其中H代表哈希算法,SM4代表1次SM4对称加密算法,e代表1次指数运算,dp代表1次点乘运算.
表1 不同方案计算开销对比
如表1所示,文献[4]采用1次公钥加解密和公钥签名验签操作,所以在文献[4]中,发送方和接收方各用了2个计算开销较大的指数运算.文献[5]分别在身份认证、密钥协商和数据传输过程中运用到1次数字签名和验签的操作,并且在密钥协商过程中用公钥加密算法加密协商的会话密钥,所以文献[5]中的发送方和接收方的计算开销中存在大量的点乘运算.而本文方案只需要用1次签名和验签运算就可以解决ModbusTCP协议的身份认证问题和数据的完整性问题.所以发送方和接收方只用1次计算开销较大的指数运算.通过实验结果对比,本文方案的计算开销优于其他文献方案.
此外,为了清楚地评估本文所提方案的计算开销,在实验阶段分别统计了数据大小为50B,100B,150B,200B,250B时本文方案的计算开销.其中,图2(a)为发送方不同数据大小的计算开销,图2(b)为接收方不同数据大小的计算开销.如图2所示,本文方案发送方整体计算开销在17ms左右,接收方整体计算开销在20ms左右.
目前工业控制系统协议大多应用于轻量化的终端中,其计算能力和存储能力都是有限的,所以一个工业控制协议的安全方案除了计算开销,其存储开销的考量也是非常重要的.该阶段主要统计了不同方案在系统初始化时花费的存储开销.表2为本文方案与其他方案在存储方面的开销对比:
表2 不同方案存储开销对比
本文针对传统ModbusTCP协议缺乏身份验证、数据明文传输、重放攻击威胁等问题,提出一种ModbusTCP安全增强方案,在该方案中,通过SM2签名算法实现的ModbusTCP主站与从站段之间的身份认证和数据完整性检测,利用对称加密算法SM4实现了ModbusTCP协议传输中的数据加密传输,通过随机数的形式实现了ModbusTCP防重放的机制,实验结果表明本文方案在确保安全性的同时,带来的额外开销也是可接受的.