目录
1.修bug修出的灵感
2.串行编程接口协议
3.毛刺攻击
4.RH850 串行编程模式
5.小结
1.修bug修出的灵感
ECU量产后通过密码控制来防止通过Debug口读取Flash的程序和数据。
这是应该是共识了,但是这样做真的就万无一失了吗?
最近解决了个问题:连接调试器后如果memory窗口是非法地址,则Flash无法正常编程。
在逻辑分析仪的帮助下发现调试器会周期基于某调试协议(例如SWD\JTAG等等)与芯片进行通信,如下图所示:
既如此,只要了解到芯片厂自带编程上位机与芯片的通讯协议,就可以探探通过密码ID来控制调试接口的方式是否真的没有后门。
前篇文章《汽车信息安全--攻破SecOC,就在今天!-CSDN博客》提到攻破SecOC的前提是先要提取ECU固件代码并审计。
因此我们基于此来看看如何提取固件代码。
2.串行编程接口协议
芯片为RH850 P1M-E,在调试接口必须授权访问的情况下,我们考虑该芯片的另外一种运行模式:
它针对Flash的串行编程(Serial Programming mode)有两种推荐环境,如下:
E1大家很熟悉了,用RH850的都逃不开它,主要用来调试,这里也可以在串行编程模式下当做刷写器用;PG-FP5则可实现对该系列MCU Flash的擦除、编程和验证。
在物理硬件上我们可以看到连接方式包括单线串口、两线串口、CSI接口,如下图:
首先用PG连接受保护ECU,发现进入串行编程模式确实被禁用了,如下图:
这个Command和Response就和之前碰到问题很像了,那这些指令到底是什么意思呢?
RH850没有找到相关资料,但是在RA System Specifications for Standard Boot Firmware找到了一些端倪。例如,使用Flash Programmer读取过程如下:
对应的命令帧格式如表所示:
SOH表示帧起始数据,紧接着两个byte为实际数据长度,第4byte为命令,SAD4byte为首地址、EAD为终止地址,紧接着就是校验和,最后一个byte为帧结束数据,固定0x03。
MCU端响应帧格式如下:
结合上面实际连接受保护ECU的错误响应和文档对比,DC确实为串行编程使能
这就是说瑞萨针对这块的功能复用程度是比较高的。既如此,反正命令只有一个byte,找个P1M-E的芯片挨个试一下,总能找到端倪。
于是乎,我们就可以看到如下波形:
掌握到命令及状态码后,我们接下来就要看看,到底MCU是在什么返回禁止连接的错误码?在RX651手册里,找到了PC和MCU建立连接的流程图:
第a-d步,是正常指令阶段,但是在e步等待同步指令时,我们发现了在这个位置是有权决定返回“Connection of serial programmers is prohibited"。
那有没办法影响MCU跳过这步,直接进入(3)?那是肯定的,使用电压\时钟毛刺攻击。
3.毛刺攻击
所谓电压毛刺攻击,是故障注入的一类,它的作用就是绕乱CPU的运行,让CPU到正常范围外取指。
举个例子,在这样一段代码里,理论上是不会通过串口打印出字符的,
void test(void)
{
uint8 a=1;
gpio_tiggerlow();
while(a!=3);
printf("you can hack me ")
}
但是通过电压\时钟让CPU超频、超温等,就有可能导致CPU运行乱序(想想我们电脑过热蓝屏)。
因此,如果能通过电压毛刺跳入上述流程图正确分支,那么连接这一步就成功了。
那么我们在同步命令的帧结尾注入毛刺,实现了连接,如下:
4.RH850 串行编程模式
P1M-E 要进入串行编程模式,就必须要将FLMD0拉高,如下图:
以两线串口为例,用E1或者PG-FP5通过FPDR、FPDT就可实现与芯片的通信,既然都是串口了,协议也已经解析出来,因此只需要拉高FLMD0,连接JP0_0\0_1,模拟下发指令,数据是否就可以读出来。
5.小结
上述这个例子,就是2021年某日系车EPS被攻破的全过程,从固件提取再到SecOC密钥提取,可以明显发现OEM还是采用功能堆叠的方式来对待汽车信息安全。
信息安全急需引起重视,对这块理解传统汽车人很难做到全面,很多OEM天真以为只要开启芯片的读写保护就可高枕无忧,有些甚至认为只要不暴露Debug接口就可以做到保护;但是对于攻击者来说,只要肯花功夫掌握一些芯片内部知识,任何对外暴露的接口都可以作为攻击点。