中间人攻击如何绕过安全访问
创始人
2025-05-06 22:45:34
0

UDS(统一诊断服务)是一种广泛用于车辆诊断的通用协议,汽车制造商通过它与车内各类ECU(电子控制单元)进行交互,例如读取ECU状态、配置参数甚至更新固件。本文将通过硬件攻击演示,如何让未授权的诊断设备获取全部诊断功能权限。

Security Access

出于完整性和安全性的考虑,与ECU(电子控制单元)的关键交互必须仅限授权人员操作。UDS标准中为此专门设置了安全访问服务(Security Access)——这套基于挑战/响应认证机制的协议具体实现由汽车制造商自行决定。在本案例中,ECU会将随机数与车辆多个关键标识符组合生成挑战种子,发送给诊断设备(UDS术语中称为Tester)。诊断设备需使用密钥对该种子加密后返回响应。若响应值与ECU计算结果不匹配,诊断设备将只能使用有限功能;反之通过验证后,则可进行几乎所有交互操作。

若采用暴力破解密钥的方式,不仅耗时漫长,当制造商部署了防暴力破解机制时更是举步维艰。更何况,制造商特定的认证算法总会通过某些渠道流出。

更便捷的突破口在于:如果UDS服务器将认证响应检查委托给一个辅助芯片,并且通过明文通信链路(如SPI)进行交互,那么绕过认证可能会更容易。在研究案例中,运行UDS服务器的主芯片会通过SPI链路请求辅助芯片验证测试者的响应,这就形成了安全漏洞。

在认证验证过程中,辅助芯片与主芯片之间的最终通信报文(4)构成了单点故障:只要将该报文内容篡改为"OK"值,主芯片就会被欺骗,认为诊断设备已通过合法认证。

Serial link protocol MiTM

主芯片上的软件可视为白盒(可获得软件代码),但辅助芯片则不然。关于该辅助芯片,我们仅掌握以下信息:其在ECU板卡上的位置、制造商型号标识、以及公开的网络技术文档。其认证算法与密钥均属未知。

该芯片采用全引脚外露封装(与BGA封装类型相反),便于使用电子探针进行信号探测。

值得注意的是,该辅助芯片的多个引脚具有复用功能设计——单个引脚可能根据内部配置用于ADC、CAN、PWM、SPI等多种功能:用于SPI通信的引脚是在启动时动态分配的,而非物理固定。接下来我们将对其进行探测识别。

LOCATING PINS

根据SPI通信协议的定义,其传输必须依赖时钟信号。我们通过盲测所有引脚,最终发现一个持续产生8个周期性脉冲的信号。

SPI clock signal

成功捕获目标信号!该信号以4.8MHz频率呈现8个时钟边沿,完美对应传输所需的8位数据格式。通过查阅MCU技术文档并追踪此时钟引脚,我们准确锁定了承载MOSI和MISO信号的物理引脚。

MOSI线路发送了三个字节,而MISO同步发送它自己的数据。放大这个信号样本可以看出,软件协议将数据封装在128字节的帧内。这将通过分析主芯片上的协议栈来确认。进一步放大可以看到,128字节的SPI帧以一个300微秒的静默期间隔开来,在最高速率下也是如此。这似乎是主设备能够输出字节的最高带宽。观察到的最大吞吐量大约是1.7Mb/s,与现在的通信带宽相比,这相当慢。

SPI引脚的位置已经完全确定了。接下来,让我们在从设备的认证响应中翻转一个或两个位,以此来欺骗主设备。

Flipping one or two bits, easy no?

从技术上讲,我们试图在SPI链路上设置一个中间人(MiTM)攻击,特别是在从设备到主设备(MISO信号)的上游链路上。初步来看,MiTM装置由一个从SPI接收器和一个从SPI发射器组成,并且在这两者之间进行少量计算。

MiTM装置将从芯片发出的MISO信号解串,逐字节分析流,并根据其内部状态(由主设备时钟控制),推送相同的或修补后的字节到其上游链路。实际上,你知道哪个简单的芯片包含处理器和一个从SPI接口吗?当处理器与SPI接口配合使用时,它通常想要成为主设备,而不是从设备。实际上,存在一些便宜的现成装置,典型的如Arduino板或基于STM32的系统可以完成这项工作。它们功能上集成了处理器和一个从SPI接口。让我们开始编码吧。

记住第一次SPI时钟采样图中每个字节之间的520纳秒间隔。一个便宜的处理器运行得足够快,能够在SPI接收接口触发中断后处理几个字节,并在下一个字节的第一个位开始发射之前加载SPI传输寄存器吗?

