汽车安全测试终极指南,第一篇
汽车安全测试终极指南,第一篇
随着汽车智能化和自动驾驶技术的快速发展,汽车安全已成为一个备受关注的话题。本文将为你详细介绍汽车安全测试的基础知识,重点讲解CAN总线的工作原理和安全测试方法。通过本文,你将掌握如何利用开源工具对汽车进行安全测试,为深入研究汽车安全打下坚实的基础。
汽车安全是一个非常令人兴奋的话题,也是许多安全研究人员热衷的研究课题。随着特斯拉这样的自动驾驶汽车的到来,汽车的安全性将变得愈发重要。如今,当我们开车时,驾驶的就是一台功能极其强大的电脑,只不过加上了轮子和方向盘而已。
所有这一切的核心,就是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