对奥迪Q8的FlexRay 中间人攻击

admin 2025年2月14日23:39:36评论8 views字数 2345阅读7分49秒阅读模式

Introduction

FlexRay 是由戴姆勒、宝马、摩托罗拉和飞利浦等公司组成的团队开发的一种不同的通信协议。它被认为比 CAN 更快速、更可靠,主要应用于奥迪、宝马和奔驰等欧洲品牌的较新车型。

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

对奥迪Q8的FlexRay 中间人攻击

由于总线采用时分多址接入(TDMA)技术,其调度机制不允许接收一条消息后,随意更改消息中的某些字节,再在任意时间将其重新发送。为了能够在数据包传输过程中修改任意数据,我们决定在消息通过总线传输时修改其中的单个bits

Audi Q8 with Driver Assistance package

在本项目中,我们选用了一辆配备驾驶辅助套件的奥迪 Q8。该套件包含自适应巡航控制和车道保持辅助系统(LKAS)。奥迪 Q8 与其他配备 FlexRay 总线的奥迪及大众汽车极为相似,主要区别在于驾驶辅助电子控制单元(ECU)并未与挡风玻璃上的摄像头集成在一起。Q8 配备了多个摄像头,这些摄像头均连接至驾驶员座椅下方的驾驶辅助 ECU。

为了实现对转向柱电子控制单元(EPS)的完全控制,我们决定在 EPS 一侧中断 FlexRay 总线,并将代理硬件置于 EPS 与汽车其余部分之间。通过这种方式,我们能够确保对进入 EPS 的所有信号进行精准操控。

FlexRay Dev Board

我们构建了一个FlexRay开发板,它使用了一个FPGA,四个FlexRay收发器和四个CAN收发器。对于FPGA,我们使用CYC1000,这是一款带有Intel Cyclone 10 LP的开发板。FlexRay收发器是英飞凌TLE 9222

对奥迪Q8的FlexRay 中间人攻击

传统的微控制器通常有定制的芯片来处理CAN和FlexRay消息的发送和接收。它们接收消息,检查CRC,并将结果放入寄存器中,供最终用户使用。然而,这种方式无法实现攻击所需的bit level操作。因此,我们决定使用FPGA并自行实现FlexRay的物理层。

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

对奥迪Q8的FlexRay 中间人攻击

Reverse engineering FlexRay messages

第一步是记录原装系统的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转向控制命令。转向数据每四个周期出现一次,最后一个字节似乎类似于子地址。有趣的是,我们关注的数据与 Volkswagen MQB 车辆的 opendbc 中已经定义的 CAN 转向消息 HCA_01 非常接近。

Modifying FlexRay messages

首先,我们从电气上对总线进行分割,并尝试将每条消息原封不动地代理过去。在FPGA中,我们实现了一个简单的电路,可以查看是否有数据从任何一侧进入。一旦第一个比特进来,我们就启用另一端的发送器并将其连接到接收器。一帧完成后,总线上有一点空闲时间,我们可以关闭发射机。那么这个过程从头开始。

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

对奥迪Q8的FlexRay 中间人攻击

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

当接收器匹配具有特定帧 ID 和周期计数器的头部时,我们在转发的同时更改数据包中的几个字节。我们还会即时重新计算 24 位 FlexRay CRC,并替换它。

在下面的截图中,您可以看到我们替换了 ID 为 65 的消息中的几个字节。

  • 字节24:在字节25至31上计算的校验和

  • 字节25:计数器

  • 字节26:请求扭矩

  • 字节27:扭矩符号,负值时为0x80

  • 字节28:使能标志。0x05已启用

  • 数据包末尾的24位FlexRay帧CRC

对奥迪Q8的FlexRay 中间人攻击

Conclusion

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

文中提到的相关库文件

  • Saleae Logic的FlexRay解码器:https://github.com/robbederks/FlexRayAnalyzer
  • 用于对FlexRay执行中间人攻击的VHDL代码:https://github.com/I-CAN-hack/flexray-interceptor
对奥迪Q8的FlexRay 中间人攻击
对奥迪Q8的FlexRay 中间人攻击
对奥迪Q8的FlexRay 中间人攻击

原文始发于微信公众号(安全脉脉):对奥迪Q8的FlexRay 中间人攻击

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月14日23:39:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   对奥迪Q8的FlexRay 中间人攻击https://cn-sec.com/archives/3742069.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息