根据经验在理想执行条件下,1.3GHz ARM SoC处理外部中断大约需要100纳秒:没有操作系统,单核专门用于此中断,预热缓存,最短的汇编代码中断处理路径。任何数据或代码缓存未命中都会大幅增加这个时间。更不用说处理器和外围控制器之间的I/O内存访问并不走同样的内存优化总线。相反,I/O总线(例如到SPI接口的总线)可能比内存总线慢得多。

在这种情况下,似乎不可靠的是,用一个廉价的SoC在大约500纳秒的时间窗口内读取输入字节、处理它并写出下一个字节。任何延迟的传输都会破坏协议并造成致命后果。

有人会争论说SoC可以轻松实现1Gb/s的吞吐量,而本案例中持续阶段的最大值仅为-可笑的-1.7Mb/s。但这些高吞吐量是通过绕过处理器执行路径,依赖于专用于批量内存复制的外部引擎(也称为DMA,直接内存访问)来实现的。这种解决方案在此研究中不可行,因为至少需要在一个128字节的SPI帧中动态修补一个字节,这意味着最少需要一些处理。

游戏结束了吗?不,解决方案在于接下来的四个字母:FPGA

HARDWARE DESIGN

FPGA(现场可编程门阵列)是一种高度可配置的集成电路,包含许多基本逻辑块。使用组合逻辑并在几纳秒内计时,这种解决方案在时间受限的情况下实现比特翻转似乎是合理的。

另一方面,作为一个软件开发者需要选择:

  • 编程语言,在所谓的VHDL和Verilog之间
  • FPGA厂商,比如Xilinx和Intel(前Altera),这意味着要使用其特定的设计工具(分别名为Vivado和Quartus)
  • 最终的FPGA开发板

编程语言的选择没有科学依据:快速搜索网络上适合新手的教程显示,用VHDL写的实现示例比Verilog多。

关于厂商的选择,主要是基于经验。开始基于VHDL的FPGA设计,使用Quartus套件。稍后再看FPGA板,现在开始编码吧。

初步来看,MiTM装置只需“简单地”在正确的时间注入一个或几个位,覆盖原始从设备响应。从概念上讲,这可以表示为SPI链路上的一个简单开关,在大脑连续监视传入比特流以检测覆盖点的控制下激活。

当然,这个基础电子组件,即多路复用器,即使是简单的双向两输入多路复用器,也会很快在VHDL中实现,即使是对开发者来说也是如此。此外,寻找16位模式(如上图中的'xy')的比较功能也应该能迅速实现。最后,一个在GitHub项目中至少可用的VHDL实现的从SPI组件,负责解串和重串字节。只需将它们全部混合在一起即可完成工作。

DESIGN SIMULATION

最终设计能够在测试平台的331个SPI帧(从真实的从设备活动中捕获)中检测到安全访问响应,在运行时对其进行修补,并修正所有CRC。

相关内容

热门资讯

滴滴注销多久后没记录 滴滴注销... 当您选择注销滴滴车主账户后,您的资料将会在三个月内保留。根据查询公开信息显示,滴滴车主的使用规则中规...
开车视线要怎样才正确 开车视线... 开车视线要怎样才正确开车视线要怎样才正确1、正确的坐姿决定视角。座椅的调节,保证臀部、背部抵住靠背,...
怎么判断电瓶缺不缺水 鎬庝箞鍒... 如何判断电瓶是否缺水?电瓶车电池缺水的表现可能不太明显,因此我们需要一些方法来判断。首先,可以通过平...
hongoi是什么牌子自行车 ... What is HONGOI Bicycle?HONGOI Bicycle is a brand o...
东风畅行是杂牌车吗 东风畅行是... 东风畅行绝非杂牌车,而是由知名的东风汽车集团有限公司精心打造的。作为该公司新能源乘用车商业化运营及模...
出租车收费是按人头算吗 出租车... 出租车的收费标准一般是按里程计价,而不是按人头算。出租车行业有着规范的管理,车上有专门的标记和出租字...
小马拉大车专门网站有吗 小马拉... 小马大车是一款由日本游戏公司发行的剧情类游戏系列。如果您想了解更多关于该游戏的信息,可以前往哔哩哔哩...
固满德轮胎是杂牌吗 固满德轮胎... 固满德轮胎不是杂牌,而是盾轮轮胎,属于中国生产品牌。它主要销往国外市场,如欧美、澳洲、中东、东南亚和...
兰州限行货车0.75以下 兰州... 2022年兰州对微型货车实施的限行新规如下:首先,对于核载0.75吨及以下的货运机动车,已取消每日高...
中石化洗车时间是几点 中石化洗... 中石化加油站的洗车服务时间通常安排在早晨9点至下午5点之间,这是为了满足广大车主在日间加油的同时,能...