故障注入Renesas RH850/F1L

文摘   2024-07-23 17:25   上海  

“利用电压瞬变技术破解汽车电子控制单元中16字节ID码认证,以提取固件。


引言

     在上一篇博文中,我们探讨了如何通过电压瞬变技术绕过STM32F4系列微控制器上的读保护功能。在本篇博文中,我们将介绍针对一款汽车电子控制单元(ECU)进行的安全研究,其中我们使用了电压瞬变攻击成功提取了固件。目标ECU搭载的是Renesas RH850/F1L系列微控制器,该控制器具有受保护的调试访问权限。


目标侦查

     本次安全研究的目标设备是一款车身控制模块(BCM)汽车ECU。在汽车中,BCM负责控制车窗/后视镜的电力操作、防盗系统、中央锁等。此次安全研究的主要目标是从ECU中提取固件,并获取任何机密信息,如私钥等。我们尝试通过CAN接口提取内存内容,但发现它受到安全访问保护。

     随后,我们拆解了ECU以分析印刷电路板(PCB)及其组件。ECU内含有Renesas RH850/F1L系列微控制器。我们首先检查是否存在开放的调试端口。通过Renesas E1调试器和一些焊接工作,我们建立了与目标设备通过JTAG引脚到测试电脑的连接。我们遵循了Renesas闪存编程器用户手册(https://www.renesas.com/us/en/document/mat/renesas-flash-programmer-v315-flash-memory-programming-software-users-manual)中的步骤,提示我们输入16字节的ID代码,如下所示。

ID代码认证代码提示

     我们尝试了一些常用代码,但均未成功,导致出现“认证代码不匹配”的错误信息。

认证码错误

     由于调试访问被锁定,一种可能的绕过方式是通过注入故障攻击。有许多公开的研究表明,注入故障攻击被用来绕过调试保护。有一项特别针对Renesas微控制器的注入故障攻击,是由Willem Melching执行的,他针对的是一个汽车ECU,虽然串行编程接口本身被禁用,但他通过注入故障成功绕过了保护。我们的目标有所不同,因为串行编程并未被禁用,而是受到ID代码认证的保护。另一项研究是Franck Jullien对Renesas RX65进行的,其架构、启动ROM和调试协议(单线FINE)与RH850不同。

     数据手册指出MCU有三种运行模式,其中之一是串行编程模式。启用串行编程模式的设置在数据手册中有说明。将FLMD0引脚拉高可使我们的目标进入串行编程模式。

     文档(https://www.renesas.com/us/en/document/mat/list-mcus-supported-renesas-flash-programmer-v3?)所述,RH850在串行编程模式下使用 2 wire UART 进行串行连接。连接图在此处(https://www.renesas.com/us/en/document/mat/pg-fp6-renesas-flash-programmer-additional-document-users-manual-recommended-circuits-connecting?)提及。我们使用USB到串行转换器与目标设备连接。我们还接上了逻辑分析仪来分析Renesas闪存编程器与目标设备之间的通信。

     串行编程模式对我们来说很有趣,因为解码串行通信命令要容易得多,这有助于我们理解调试协议的工作原理,以及找到潜在的漏洞。这也将使我们能够开发用于注入故障的软件。


2 WIRE UART - 协议分析   

     如上所述,RH850在串行编程模式下使用 2 wire UART。我们将逻辑分析仪连接到通信线上,分析了通过Renesas闪存编程器GUI尝试与目标连接时PC和目标之间的通信。我们执行了RFP用户手册中提到的所有操作,并分析了通信情况。

     以下是我们观察到的情况:

    • 通信形式为具有预定义包结构的命令。

     • 每个命令以0x81或0x01字节开始,接着是命令的长度。

     • 每个命令以常量0x03结束,前面是一个1字节的校验和。

     RFP工具发送和接收一系列命令,其中主要命令如下:

RFP工具首先发送一系列零,看设备是否响应。接下来,RFP工具请求设备信息,最大和最小输入频率,MCU支持的最大和最小子系统时钟频率。RFP工具然后发送由用户设定的主时钟频率。设置串行通信的比特率(9600)。检查串行编程是否启用。如果串行编程已启用,RFP工具将发送用户输入的16字节ID代码。

     下图显示了ID代码检查命令,其中用户输入的16字节密码(全FF)通过串行线传输。

分析逻辑分析仪中的命令

     我们获得了RH850开发板并读取了内存(代码闪存和数据闪存),以了解相同的命令,这通常是在ID代码认证成功后执行的操作。一旦获得肯定响应,RFP工具读取设备ID,然后根据用户指定的区域读取内存。我们注意到的一件事是,内存是以块的形式读取的。RFP工具发送需要读取数据的起始和结束内存地址。数据接收后,地址递增,再次发送命令。


RH850电源电路

     对于电压瞬变攻击,我们需要针对MCU的电源供应。每个微控制器都有专门设计的电源管理和调节系统,用于为内部电路、外设等供电。RH850/F1L的电源方案如下图所示。

RH850/F1L电源方案

      MCU内部电路分为两个独立的电源域,即始终开启区域(AWO)和隔离区域(ISO)。每个电源域都有单独的电压调节器。从电源方案可以看出,AWOVCL和ISOVCL引脚直接访问内部电压调节器。这两点可以被视为注入故障的注入点。

      我们选择了ISOVCL作为故障注入点,因为根据电源方案,ISOVCL负责管理闪存的电源。


故障设置

硬件设置

      每个系统都有专为维持适当工作电压而设计的组件,例如去耦电容。电压瞬变的一个挑战/要求是修改/破坏硬件电路以克服这些组件提供的保护。这包括移除某些组件或用自定义组件替换它们,以及选择故障注入点。

      正如上面所提到的,我们选定了ISOVCL作为故障注入点。ISOVCL上的去耦电容被替换,这会增加我们故障对目标的影响。选择的值是基于全面研究,以确保得到所需的故障。

      我们使用Chipwhisperer Lite(CW)(https://rtfm.newae.com/Capture/ChipWhisperer-Lite/)生成目标所需的故障。CW上的故障器软件与目标串行通信。CW的故障输出连接到故障注入点。硬件设置如下图所示:

故障设置

故障器软件

      我们需要绕过目标上的ID代码认证以提取其固件。ID代码检查命令发送用户输入的16字节代码,如果ID代码匹配则授予调试访问权。因此,我们需要针对ID代码检查命令。

      下面是一个故障器软件的框架:

def send_IDCodeCheck_command(){    # 向目标发送16字节ID代码    # 读取响应并返回它    cw_inject_glitch(glitch_parameters)  # 使用提供的参数注入故障    return response}main(){    while(1){        reset_target()  # 重置目标        send_initial_commands() # 发送同步所需命令,设置比特率,主时钟频率等        response=send_IDCodeCheck_command()        if response == positive:            read_device_id() # 读取设备id            read_memory()# 分块读取内存区域            exit()        else:            continue    }}

对目标进行故障注入

      一旦硬件和软件故障设置完成,我们运行设置以获得初步表征。电压瞬变的关键参数是 - 故障偏移、故障宽度和故障电压。在示波器上观察故障,以关联软件故障参数与实际故障影响。根据每次运行获得的表征结果,逐步缩小故障参数范围。

      在获得初步表征后,我们替换了故障注入点的电容,以获得更精确和理想的故障。即使经过几次故障周期运行,我们仍未获得任何有效结果,所以我们决定更深入地研究故障参数。我们注意到,故障电压水平没有精确地按照要求变化。使用Chipwhisperer Lite时,我们无法精确控制故障电压水平。因此,我们修改了CW中的电路,允许我们更精确地控制故障电压水平,如下图所示。

      经过多次故障运行,我们确定故障宽度应在100纳秒以下,并且应在ID代码检查命令结束时立即注入故障。


成功注入故障

      在修改后的电路到位,并微调故障参数后,最终故障成功,我们获得了一些数据。下图显示了故障成功的地方,成功读取了设备ID,如下所示。

      其中一项观察结果是,一旦绕过了ID代码认证,每个内存读取命令就不再需要进行身份验证检查,无需进一步认证即可读取所有内存区域的数据。但是,整个内存区域的数据不能仅凭一次成功的故障注入就读取完毕,因为目标在读取内存的过程中会停止响应,所以需要多次故障注入才能从整个内存区域提取数据。然而,与STM微控制器相比——如前一篇博文中所述,每个内存读取命令都需要绕过认证——我们的目标MCU(RH850)所需要的故障注入次数要少得多。

      如上所述,2线UART协议通信是通过一系列命令实现的。一旦从代码闪存和数据闪存中提取了全部数据,我们比较了接收到的数据的校验和,并去除了RFP工具使用的命令元数据,将数据打包成二进制文件,如下图所示。

RH850代码闪存

      在提取了代码闪存和数据闪存之后,我们继续对二进制文件进行逆向工程,以寻找其他漏洞或获取其他机密信息,比如密钥等。


结论

      在这篇博文中,我们展示了如何使用电压瞬变攻击从受读保护的微控制器中提取固件。以下是关键发现的总结:

       成功绕过了16字节的ID代码认证,从而提取了固件。
      • 对固件进行逆向工程后,我们获得了用于解锁安全诊断服务的秘密密钥。
      • 随着安全访问权限现在被绕过,我们能够控制车辆行为。




安全脉脉
我们致力于提高车联网安全的意识,推动行业发展,保护车辆和驾驶者免受潜在威胁的影响。在这里可以与车联网安全领域的专家和爱好者分享知识、深入思考、探讨标准法规、共享工具和讨论车联网热点事件。
 最新文章