汽车安全测试终极指南,第一篇(译文)

qing16 2022-02-14 10:33:00

汽车安全是一个非常令人兴奋的话题,也是许多安全研究人员热衷的研究课题。随着特斯拉这样的自动驾驶汽车的到来,汽车的安全性将变得愈发重要。如今,当我们开车时,驾驶的就是一台功能极其强大的电脑,只不过加上了轮子和方向盘而已。

所有这一切的核心,就是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。

1.png

CAN简介

Controller Area Network(又称CAN)是汽车的所有/某些部件之间进行通信的中枢神经系统。

在CAN问世之前,车载通信系统是通过点对点的布线系统实现的。随着车载电子元件越来越多,这种通信系统变得愈发笨重,而且维护费用非常昂贵。这时,CAN应运而生,并成为主流的车载通信系统。

简单地说,CAN允许汽车中的不同电子模块相互通信并分享数据。CAN提案的主要动机是它允许多个ECU(ECU=发动机控制单元=汽车控制单元)仅用一根电缆进行通信。一辆现代汽车最多可以有70个ECU。

在汽车中,通常拥有诸如发动机控制单元、安全气囊、变速箱、齿轮单元、防抱死制动系统或ABS、信息娱乐系统、空调、窗户、车门等众多模块。要在所有这些模块之间进行通信,基于点对点的布线将是相当庞杂的。想象一下,每一个元件都要连接到所有其他元件,这对于诊断和故障排除来说将是一个真正的灾难。但是使用CAN,这些线缆可以用一根电缆代替,并且每个单元之间的通信要简单得多。

1.png

除了流量是通过UDP而不是TCP进行传输之外,CAN总线基本上可以看作是以太局域网的低速版本。

值得注意的是,并不是所有的汽车控制系统都使用CAN,而且CAN也不是汽车系统中使用的唯一通信协议。

此外,还可能有其他协议,如蓝牙、GSM/LTE网络、卫星通信、LIN等。也就是说,CAN不是唯一可能受到攻击的程序;从这一点看,它并不孤单。

CAN操作

一辆车通常有多个能够发送和/或接收消息的节点。通常来说,每个消息都包含一个ID(表示消息的优先级),以及一个CAN报文,其中可以包含八个字节或更少内容。

如果两个或多个节点同时开始发送报文,则ID数字较低的节点发送的报文将替换ID数字较高的节点所发送的报文。这被称为基于优先级的总线仲裁。具有较低数值标识符的报文具有较高的优先级,并且总是首先发送。这就是节点在信道上定位和放置最高优先级报文的方式。

例如,来自制动器的报文的优先级,将高于来自音频播放器的报文。

请注意,较低的ID = 较高的优先级。

如果两个或更多的节点同时开始发送报文,以显性ID发送的报文将覆盖那些隐性ID报文。

CAN总线由两条不同的线缆组成。由于它是一条总线,许多设备都连接到它上面。一个CAN帧有3个主要部分,它们是:

仲裁标识符
数据长度代码
数据字段

1.png

让我们来看看CAN数据帧:

1.png

如果CAN从来没有被发明过,结果会怎样?

1.png

一个合乎逻辑的问题可能是:为什么要使用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 的样子如下所示:

1.png

如果你想知道OBD引脚的布局情况,请看下面的图片:

1.png

实际上,第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欧元左右。

1.png

另外,我们也会经常看到基于ELM327和蓝牙的设备。它们对安全测试非常不利,因为它们的数据速率较慢,会丢失大量的数据包。但它们比较偏移,约为10欧元。

1.png

Macchina M2

Macchina M2是我个人的最爱(价值85欧元)。Macchina M2是一个开源的汽车接口,可以用于通过OBD-II与CAN总线通信。Macchina M2的最大特点在于:它是模块化的,这意味着你可以在M2上添加WiFi、GSM、LTE、BLE。M2有2个CAN信道。此外,M2还支持LIN;关于Macchina M2的更多信息,请访问这里。

1.png

我曾使用过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

1.png

安装Can-utils

为了发送、接收和分析CAN数据包,我们需要用到一组CAN工具。Can-utils是一套Linux工具,它允许Linux与车内CAN网络进行通信。Can-utils主要由5个工具组成:

  1. cansniffer:用于嗅探数据包
  2. cansend:用于编写数据包
  3. candump:转储所有下载的数据包
  4. canplayer:用于重放CAN数据包
  5. cangen:用于创建随机的CAN数据包

can-utils可以通过apt-get安装

sudo apt-get install can-utils -y

下载仪表模拟器

仪表盘模拟器是用来生成CAN的模拟运动的。

你可以通过git资源库下载它:https://github.com/zombieCraig/ICSim

如果一切顺利的话,你应该看到:

1.png

准备虚拟CAN网络

通过浏览ICSim目录,可以找到有一个叫setup_vcan.sh的shell脚本:

1.png

这里的modprobe命令是用来加载内核单元的,比如can和vcan。最后两行将创建一个vcan0接口,以模拟汽车网络。

之后,我们可以运行下面的命令,来设置一个虚拟接口:

./setup_vcan.sh

要验证vcan0接口是否能够正常工作,可以使用ifconfig vcan0命令:

1.png

运行模拟器

现在,终于可以运行模拟器了。不过,要想运行ICSim模拟器,至少需要两个组件:一个仪表盘和一个控制器,这样才能模拟加速、刹车、门控、转向灯等。另外,操作过程中,我们至少需要3个终端窗口,其中两个窗口分析显示仪表盘、控制器,另一个窗口执行其他命令。

控制面板的执行

要运行控制面板,你必须运行一个名为icsim的文件,参数为vcan0(我们之前创建的接口):

./icsim vcan0

1.png

到目前为止,仪表板将不会有任何动作,包括速度表、灯光、刹车或车门。这是因为vcan0接口还没有动作,为了模拟它,我们必须启动控制器。

控制面板可以通过以下命令启动:

./controls vcan0

1.png

Vcan0是虚拟的CAN接口,ICSim将通过它发送和接收CAN帧。一旦启动控制面板,速度表会出现一些波动。这是由于控制面板所模拟的噪音而造成的。

启动控制面板后,我们就可以使用键盘上的按键来模拟各种运动。

使用以下组合键,可以对ICSim控制面板进行相应的修改:

1.png

一旦按下向上箭头和向左箭头键,就会看到:

1.png

关于程序设置的内容,就介绍的这里。如果您按照上面的介绍完成了相应的设置,就已经获得了对“汽车”的完全控制权。在第二篇文章中,我们将介绍总线数据的利用方法。

原文地址:https://en.iguru.gr/car-hacking-apolytos-odigos-part/

评论

Q

qing16

这个人很懒,没有留下任何介绍

twitter weibo github wechat

随机分类

浏览器安全 文章:36 篇
后门 文章:39 篇
Windows安全 文章:88 篇
业务安全 文章:29 篇
APT 文章:6 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录