【车联网】通过flexray中间人对奥迪Q8渗透

民生   2024-07-04 11:06   海南  

序言

FlexRay 是由戴姆勒、宝马、摩托罗拉和飞利浦等多家公司开发的一种不同的通信协议。它应该比 CAN 更快、更可靠。它主要用于奥迪、宝马和梅赛德斯等欧洲品牌的最新汽车。

与CAN相比,FlexRay协议在时序上严格得多。例如,来自所有 ECU 的消息都按照固定的时间表发送:每个 ECU 都获得分配的可以发送消息的时隙。在 Q8 上,FlexRay 总线的循环时间为 5 ms,因此每个 ECU 可以以 200 Hz 的频率发送消息。

由于总线使用时分多址 (TDMA),因此调度不允许接收消息、更改消息中的某些字节,然后在随机时间再次发送出去。

为了允许更改数据包中的任意数据,我们决定在消息通过总线传输时修改消息中的各个位。

奥迪 Q8 带驾驶员辅助套件

奥迪Q8。挡风玻璃上的三角形包含一个观察道路的摄像头,奥迪标志旁边的黑色方块是激光雷达,用于测量与其他物体的距离

在这个项目中,我们使用了带有驾驶员辅助包的奥迪 Q8。这包括自适应巡航控制和 LKAS。Q8 与其他配备 FlexRay 的奥迪和大众汽车非常相似,主要区别在于驾驶员辅助 ECU 没有与挡风玻璃上的摄像头安装在一起。Q8 有多个摄像头,全部连接至驾驶员座椅下方的驾驶员辅助 ECU。

对于这个项目,我们决定中断 EPS 侧的 FlexRay 总线,并将代理硬件放置在 EPS 和汽车的其余部分之间。这样,我们就可以确保我们能够控制进入 EPS 的所有内容。

FlexRay Car Harness FlexRay

二开发套件使用汽车线束与车辆连接。我们构建了一个概念验证,它是汽车线束的直接替代品,它利用 FPGA、四个 FlexRay 收发器和四个 CAN 收发器,可以被视为 FlexRay 汽车线束。

带有 4 个 FlexRay 收发器、4 个 CAN 收发器和 Cyclone 10LP FPGA 的线束板原型

传统的微控制器通常具有定制芯片来处理 CAN 和 FlexRay 消息的传输和接收。它们接收整个消息,检查 CRC 并将结果放入一些寄存器中以供最终用户使用。但是,这不允许进行此攻击所需的位级别操作。因此,我们决定使用 FPGA 并自行实现 FlexRay 的 PHY(物理层)。

FPGA 充当 FlexRay 和 CAN 之间的网关或桥梁。您将 CAN 消息发送到 FPGA,FPGA 存储接收到的数据,并在总线上传输消息时覆盖相应的 FlexRay 位。FlexRay 收发器用于分割 FlexRay 总线,然后代理两侧之间的消息(允许动态修改消息)。

FlexRay 拓扑包括 FlexRay 线束

逆向工程 FlexRay 消息

第一步是记录来自库存系统的 FlexRay 消息,以便我们分析消息并找到控制转向的字节。

在 FlexRay 总线上记录消息尚不需要 FPGA。我们只需将 FlexRay 线束上的 FlexRay 收发器的输出连接到逻辑分析仪即可。我们使用了 Saleae Logic Pro 16 分析仪,它可以达到 500 MS/s,但任何可以达到 100 MS/s 的逻辑分析仪都应该足够了。

手动解码 FlexRay 消息需要大量工作。不幸的是,Saleae 软件不包含 FlexRay 解码器。但是,您可以编写自己的解码器,因此我们为 Saleae 逻辑分析仪编写并开源了 FlexRay 解码器。

我们进行了几次驾驶,记录了车辆在不同状态下的情况(手动转向、LKAS 接合与未接合、LKAS 向左和向右转向等……),然后梳理数据寻找相应的模式。我们发现一个 ID 为 65 的帧,其中包含发送到 EPS 的 LKAS 转向控制命令。转向数据每四个周期出现一次,最后一个字节似乎是子地址。有趣的是,我们关心的数据与 opendbc 中已为大众 MQB 车辆定义的 CAN 转向消息 HCA_01 非常匹配。

由于 openpilot 已经支持使用此转向消息的车辆,因此即使 LKAS 未激活,我们也知道如何操作 FlexRay 总线上消息中的字节来控制 EPS。

修改FlexRay消息

第一步是对总线进行电气拆分,并不变地代理每个消息。在 FPGA 中,我们实现了一个简单的电路,用于检查是否有数据从两侧传入。一旦第一位进入,我们就启用另一侧的发送器并将其连接到接收器。一帧完成后,总线上有一点空闲时间,我们可以关闭发送器。然后这个过程从头开始。

以下逻辑分析器转储显示来自汽车的数据包被转发到 EPS,然后从 EPS 到汽车的数据包,然后从汽车到 EPS 的另一个数据包。

下一步是在 FPGA 上构建 FlexRay 数据包解码器。不幸的是,没有可用的开源代码,因此我们不得不从头开始编写 VHDL 代码。我们编写了一个块来处理单个数据包的接收。由于大部分流量只是转发,我们不需要处理任何唤醒和其他类型的特殊消息。

当接收器将标头与特定帧 ID 和周期计数器匹配时,我们在转发时更改数据包中的几个字节。我们还动态重新计算 24 位 FlexRay CRC 并将其替换。

在下面的屏幕截图中,您可以看到我们用帧 ID 65 替换了消息中的几个字节:

  • Byte 24: checksum computed over byte 25 through 31 字节 24:通过字节 25 到 31 计算的校验和

  • Byte 25: a counter 字节25:计数器

  • Byte 26: the requested torque 字节26:请求扭矩

  • Byte 27: sign of the torque, 0x80 when negative 字节27:扭矩符号,负数时为0x80

  • Byte 28: enable flags. 0x05 is enabled 字节 28:使能标志。0x05 已启用

  • The 24 bit FlexRay frame CRC at the end of the packet 数据包末尾的 24 位 FlexRay 帧 CRC

正在动态修改数据包。注意字节 24 到 28 和帧 CRC 已修改。

结论

我们构建了一个 Python 脚本来读取操纵杆,并使用 panda 将 CAN 消息发送到 FPGA,从而覆盖 FlexRay 总线上的相应位来控制 EPS。通过结合前面步骤的结果,我们能够用操纵杆控制转向。

这只是一个概念证明。要移植汽车,还有很多工作要做。如果您有兴趣将第一辆 FlexRay 汽车移植到 openpilot 并想要购买 FlexRay 线束,

该项目产生了两个开源存储库,这对于任何从事 FlexRay 研究的人来说都是有用的:

Saleae Logic 的 FlexRay 解码器:https://github.com/robbederks/FlexRayAnalyzer

用于对 FlexRay 执行中间人攻击的 VHDL 代码:https://github.com/pd0wm/flexray-interceptor

免责声明

由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!


道玄网安驿站
本号主推OSCP,vulnhub,车联网,红蓝对抗,挖洞,网络新闻等网络安全信息,喜欢的可以关注
 最新文章