电动汽车CAN协议的重放攻击与防御方法
2021-07-16李亚菲陈雪鸿刘丽丽
王 勇, 李亚菲, 陈雪鸿, 刘丽丽, 吴 旻
(1.上海电力大学, 上海 200090; 2.国家工业信息安全发展研究中心, 北京 100040;3.华电电力科学研究院有限公司国家能源分布式能源技术研发(实验)中心, 浙江 杭州 310030)
控制器局域网(Controller Area Network,CAN)是串行通信协议的一种,目前包括CAN2.0A和CAN2.0B两个版本。电池管理系统(Battery Management System,BMS)与充电机的通信采用CAN2.0B,具有通信速度快、距离远,可同时连接多个CAN节点,多主控制等优点,但协议本身存在一些安全漏洞,使得电动汽车在充电过程中面临着一系列信息安全问题。例如:黑客故意攻击充电桩,使充电桩无法给电动汽车正常充电;恶意窃取用户的充电账号、支付密码以及充电位置等个人信息,侵犯用户的隐私权;有些用户可能会去篡改相关充电数据,减少计费,给运营公司的利益带来损害[1]。
针对上述问题,当前国内外有关CAN协议的安全性研究主要包括CAN总线异常检测、数据加密传输与认证、防火墙技术、安全框架研究等。
在CAN总线异常检测领域,于赫等人[2]提出了基于信息熵及消息相对距离的车载CAN总线网络异常检测方法。张子键等人[3]提出了一种新的总线异常检测算法,并设计了可以访问CAN总线的异常检测系统。张浩和杨进华[4]在仿真软件CANoe的环境下,建立了整车单帧诊断的模型,完成了对汽车单帧诊断的仿真研究。
在数据加密传输与安全认证方面,赵兵等人[5]采用国密SM1加密算法,设计了一种具备安全防备功能的充电控制策略,能够避免数据在通信过程中被非法截取或改动。赵翔等人[6]采取嵌入式系统,采用密钥池技术简化加密算法,增大了电动汽车充电数据的破解难度。高德欣和梁珂[7]通过采用SHA1不可逆加密算法,将用户信息加密存到数据库和分账户权限管理中,并采用DES+RSA算法进行数据传输设计,增加了电动汽车充电监控系统数据的安全性。
在防火墙技术研究方面,唐良等人[8]针对当前车载网络中面临的信息安全问题,设计了一种类似于防火墙功能的车载网关,用来过滤传统以太网的威胁数据包。肖鹏等人[9]提出了一种针对车载信息系统安全的防火墙技术,在一定程度上可以避免外部网络的攻击。
在安全框架研究方面,LI H等人[10]从CAN总线以及3G网络入手,构造了以防火墙、入侵检测体系为主的电动汽车充电信息安全防备架构。HÖFER C等人[11]采用隐私影响评价方法,研究了ISO 15118标准中对充电设施充电以及支付的隐私保护策略,并设计了基于匿名证书等隐私增强技术的隐私保护系统。FAZOUAUE M等人[12]针对ISO 15118标准中提到的POPCORN隐私保护协议,指出了其存在的问题,并给出了相应的改进措施。
上述4个方面的研究在一定程度上解决了CAN协议的通信安全问题。但在数据加密传输和安全认证方面仍存在一定的问题,如赵兵等人提出的国密SM1加密算法,可以防止CAN数据被非法截获或篡改,但并不能够抵御重放攻击。就电动汽车充电过程中遭到的重放攻击而言,目前研究较多的是文献[2]提出的异常检测方法用来检测重放攻击,但并未给出电动汽车充电CAN总线遭到重放攻击时具体的防御措施。
本文针对当前存在的问题,在使用STM32F767单片机、USB-CAN转换器和PC机实现了有关CAN协议的环回通信以及与PC之间的通信后,分析了CAN协议的安全性,然后采用JAVA编写的程序模拟电动汽车的充电过程,进行重放攻击,并通过加随机数来有效抵御重放攻击,以保证电动汽车充电通信过程的信息安全。
1 相关CAN问题分析
1.1 CAN总线系统结构
CAN总线系统一般由4部分组成,如图1所示。
图1 CAN总线系统结构
(1) CAN控制器 接收控制单元中微处理器发出的数据,处理数据并传给CAN收发器。
(2) CAN收发器 用于将数据发送到总线或从总线接收数据至控制器。
(3) CAN数据传输终端 是一个电阻,可以避免数据在线端被反射,大部分情况下为120 Ω。
(4) 两条CAN数据传输线 能够双向传输数据,被称为CAN-H和CAN-L,其电位相反,但电压总和总是为一常数,可以免受外界电磁干扰,对外也无辐射。
1.2 CAN协议数据结构分析
CAN设备以封包的形式在CAN网络上传输数据,这些封包称为帧。CAN帧指完整的CAN传输单元,包含仲裁ID、数据字节、确认位等。标准CAN帧格式如图2所示。
图2 标准CAN帧格式
(1) SOF(帧起始)位 用逻辑0表示消息开始。
(2) 仲裁ID 消息的识别码并定义优先级。帧有两种格式,标准帧有11位仲裁ID,扩展帧有29位仲裁ID。
(3) DE(标识符扩展)位 区分标准帧和扩展帧。
(4) RTR(远程传输请求)位 来划分远程帧和数据帧,逻辑0即数据帧,逻辑1即远程帧。
(5) DLC(数据长度码) 表示数据段包含的字节数量。
(6) 数据段 包含0~8字节的数据。
(7) CRC(循环冗余校验) 包括15位的循环冗余校验码和一个隐性分隔符位。CRC段用于检测错误。
(8) ACK(ACK确认)槽 正确接收消息的控制器均会在消息末尾附加一个ACK位发送。传输节点检查总线上的ACK位,如未发现ACK位,则重新发送消息。
(9) EOF 帧结束位。
1.3 CAN协议通信过程
CAN总线协议是一种串行通信协议,CAN节点广播发送数据给网络中的所有节点。CAN收发器收到数据后就将其送给CAN控制器,再由CAN控制器判断是否是所需要的信息,否则忽略它。CAN协议在数据链路层处理数据的流程如图3所示。
图3 CAN协议在数据链路层处理数据的过程
1.4 CAN协议安全性分析
在刚开始设计时,CAN协议只考虑将几个节点与可靠的网络连接起来,替代之前点对点的通信系统,减少系统布线的数量及复杂性,当时并没有考虑安全性。但是现代汽车可以连接更多的节点,最终用户可以轻松访问CAN总线,这就容易引发CAN总线的安全性问题,如嗅探、重放、帧伪造和帧注入攻击等各种安全问题。
CAN协议的特点如下。
(1) CAN总线协议是没有认证方案的广播协议[13]。由于接入到CAN总线的所有节点都能接收到其他某个CAN节点发送的数据,故其数据容易遭到窃听,就有可能受到重放攻击。攻击者有可能接入到CAN总线,接收充电桩与电动汽车电池管理系统互相通信的报文,然后在任意时间重放到CAN总线网络中,干扰电动汽车正常的充电过程。
(2) CAN数据缺乏加密功能。该总线协议采用明文的方式传输数据,不包含加密、认证机制,也无异常检测系统,虽然现在有不少研究者可以通过采取加密和身份认证的方法来保证CAN数据的完整性和机密性,但无法同时兼顾网络的可用性。
(3) CAN总线支持多主工作。连接在CAN总线上的所有CAN节点都具有相同的访问权限,任何一个CAN节点可以在任何时候发CAN数据,但其中不包括源地址和目的地址;反之,该帧由一个全网唯一的仲裁ID标记。
(4) CAN总线仲裁机制容易阻塞信道。如多个节点在同一时间向总线发消息,优先级最高(即仲裁ID最低)的节点自动优先发送,否则必须等到总线空闲时才可再次发送消息,标识符越小优先级越高。如果某个CAN节点持续发送高优先级的消息,则会造成信道的阻塞,影响正常的CAN通信。
由此可知,由于CAN总线的广播特性以及CAN帧中没有包含发送节点的地址信息,使得CAN总线容易受到重放攻击。电动汽车在充电过程中可能遭受重放攻击的环节如图4所示。
图4 充电过程中遭到重放攻击
图4中,第三方攻击者通过非法接入CAN总线,利用该总线采用广播通信的特点,连接到CAN总线上的CAN节点可以接收由其中一个CAN节点发送的消息,并且攻击者可以恶意地向充电桩或电动汽车重复发送之前从CAN总线接收的报文信息,从而干扰正常的充电过程,给用户带来不便。
2 实验测试与分析
2.1 实验环境
本文以STM32F767单片机为主控制芯片,进行数据的采集和处理,来实现CAN数据的收发,并通过CAN总线实现与PC机的数据互传以及环回模式下的报文自发自收。通信的总体框架包括PC机、USB-CAN转换器、CAN收发模块电路(本文选用STM32F767单片机)3个部分。通过采用USB-CAN转换器可以将PC机接入总线进行数据的收发,能够通过控制界面观测从总线上收到的数据,并且向总线上发送帧。PC机与STM32F767单片机上的CAN模块通信的总体框图如图5所示。实验硬件设备物理连接情况如图6所示。
图5 CAN模块通信过程
图6 实验硬件环境搭建
在完成物理连接后,在终端电脑上安装并运行串口助手及Embeded Debug v2.0软件。
STM32F767单片机的开发环境采用的是Keil Software公司推出的支持JTAG调试接口的开发工具Keil u Vision5。由于flymcu暂时不支持STM32F767单片机通过串口下载代码,所以只能通过ST_LINK仿真器将编译无误的程序下载至开发板上。本文通过C++编写的程序包含系统及外设初始化、CAN控制器初始化、数据收发和处理部分3个部分[13],通过按键KEY_UP,能够切换CAN通信的模式——环回模式(Loop Back Mode)以及正常模式(Normal Mode),通过串口助手以及Embeded Debug v2.0可以查看CAN数据的发送与接收情况。
本文通过有关CAN协议的环回通信以及与PC机之间的通信,来验证CAN协议采用明文的方式进行数据传输以及CAN帧中不包含源地址和目的地址信息。
2.2 环回模式通信
CAN总线的环回模式通信也就是进行报文的自发自收,bxCAN把发出去的报文又当做接收的报文,并保留在接收邮箱里,而没有把报文送到CAN总线上。通过按下键KEY0,CAN1,CAN2模块发送数据,并在串口助手上选择相应的串口,设置波特率为115 200 B,则可以在串口助手的界面看到CAN1和CAN2模块均发送成功,以及发送的数据,如图7所示。
图7 环回模式下发送数据
2.3 与PC机之间的通信
STM32F767单片机与PC机之间在正常模式下通信,两个CAN节点之间的通信,可以向总线上发送消息,也可以从总线上接收消息。然而PC机并不能与总线直接相连,要通过USB-CAN转换器才能往总线上收发数据。USB-CAN转换器是将USB协议和CAN协议进行转换的网关,也称为PC-CAN,可以方便用户在计算机上记录、分析以及监控现场数据CAN消息[14]。USB-CAN转换器内部的CAN控制器收到总线上的信号后,再经过USB接口传给PC机;同样,PC机通过USB接口将数据发送给转换器内部的CAN控制器,然后将其发到总线上[15]。由于STM32F767单片机只有一个CAN模块连接到了CAN总线上,因此只有一个CAN模块可以从CAN总线上收发数据。本文选择相应的端口号,设置波特率为115 200 B,再通过上位机软件Embeded Debug v2.0实现CAN数据的收发。
通过设置发送数据的ID,8位数据以及帧的类型,可以完成PC机向开发板的通信,如图8所示。通过按键KEY0,可以由开发板向PC机发送ID为0X012的8位标准CAN数据帧,如图9所示。
图8 PC机发送CAN数据
图9 PC机接收CAN数据
通过对比报文传输界面可以发现,CAN协议确实是通过明文进行数据传输,无任何的加密,并且CAN帧中无源地址和目的地址,容易遭到重放攻击。
3 抗重放攻击算法
3.1 重放攻击
重放攻击,也可称为重播攻击、回放攻击,是指攻击者利用拦截或其他手段窃取客户端发送给服务器的数据包,然后恶意或欺骗性地将被盗数据一次又一次地发送给服务器[16]。由于重放攻击并不需要知道监听的信息是什么,只要做到重复发送该数据就可以了,所以一般采用的加密和身份认证只能防止数据被监听,并不能防御重放攻击。电动汽车充电过程中,遭到重放攻击的过程如图10所示。
图10 重放攻击过程
3.2 加随机数防御重放攻击的算法
目前,大多学者研究的是电动汽车电池管理系统与充电桩之间的数据加密传输和身份认证。对数据进行加密,是为了防止数据被监听攻击,其关键在于确保数据的安全保密性;身份认证用于判定某个身份是否真实,确定身份后才能根据不同的身份分配不同的权限,其关键在于用户的真实性。两种防御措施都不能够抵御重放攻击。本文在数字签名的基础上,提出了加随机数防御重放攻击的算法,其详细步骤如下。
(1) 设置随机数更新规则。本文采取JAVA中的new Random()函数产生一个长度为10的随机数,该规则可以为不同的消息设置不同的随机数,使消息请求的随机数都具有新鲜性。
(2) 发送方与接收方进行消息的互相传输时,预先为消息建立对应的随机数。
(3) 发送方在传输数据时将产生的随机数一起传给接收方。
(4) 接收方在收到消息和随机数后,在自己的数据库中检测该消息请求的随机数是否出现过,如果检测到该随机数与之前某次发送数据所携带的数据重复,则可以认为遭到了重放攻击[17]。
(5) 接收方为每次接收到的随机数建立相应的索引并将其储存在数据库中。
加随机数抵御重放攻击算法流程如图11所示。
本实验在用随机数抵御重放攻击时,先用MD5加密算法对传输的明文数据进行哈希值的计算,然后再将其和产生的随机数一起发送给接收方,接收方在收到信息后首先用发送方的公钥进行解密得到明文数据,比较解密后的数据和原来的明文数据,然后再检测随机数是否是第一次出现,从而保证数据的完整性,并有效抵御重放攻击。程序算法描述如图12所示。
图12 程序算法描述
3.3 实验分析
本实验以加随机数抵御重放攻击的算法为基础,在Windows10操作系统中,使用Eclipse Java 2018进行编程。模拟的电动汽车充电过程中有3种模式可供用户选择,如表1所示。
表1 3种充电模式
3种情况下的实验结果与分析如下。
(1) 正常充电模式。本文通过JAVA编写的程序模拟电动车充电的过程,当输入“0”时,进入电动汽车正常充电的模式,如图13所示。通过对CAN帧的分析可知,主要通过充电桩发给电动汽车BMS报文中的电压值的变化来体现整个充电过程的变化。
图13 正常充电模式
(2) 重放攻击。在模拟攻击过程中,当充电桩给电动汽车发送的报文显示当前电压为45 V时,实施重放攻击,即由第三方不断向充电桩发送一个之前由电动汽车发送给充电桩停止充电的消息,迫使电动汽车停止充电。攻击结果如图14所示。实验结果表明,当电动汽车在充电过程中遭到重放攻击时,充电过程停止,正常充电过程受到干扰。
图14 重放攻击模式
(3) 加随机数抵御重放攻击。将加随机数抵御重放攻击的算法应用到本实验后,在每次充电桩与电动汽车BMS进行CAN数据传输时都加上随机数,在电压达到40 V时进行重放攻击。输入数字“2”时的实验结果如图15所示。实验结果表明,在BMS发送给充电桩的消息请求中加入随机数时,如果该随机数与数据库中之前存储的随机数重复,则可以判定为重放攻击,充电桩不执行攻击者发出的停止充电命令,以保证充电过程的安全进行。
图15 抵御重放攻击模式
通过分析与对比上述3个实验结果可知,采用加随机数的方式能够有效抵御重放攻击,确保电动汽车充电过程中的信息安全。
3.4 算法的局限性
本文提出的抗重放攻击算法的局限性主要体现在以下两个方面。
(1) 虽然不需要时间同步,并且可以有效抵御重放攻击,但还需另外保存使用过的随机数,所以将增加数据库的保存开销。
(2) 对每次的消息请求都要查询数据库,会导致算法运行效率偏低。
因此,下一步的工作重点是研究如何提高算法的效率,减少保存和查询开销,提高算法在传输数据时的可用性,并且针对实际的电动汽车充电系统进行优化测试。
4 结 语
本文采用STM32F767单片机、USB-CAN转
换器和PC机搭建实验硬件环境,实现了与CAN协议有关的环回通信以及与PC之间的通信。通过通信结果分析CAN协议目前存在的安全性问题;针对典型的重放攻击,提出了采用加随机数的算法进行防御,并将根据该算法编写的相应程序部署于电动汽车充电的通信过程中,通过实验验证了抗重放攻击的有效性,从而为CAN协议通信提供了更安全可信的环境,增加了电动汽车充电过程中的信息安全性。