潘 琪,谭 劲,范明月
(中国计量大学 信息工程学院,浙江 杭州 310018)
控制器局域网CAN[1](Controller area network)最早是由Bosch公司于1985年研发,用于搭建车内网络,是一个汽车内部ECU之间有效、可靠、快速的串行传输总线,并于1993年成为国际标准(ISO 11898)。大部分汽车里都有两条CAN总线[2]:一条高速总线,用来传输汽车在行驶中传动系统单元的相关数据,如发动机、方向盘、刹车和变速箱等。它的传输速率约500 kb/s,最高可达1 M;另一条是低速总线,主要用于传输车身单元的数据,如收音机、车门锁、车窗控制和温度(空调)等数据,传输速率可达125 kb/s。在每条总线上传输的各个数据就是一个电控单元即ECU。两条总线之间通过一个网关[3]相连,网关可以进行速度匹配和与其它总线格式进行转换。整车网络框架如图1。
图1 整车网络框架图Figure 1 Vehicle network framework
CAN协议废除了传统的站地址编码,对发送的消息进行编码,消息的标识符ID由11位或29位[4]的二进制数组成。在CAN总线上不存在主/从ECU,所有节点都能发送数据和接收其它节点发出的数据[5],并且所有ECU都有过滤能力。当某一个ECU发出消息后,其他所有的ECU可以同时接收并读取该ECU发送的数据,但这些ECU只对有需要的数据作出回应;当多个节点同时发送数据时,依据总线仲裁特性[6],ID值越低优先权越高,具有较低值ID的消息可以优先将数据发送出去,而较高值ID的消息只能在总线空闲时再发送。CAN总线上的消息包含4种不同的帧[7],即数据帧、请求帧、错误帧和超载帧。数据帧的数据长度范围为0~8字节[8],由ECU周期性的发出,不同ECU发出数据的间隔周期是不同的,通常在10~10 000 ms间;请求帧用于请求其它ECU发出的数据,发送出去的请求帧的ID与被请求数据的数据帧ID相同,但数据段没有内容,被请求的ECU在接收到该请求帧后需要响应该请求,CAN 2.0A数据帧与请求帧格式见图2;错误帧在发送和接收遇
图2 数据帧与请求帧格式Figure 2 Data frame and request frame format
到错误时发出用于纠正错误;超载帧用于发送数据太快,接收ECU跟不上发送的速度时发出。
由于任何接入CAN总线的设备都可以发送消息,而且CAN总线没有安全组件不能及时鉴定并阻止恶意攻击,导致汽车CAN总线容易成为恶意对手(盗车者、自行改装、竞争对手等)攻击的目标[9-10]。攻击者可以将设备通过在线诊断接口OBD将攻击设备接入CAN[11]或自行改造更换原有ECU对车辆进行攻击。最典型攻击模式的就是注入式攻击[12],主要包含以下三类。
1)拒绝服务攻击DoS:由于总线仲裁机制,低ID消息将获总线使用权,攻击者不停发送低ID(如00)消息,将阻止所有其它正常ECU发送消息,汽车将不能启动;
2)假扮攻击:假扮原有ECU(消息ID相同,移除了原有ECU),如为了获取更多发动机功率或速度的车辆改装;
3)模糊攻击:随机产生消息ID发送到CAN总线,其ID消息有可能是总线上没有的(与总线上相同ID的攻击类同于假扮攻击),其目的是破坏汽车正常运行(数据乱七八糟,不在正常范围内),严重可能导致事故。
为提高CAN总线传输安全,对传输消息进行加密的密钥鉴定协议[13]成为抵抗攻击的首选方法。但由于CAN总线传输时发送的消息数据最多允许放置8个字节,使用到的加密算法占用的字节数远超过8个字节,如果不想让消息鉴定导致的传输流通量影响CAN总线上的数据传输,就需要一次性发送多个消息来完成一次认证,这样就会造成资源浪费,被恶意攻击之后甚至会导致数据丢失无法完成后续认证,干扰报文时序。为了不占用额外的数据帧且无需发送多个消息协同认证,对传输过程中出现的异常情况直接检测的方法能更高效的提高安全性能。它只需要对总线中的ECU或网关等内部数据进行监控,与真实环境下总线正常传输得到的参数范围进行对照来检测是否存在恶意攻击,这样既能确保传输安全又不影响数据正常传输。为了有效检测出注入式攻击,本文提出一种总线报警网关。通过只修改CAN总线网关的软件,利用CAN总线协议中ECU发出数据帧的ID、响应其它ECU请求帧的时间、数据本身的最大值和最小值及数据产生的周期,来判断是否有DoS和冒充已有ECU或新增ECU发出假扮数据等的注入式攻击中的应用。
目前,为了提高CAN总线的安全性能,国内外研究者主要从信息安全角度出发,对信息数据进行检测或对传输异常进行检测,以确保传输安全。在消息数据检测过程中大都采用加密和解密的手段,选取消息数据中的特定数据作为标记并对其进行加密传输,接收节点接收到消息之后对其进行解密认证是否存在恶意侵袭,在此基础上还会添加时间戳来优化检测性能,更高效地检测注入式攻击,提高传输安全。文献[14]提出一种基于HMAC[15]的简单轻量级消息认证协议,使用对称密钥对报文中的认证标记进行加密处理,在系统启动期间建立会话密钥并在MAC上添加一定长度的计数器有效避免重放攻击,但验证消息的所有节点都必须需要知道预共享密钥。文献[16]将消息数据与时间戳结合并使用HMAC算法对其进行加密,接收方对其解密对比认证,之后再比较时间戳的新鲜度进行双重认证,保护CAN总线免受DoS攻击、重放攻击和一般未经授权的使用,但并不能有效避免模糊攻击。通过网关内部数据进行异常检测的研究相对较少,国内外对于车载CAN网关的研究主要集中于CAN网络与其他网络的互联上以及为了避免网关作为数据传输介质时造成延迟并对其优化[17-20]。文献[21]对当前待检验车载网络中ECU之间传输的消息数据进行监控并计算得出信息熵,将正常网络传输时的计算得出的信息熵作为参照并将两者的信息熵对比,检测CAN总线传输过程中可能存在的洪泛攻击以及重放攻击。文献[22]提出一种基于CAN ID熵变的黄金熵模型来检测恶意攻击,攻击对正常传输过程注入恶意消息,这类消息会阻止来自其他ECU的正常消息访问CAN总线,此时就会改变位级的熵,将模拟过程中的位熵与正常驾驶期间熵的分布即黄金熵模型进行对比推断有无恶意ID。文献[23]将网关作为介质实现CAN总线与LIN总线之间的信息传输并被证实网关确实可以提高两者的通信效率。
在网关的内存中记录两个表格,一个是静态表,一个是动态表。
1)静态表:该表格记录了CAN总线上所有ECU发出消息的ID,周期T、数据的最大值Max、最小值Min及响应请求帧的响应时间R,此表按ID由小到大排序,如表1。请求响应时间R需要车辆启动后获取,获取的方法是:ECUj向CAN总线发送请求消息为IDi的请求帧,网关监听到并记录当前时间,具有消息IDi的ECUi接收到请求帧后发送一个响应数据帧出去,网关监听到该响应数据帧后记录当前时间,等待响应时间Ri公式如下:
Ri=网关接收到响应数据帧时间-网关监听到请求数据IDi时间。
(1)
2)动态表:该表记录着CAN总线上的所有两次数据帧发出的时间、数值大小和请求帧发出的时间及对应的响应帧的时间和大小,如表2。
表1 静态表
表2 动态表
检测算法过程如下。
步骤1 各ECU周期性发送数据帧出去,记录发送时间st1。
步骤2 网关循环接收数据帧或请求帧,如果是数据帧转步骤3;如果是请求帧转步骤7。
步骤3 检测数据帧的ID是否在表1中即是否满足式(2):
IDi∈{ID1,ID2,…,IDn}。
(2)
如果式(2)不满足,存在恶意攻击,报警;否则转步骤4。
步骤4 检测其值Value是否在表1的Min和Max之间即是否满足Min 步骤5 该数据帧前面无请求帧,说明是ECU自己周期性地发出数据,将第二次发出的数据的日期sT1和大小Value2存入表2中Current对应的字段比较数据发出的周期T是否满足式(3): sT1-st1=T。 (3) 如果式(3)不满足,存在恶意攻击,报警;如果式(3)满足,用Current中的接收时间和大小替换Previous对应的字段,转步骤2,等待下一个数据帧,如此循环往复。 步骤6 该数据帧前面有请求帧,说明有其它ECU请求数据,收到数据帧后将收到的时间rt2和大小Value3存入表2中ID且类型为“请求帧”记录中的Current对应字段,比较响应时间是否满足式(4): rt2-rt1=R。 (4) 如果式(4)不满足,存在恶意攻击,报警;如果式(4)满足,删除表2中ID且类型为“请求帧”记录,转步骤2。 步骤7 检测该请求帧ID是否在表1中,即是否满足公式(2)。不满足则存在攻击,报警;满足则转步骤8。 步骤8 在表2中新建ID且类型为“请求帧”的记录,并将请求时间rt1填入Previous中的时间字段(Value值为0),转步骤2。 算法流程如图3。 图3 算法流程图Figure 3 Algorithm flowchart 为了验证本文提出算法的可行性,我们在CANoe仿真软件中搭建一个CAN总线模型并加入攻击ECU进行模拟验证是否可以检测传输异常,在CAN总线上任何ECU都可以接收消息且网关可以监听到所有消息。我们假设在一个完整的CAN总线结构中对特定的ECU收发消息过程进行模拟,并放置一个攻击节点分别对实验模型发送异常攻击报文,搭建模型如图4。 图4 实验模型Figure 4 Experimental model 在实验模型中我们获取到Engine以及ABS的消息ID,产生周期T、最大/最小值Max/Min和响应时间R并将其存储在静态表表3中,之后将Engine的所有两次数据帧发出的时间、数值大小、ABS发出请求帧的时间及对应的响应帧的时间和大小存储在动态表表4中。我们为Engine设三个信号变量,并设定Engine周期性发送数据帧出去,周期T为40 000 ms。 表3 静态表数据 表4 动态表数据 我们针对以下三种常见的注入式攻击进行讨论分析。 1)DOS攻击:总线上没有的消息ID通过网关中的表3可以直接检测出DoS攻击或部分模糊攻击;网关监听CAN总线上的所有数据帧和请求帧,如果其ID不在表3所在的表中,肯定是DoS攻击或部分模糊攻击。 2)假扮攻击:攻击节点Attack发送具有相同ID的数据帧出去,网关经过表4检测发现“周期数据帧”的周期出错(增大或减小)或数据的大小(含响应请求帧的数据)不在Min、Max之间,报警。 3)模糊攻击:其消息ID属于CAN总线,其值也在Min、Max间,但值不是准确值。这类攻击可以从表3中的响应时间参数来检测,也就是表4中的rt3-rt2是否等于R2,不等于说明有攻击需要报警。 程序运行之后,我们得到Engine三个信号变量的数据变化曲线图如图5(a)所示并对其观察,当这三个信号变量数据脱离循环轨迹,传输异常,此处存在攻击;之后再对循环周期进行实时监控双重检测是否出现传输异常,Engine周期性发送数据帧出去得到的运行结果如图5(b),当数据周期性发送出去时,第1次发送数据帧出去的时间st与第2次发送数据帧时间sT的差值一直等于周期(40 000 ms)。当周期不满足T=40 000 ms时,判定传输异常,此处存在攻击。 图5 Engine正常发送数据帧Figure 5 Engine sends data frames in normal 1)Attack假扮Engine发送ID同为0×257但数据内容不同的消息出去;依据图6(b)方框标注信号区域发现三个信号变量的数据急剧下降或上升,脱离循环轨迹,判定此时存在攻击。再对图6(c)方框区域内CAPL运行数据分析发现网关监听到该消息后优先判断这是数据帧;将该数据帧ID与表3进行对照发现有此ID;与表4中的数据对比发现,该数据帧的Value不在Min和Max范围内;判定此时存在攻击,报警。 2)攻击节点Attack伪造一个ID为0×100的消息发送出去,对图7(b)方框内信号区域分析发现网关接收到该消息后对其进行检测发现是数据帧,网关接收到该数据帧后将该数据帧的ID与存储在表3中的ID进行对照发现此ID不在表3中,存在攻击,网关报警。 3)ABS发送ID为0×257的请求帧出去;由图8(b)方框内信号区域分析发现三个信号变量数据脱离循环轨迹,判定此时存在注入式攻击。对图8(c)最上方和最下方的方框内容分析发现网关监听到该请求帧后记录时间rt1;Engine接收到ABS发送过来的请求帧并对其回应,网关接收到后对其检测并记录接收该响应请求帧时间rt2,将rt2与rt1的差值17 ms与表1中R值进行对比发现相等,判定这是一个响应数据帧并删除表4中请求帧列表。Attack接收到该请求帧之后发送一个ID为0×257的响应数据帧出去;网关监听到该响应数据帧记录请求时间rt2;将rt2和rt1的差值10 000 ms与表3中R值进行比对发现不相等,此时存在攻击,报警。 图6 假扮攻击Figure 6 Spoofing attack 图7 Attack伪造一个ID为0×100的消息Figure 7 Attack forges a message of 0×100 图8 ABS发送ID为0×257的请求帧Figure 8 ABS sends a request frame of 0×257 在不添加额外认证数据以及不干扰报文时序的前提下,我们只对CAN总线中的车载网关作出修改使之具备检测能力。我们在车载网关软件中添加两个检测表格并利用CAN总线协议中ECU发出数据帧的相关信息对CAN总线传输过程中出现的异常进行检测;最后,我们使用CANoe仿真软件对正常CAN总线传输过程进行模拟,并使用网关对传输消息进行实时监测,经验证发现,网关确实能够有效的检测出注入式攻击,可以有效提高CAN总线传输的安全。3 性能分析
3.1 实验环境
3.2 实验设置
3.3 注入式攻击理论讨论
3.4 注入式攻击模拟验证
4 结 论