车联网安全入门一:了解CAN总线及环境模拟
- 准备打工了,工作内容和车联网安全相关,本来想着和app分析有较大关系,但是还涉及到很多关于汽车渗透测试相关的知识,由于之前并没有接触过,就借此机会和大家来学习一下。
## CAN基础知识
### CAN(Controller Area Network)
- 上图是CAN总线的拓扑结构,其中左边是高速CAN总线的(典型应用包括车辆电子系统中的发动机控制、传感器数据传输、车载娱乐系统、车辆网络通信等),右边是低速CAN总线的(常用于车辆中的舒适性和安全性系统,如车窗控制、座椅控制、空调控制和ABS等)。
- CAN的优势
- 轻量、成本低。CAN 提供了一种廉价、耐用的网络,可帮助多个 CAN 设备相互通信。这样做的一个优点是电子控制单元 (ECU) 可以具有单个 CAN 接口,而不是系统中每个设备的模拟和数字输入。这降低了汽车的总体成本和重量。
- 广播通信方式。网络上的每个设备都有一个CAN控制器芯片,因此是智能化的。网络上的所有设备都能看到所有传输的消息。每个设备都可以决定消息是否相关或是否应该过滤。这种结构允许对 CAN 网络进行修改,影响最小。无需修改网络即可添加其他非传输节点。
- 优先级。每条消息都有一个优先级,因此如果两个节点尝试同时发送消息,则优先级较高的节点将被传输,优先级较低的节点将被推迟。这种仲裁是非破坏性的,并且会导致最高优先级消息的不间断传输。这也使得网络能够满足确定性的时序约束。
- 纠错能力。CAN 规范包括循环冗余码 (CRC),用于对每个帧的内容执行错误检查。所有节点都会忽略有错误的帧,并且可以传输错误帧以向网络发出错误信号。控制器区分全局错误和局部错误,如果检测到太多错误,各个节点可以停止传输错误或完全断开与网络的连接。
### CAN协议
- CAN总线的报文类型主要有五种,数据帧、远程帧、错误帧、过载帧、帧间隔。下面以数据帧为例进行简单介绍,其帧结构如下图所示,包含七个段:帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束。详情请看参考资料。
### 工作原理 - 如前所述,CAN 是一种点对点网络。这意味着没有主设备来控制各个节点何时有权读取和写入 CAN 总线上的数据。当 CAN 节点准备好传输数据时,它会检查总线是否繁忙,然后将 CAN 帧写入网络。传输的 CAN 帧不包含传输节点或任何预期接收节点的地址。相反,整个网络中唯一的仲裁 ID 会标记该帧。 CAN网络上的所有节点都会接收CAN帧,并且根据所发送帧的仲裁ID,网络上的每个CAN节点决定是否接受该帧。如果多个节点同时尝试向 CAN 总线传输消息,则具有最高优先级(最低仲裁 ID)的节点将自动获得总线访问权限。较低优先级的节点必须等到总线变得可用才能再次尝试传输。通过这种方式,您可以实现 CAN 网络,以确保 CAN 节点之间的确定性通信。
CAN模拟
工具
-
ICSim
- ICSim包括一个带有车速表、门锁指示灯、转向信号灯和控制面板的仪表板。模拟控制器允许用户与模拟汽车网络进行交互,应用加速、刹车、控制门锁和转向信号。
- 注意一下,这里安装的时候仓库提示使用Meson来build项目,但是在我这个ubuntu虚拟机上不太行,我就直接用了sudo make.对了, 别忘了在build之前安装一下依赖库,其中就包括下面的can-utils。
-
can-utils
- Linux下CAN的调试工具。主要有以下功能:
- candump :显示、过滤 CAN 数据并将其记录到文件
- canplayer : 重放 CAN 日志文件
- cansend :发送单帧
- cangen:生成(随机)CAN 流量
- cansequence :发送并检查具有递增有效负载的 CAN 帧序列
- cansniffer :显示CAN数据内容差异
- 使用:
- 安装好ICSim和can-utils就可以简单测试一下。
- 先进行ICsim的初始化:./setup_vcan.sh,然后启动IC模拟器:./icsim vcan0。然后再启动控制器:./controls vcan0。然后就可以进行一些简单的操作,可以看到仪表盘中数值或者模型的变化。
- 如果要抓包就在打开模拟器之前使用命令:candump -l vcan0。抓取vcan0的流量。具体情况如下图所示,开头是时间戳,然后是接口,最后是报文具体的内容,#号分割ID的Data字段。
- 如果要找某一功能的具体帧,可以通过二分法加上重放,找出响应的功能帧。具体就是将dump的报文一分为二,然后用canplayer重放,找出关键帧所在的那一半,然后接着对这一半进行二分法,继续重放。最后二分到个位数的时候可以用cansend发生单帧。
- Linux下CAN的调试工具。主要有以下功能:
-
SavvyCAN
- 一个基于 Qt5 的跨平台工具,可用于加载、保存和捕获 canbus 帧。该工具旨在帮助可视化、逆向工程、调试和捕获 canbus 帧。
- 安装过程,项目中都有说明。需要注意的是Qt的版本,安装qt反而是比较麻烦的,相关教程网上也都有。这里说一下我按照QT时候的坑,开始不知道选哪些库,然后qmake时缺少一些库,就要去安装目录下找下图可执行文件,然后添加相应library。
- 安装好之后,使用./savvyCAN打开图形界面。然后先连接vcan0才能进行下一步操作。点击Connection然后点击"open Connection Window"。
- 然后添加新连接。
- 这里再简单介绍一下使用SavvyCAN fuzz ICSim的小功能。
- 首先打开RE Tools界面的fuzz Windows。然后根据需要选择位和字节进行fuzz。比如图中只fuzz最后两个字节的数据。
- 然后点击start fuzzing,就可以看到ICSim仪表的变化。
- 首先打开RE Tools界面的fuzz Windows。然后根据需要选择位和字节进行fuzz。比如图中只fuzz最后两个字节的数据。
参考
CAN介绍
https://blog.csdn.net/We8__/article/details/128441720
https://medium.com/yogeshojha/car-hacking-101-practical-guide-to-exploiting-can-bus-using-instrument-cluster-simulator-part-ea40c05c49cd
0 条评论
可输入 255 字