汽车安全是一个非常令人兴奋的话题,也是许多安全研究人员热衷的研究课题。随着特斯拉这样的自动驾驶汽车的到来,汽车的安全性将变得愈发重要。如今,当我们开车时,驾驶的就是一台功能极其强大的电脑,只不过加上了轮子和方向盘而已。
所有这一切的核心,就是Controller Area Network或CAN(也被称为CAN总线),这是一个负责通信的汽车中央神经系统。在今天的文章中,我们要介绍的是如何利用CAN逆向工程包对汽车进行安全测试。
为此,我们将用到Craig Smith的ICSim软件包,它提供了一个带有车速表、门锁指示器、转向灯和控制面板的仪表板。控制面板用于与模拟汽车网络进行交互,以实现加速、刹车、控制门锁和转向灯。
概述
本指南的主要目的是帮助大家了解汽车的安全测试。与其他安全领域相比,汽车渗透测试的难度要高得多。
虽然汽车黑客和汽车安全是一个非常宽广的领域,但本指南只关注Controller Area Network(CAN),并仅限于CAN流量非嗅探、分析和逆向,以实现重放攻击。尽管文中的测试是在仪表盘模拟器上进行的,但该过程也可以在带有额外硬件的真实汽车上完成。我将在本文末尾介绍所需的额外材料。
这篇文章的目的是帮助你轻松地开始学习汽车安全或汽车故障,而不需要在硬件上花很多钱,所以,我们先从模拟器开始练手。
在这篇文章中,你将学习下列知识:
CAN操作
通过OBD-II获得对CAN的访问权限
嗅探CAN流量
CAN流量的分析与逆向工程
重放攻击
基于CAN的拒绝服务攻击
通过Python操作CAN包
所需软件
在本教程中,需要用到下列软件:
任何Linux发行版(这里使用的是Ubuntu);
Can-utils;
ICSim (开源的汽车模拟器),下载地址:https://github.com/zombieCraig/ICSim。
CAN简介
Controller Area Network(又称CAN)是汽车的所有/某些部件之间进行通信的中枢神经系统。
在CAN问世之前,车载通信系统是通过点对点的布线系统实现的。随着车载电子元件越来越多,这种通信系统变得愈发笨重,而且维护费用非常昂贵。这时,CAN应运而生,并成为主流的车载通信系统。
简单地说,CAN允许汽车中的不同电子模块相互通信并分享数据。CAN提案的主要动机是它允许多个ECU(ECU=发动机控制单元=汽车控制单元)仅用一根电缆进行通信。一辆现代汽车最多可以有70个ECU。
在汽车中,通常拥有诸如发动机控制单元、安全气囊、变速箱、齿轮单元、防抱死制动系统或ABS、信息娱乐系统、空调、窗户、车门等众多模块。要在所有这些模块之间进行通信,基于点对点的布线将是相当庞杂的。想象一下,每一个元件都要连接到所有其他元件,这对于诊断和故障排除来说将是一个真正的灾难。但是使用CAN,这些线缆可以用一根电缆代替,并且每个单元之间的通信要简单得多。
除了流量是通过UDP而不是TCP进行传输之外,CAN总线基本上可以看作是以太局域网的低速版本。
值得注意的是,并不是所有的汽车控制系统都使用CAN,而且CAN也不是汽车系统中使用的唯一通信协议。
此外,还可能有其他协议,如蓝牙、GSM/LTE网络、卫星通信、LIN等。也就是说,CAN不是唯一可能受到攻击的程序;从这一点看,它并不孤单。
CAN操作
一辆车通常有多个能够发送和/或接收消息的节点。通常来说,每个消息都包含一个ID(表示消息的优先级),以及一个CAN报文,其中可以包含八个字节或更少内容。
如果两个或多个节点同时开始发送报文,则ID数字较低的节点发送的报文将替换ID数字较高的节点所发送的报文。这被称为基于优先级的总线仲裁。具有较低数值标识符的报文具有较高的优先级,并且总是首先发送。这就是节点在信道上定位和放置最高优先级报文的方式。
例如,来自制动器的报文的优先级,将高于来自音频播放器的报文。
请注意,较低的ID = 较高的优先级。
如果两个或更多的节点同时开始发送报文,以显性ID发送的报文将覆盖那些隐性ID报文。
CAN总线由两条不同的线缆组成。由于它是一条总线,许多设备都连接到它上面。一个CAN帧有3个主要部分,它们是:
仲裁标识符
数据长度代码
数据字段
让我们来看看CAN数据帧:
如果CAN从来没有被发明过,结果会怎样?
一个合乎逻辑的问题可能是:为什么要使用CAN系统,毕竟还有许多其他的方式可以轻松实现呀?在发明CAN总线之前,汽车制造商使用点对点的布线系统。因此,如果您在汽车中有三个部件,则所有三个部件都需要通过三角形布线系统以点对点方式相互连接。
假设这三个部件是方向盘、变速箱和ABS。现在,在一个标准的点对点布线系统中,我们需要用线缆将转向系统与变速箱和防抱死系统连在一起,同时,变速箱也需要通过线缆与ABS和转向系统相连。
这对于组件较少的汽车来说是完美的解决方案。但是,如果一辆汽车拥有多达100个不同ECU和其他组件的话,情况会怎样?除了连线是一件苦差事外,检测布线系统中的故障也不轻松(如果还能检测到的话),这时,故障诊断将是一场真正的噩梦,而且成本高昂。
面对这种困局,汽车制造商提出了CAN的想法。大量的点对点接线,可以用两条线代替,分别是CANH和CANL,它们是CAN HIGH和CAN LOW的简写。现在,这种通信方式不仅更快、更简单,并且非常容易诊断故障。
为什么要关注CAN?
因为几乎每辆车都使用CAN,这是法律规定的,所以CAN不会很快停止使用。另外,CAN总线的开发并没有考虑到现代安全问题。
要访问汽车的CAN总线,您必须能够访问驾驶室诊断端口,也称为OBD。虽然当前的诊断标准和端口有数百种之多,但如今OBD-II已经成为了事实标准,几乎所有汽车都使用这种诊断端口。实际上,汽车修理工诊断汽车故障时,使用的就是它。
通过OBD可以直接访问CAN,并且是最直接的方式。另外,OBD-II也很容易找到:通常位于前排乘客或驾驶员座位附近的某个地方,而且不需要螺丝刀就能连接使用。
OBD 的样子如下所示:
如果你想知道OBD引脚的布局情况,请看下面的图片:
实际上,第6针和第14针就是我前面提到的CANH和CANL。
通过OBD访问CAN所需的硬件和软件
为了与CAN总线进行交互,由于需要通过OBD端口,因此,我们就必然用到类似于“USB转CAN”的适配器,否则,我们的电脑就无法与CAN进行通信。
对于这样的线缆,应该一端连接到OBD-II端口,另一端连接到USB端口,这样就可以发送/接收CAN数据包了。同时,我们需要一些软件,以读取和/或写入CAN数据包,以及编码和/或解码CAN数据包。只需这两样东西,我们就可以畅游CAN的世界了。
器具、配件
连接到OBD-II所需的硬件可以很容易在市场上找到,有贵的,也有便宜的。比较贵的包括Kvaser和EMS,它们不是一般的贵,而是太贵了。不过,我们可以选用USB2CAN,这是一个用于Linux系统的接口,大概60欧元左右。
另外,我们也会经常看到基于ELM327和蓝牙的设备。它们对安全测试非常不利,因为它们的数据速率较慢,会丢失大量的数据包。但它们比较偏移,约为10欧元。
Macchina M2
Macchina M2是我个人的最爱(价值85欧元)。Macchina M2是一个开源的汽车接口,可以用于通过OBD-II与CAN总线通信。Macchina M2的最大特点在于:它是模块化的,这意味着你可以在M2上添加WiFi、GSM、LTE、BLE。M2有2个CAN信道。此外,M2还支持LIN;关于Macchina M2的更多信息,请访问这里。
我曾使用过USB2CAN和Macchina M2,它们的质量不错,用起来没毛病。
CLX000
另一个低成本的选择是CSS电子公司的CLX000,它可以用来记录和传输CAN数据。这些数据可以通过免费的Wireshark开源软件进行显示,而且还有一个插件,可以帮助我们实现逆向分析。
总的来说,CLX000是可视化和远程信息处理的理想选择。
你可以在这里找到更多关于CLX000的信息,他们提供了许多关于CAN的精彩文章,相关地址:https://www.csselectronics.com/screen/page/reverse-engineering-can-bus-messages-with-wireshark/language/en
相关软件
在软件方面,你有SocketCAN、can-utils、vcan嵌入到Linux内核中。它们的作用是发送和接收CAN数据包,对其进行编码和/或解码。
当然,还有Wireshark,可以用来分析CAN数据包。
如果既想探索CAN的各种操作,而不想损坏汽车,可以选择ICSim模拟器。
搭建虚拟环境
练习汽车安全测试的最好且最便宜的方法,就是运行一个仪器模拟器。感谢Craig Smith发布了名为ICSim的开源repo。借助ICSim,设置和学习CAN总线会轻松许多。
仪器模拟器所需的SDL库
SDL是一个用于计算机图形和音频的多平台开发库。由于ISCim使用了一个虚拟控制面板,并以动画的形式展示数据,所以SDL库是必需的。该库可以通过apt-get安装:
sudo apt-get install libsdl2-dev libsdl2-image-dev -y
安装Can-utils
为了发送、接收和分析CAN数据包,我们需要用到一组CAN工具。Can-utils是一套Linux工具,它允许Linux与车内CAN网络进行通信。Can-utils主要由5个工具组成:
- cansniffer:用于嗅探数据包
- cansend:用于编写数据包
- candump:转储所有下载的数据包
- canplayer:用于重放CAN数据包
- cangen:用于创建随机的CAN数据包
can-utils可以通过apt-get安装
sudo apt-get install can-utils -y
下载仪表模拟器
仪表盘模拟器是用来生成CAN的模拟运动的。
你可以通过git资源库下载它:https://github.com/zombieCraig/ICSim。
如果一切顺利的话,你应该看到:
准备虚拟CAN网络
通过浏览ICSim目录,可以找到有一个叫setup_vcan.sh的shell脚本:
这里的modprobe命令是用来加载内核单元的,比如can和vcan。最后两行将创建一个vcan0接口,以模拟汽车网络。
之后,我们可以运行下面的命令,来设置一个虚拟接口:
./setup_vcan.sh
要验证vcan0接口是否能够正常工作,可以使用ifconfig vcan0命令:
运行模拟器
现在,终于可以运行模拟器了。不过,要想运行ICSim模拟器,至少需要两个组件:一个仪表盘和一个控制器,这样才能模拟加速、刹车、门控、转向灯等。另外,操作过程中,我们至少需要3个终端窗口,其中两个窗口分析显示仪表盘、控制器,另一个窗口执行其他命令。
控制面板的执行
要运行控制面板,你必须运行一个名为icsim的文件,参数为vcan0(我们之前创建的接口):
./icsim vcan0
到目前为止,仪表板将不会有任何动作,包括速度表、灯光、刹车或车门。这是因为vcan0接口还没有动作,为了模拟它,我们必须启动控制器。
控制面板可以通过以下命令启动:
./controls vcan0
Vcan0是虚拟的CAN接口,ICSim将通过它发送和接收CAN帧。一旦启动控制面板,速度表会出现一些波动。这是由于控制面板所模拟的噪音而造成的。
启动控制面板后,我们就可以使用键盘上的按键来模拟各种运动。
使用以下组合键,可以对ICSim控制面板进行相应的修改:
一旦按下向上箭头和向左箭头键,就会看到:
关于程序设置的内容,就介绍的这里。如果您按照上面的介绍完成了相应的设置,就已经获得了对“汽车”的完全控制权。在第二篇文章中,我们将介绍总线数据的利用方法。
原文地址:https://en.iguru.gr/car-hacking-apolytos-odigos-part/
原文始发于跳跳糖(汽车安全测试终极指南,第一篇(译文)
):