第三章:车辆与 SOCKETCAN 通信
并非所有总线都通过 OBD-II 连接器。本章将设置 SocketCAN 系统,用来更方便的和汽车沟通。
大众集团贡献了最初的 SocketCAN 实现,内置 CAN 芯片和卡驱动、外部 USB 和串口 CAN 设备以及虚拟 CAN 设备。can-utils 包提供多种应用程序和工具,用于与 CAN 网络设备交互。
SocketCAN 与 Linux 网络协议栈相连,这使得创建支持 CAN 的工具变得非常容易。套接字 CAN 应用可以使用标准 C 套接字调用,并采用自定义网络协议家族 PF_CAN。此功能使内核能够处理 CAN 设备驱动程序,并与现有网络硬件接口,提供通用接口和用户空间工具。

传统的 CAN 软件则有自己的协议,通常与字符设备通信,比如串口驱动程序,然后使实际的硬件驱动程序。左侧的 SocketCAN 使在 Linux 内核中实现的。
设置 can-utils 以连接到 CAN 设备
apt-get install can-utils
配置内置芯片组
下一步取决于我们的硬件,如果在找 CAN 嗅探器,应该查看支持 Linux 驱动列表,确保设备兼容。
例如:

CAN 控制器,如 SJA1000,通常内置于 ISA、PCI 和 PCMCIA 卡或其他嵌入式硬件中。例如,EMS PCMCIA 卡驱动实现了对其 SJA1000 芯片的访问。当我们将 EMS PCMCIA 卡插入电脑中,ems_pcmcia 模块会加载到内核中,内核则需要加载 sja1000 模块和 can_dev 模块。
can_dev 模块提供标准配置接口,例如用于设置 CAN 控制器的比特率。
Linux 内核的模块化概念通用适用于通过总线硬件连接 CAN 控制器的 CAN 硬件驱动程序,如 kvaser_pci。
建立虚拟 CAN 网络
如果你没有 CAN 硬件,我们可以搭建一个虚拟 CAN 网络进行测试。

激活 CAN 模块,linux 自带。
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
创建虚拟接口

然后我们安装一下工具包。
嗅探并过滤噪音
这里做一个完整的实验来模拟。
首先我们开一个终端来监听 can 线。
cansniffer -c vcan0

接下来我们发送噪音。
cangen vcan0 -g 10 -I 123 -L 8

如果我们想去除某个噪音,就可以在 cansniffer 窗口按 -(减号),然后输入 123 再按回车,ID 123 会从列表消失。

记录总线数据
找到可疑 ID 后,我们要把它录下来,这里使用 candump。
我们能看到多了一个这样的日志文件。

重放攻击
我们捕获到数据包后能发现如下,cansend vcan0 5A1#11223344 正是我们发送的数据。


当我们重放后,发现 CAN 线收到了信息,证明重放成功。
第四章:诊断与日志记录
DTC 诊断故障码
可以把汽车比喻为一个监测系统,我们发送一个不该发的包,或拔掉一个传感器,汽车就会在(PCM 动力控制模块) 上记下一笔,这就是 DTC。
RAM 存储(软故障):断电后擦除。
持久存储(硬故障):记载 PCM 上,支持掉电保护。
故障等级
Class A(确认故障):比如排放系统坏了,秒亮灯。
Class B(嫌疑故障):比如某个传感器报错一次,汽车不会立刻亮灯,会把这个故障存为 Pending(待定) ,接下来在几次行驶中又错了,他才亮灯。
Class C/D(轻微):可能只是提醒你去保养,或者根本不亮灯。
有时候我们测试完发现仪表盘没亮灯,不代表没触发故障,要用 03 指令去读有无 Pending 故障。
DTC 格式
DTC 是一种五字符的字母数字代码。例如,我们会看到像是 P0477 (排气压力控制阀) 和 U0151 (与约束控制模块失去通讯) 这样的代码。
第一个字节位置的代码代表了设置代码组件的基本功能。

当设置为 3 时,字节 2 既是 SAE 定义的标准,也是制造商特定的。最初 3 仅供制造商试验,但越来越多的压力推动将 3 标准化为标准代码。

撤了前两位,其他角色都是一对一的,参考 表 4-1 了解前两位分配方式。

暴力破解诊断模式
每个厂商都有自己的专有模式和 PID,通常可以通过"收购"的经销商软件、工具或暴力破解获得。
最简单的是CaringCaribou(CC)的开源工具。
自动事故通知系统
自动事故通知(ACN)系统是一种电话归属系统,主要用于联系车辆制造商或第三方,提供事件信息。
ACN 是每个制造商特有的,每个系统发送的信息也是不同的。

攻击视角
攻击者会盯上车辆的故障码(DTC) 和冻结帧(Freeze Frame) 数据,用来销毁证据。
冻结帧记录是故障发生那一瞬间的数据快照。因为记录有延迟,攻击者发送那种闪电式的工具,冻结帧根本抓不住,或者事后利用 0x04 指令清空记录,调查员就无法看出车辆是自然损坏还是被攻击。
当 DTC 当成雷达,反向探测漏洞
攻击者在车辆进行 FUZZ ,会把 DTC 当成反馈信号。
通过 0x08 模式 探测厂商私有的 PID(指令集),会发现很多意想不到的结果。