使用CANoe等工具刷写时,开发环境后台帮助我们完成了很多工作,平常大家很少注意这背后到底发生了什么。下面就来看看整个刷写流程。
刷写过程定义了刷写前、刷写中、刷写后三个阶段,负责将正确的刷写文件(S19或者HEX)下载到ECU中。
默认状态下ECU在01默认会话中,使用UDS会话切换(1003)进入拓展会话。
整车厂通常会定义一些控制器刷写的前提条件,比如车速要低于3km/h等,这一步就可以检查刷写前提条件是否满足。不同的OEM/Tier1可能有不同的检查条件。常见的前置条件如下,
具体实现上,使用31服务执行检查编程条件的例程routine,如条件不满足(比如车速过高等),则退出刷写。
刷写过程中,控制器功能不正常,可能不能收发总线消息,这种情况下,需要避免在这个过程中触发故障码存储。使用85诊断故障码设置服务设置故障码设置类型为OFF(02)关闭DTC的存储。
刷写过程中,因为传输的数据较多,因此停用通讯报文的发送可以降低总线负载。
使用28服务关闭与诊断无关的报文,将节约出来的通信资源用于刷写软件,提升刷写速度。
刷写中首先进行身份认证,而后可以写入指纹,然后执行刷写擦除内存,向指定地址下载固件,并检查写入是否正确。
刷写过程必须要在编程会话中才可以进行。使用会话控制服务1002切换到programmingsession。
27安全访问服务保证是有权限的人员或者设备才能够进行刷写,安全访问服务子功能请求种子向ECU请求安全认证种子。
诊断设备收到种子后,将种子作为输入,使用双方已知的算法,计算得到Key。然后使用子功能发送秘钥将计算得到的秘钥发送给ECU。ECU使用相同的算法计算出秘钥并与收到的值进行对比,相同则认证通过。
在向ECU的内存区域下载数据之前,需要先擦除内存区域已有数据。
采用31例程控制服务FF00擦除内存,根据控制器地址空间分配和芯片擦除能力,单次擦除所有或多次分段擦除。
3101FF00擦除起始地址擦除长度
向ECU传输软件之前需要指定写入的地址和数据的大小。
刷写设备使用34请求下载服务向ECU指定刷写起始地址和刷写数据的大小,请求下载($34)服务指定的内存从起始到结束应该是连续的。如果不是连续的,刷写设备应该为每个要刷写的数据块发送一个单独的请求。
34数据格式标识符地址和长度格式标识内存地址内存大小
软件下载服务,将数据下载到上一步指定的内存中。
刷写设备使用36传输数据服务向ECU内存区域中传输刷写的数据,一个数据块通常需要多条传输数据服务传输。
36数据块顺序计数器数据
37服务退出当前连续内存区域的刷写,将在肯定响应中携带校验和,校验最近的一条请求下载请求服务指定的内存区域。
返回的校验和与刷写设备计算的校验和进行比较,如果不相同,将重新使用36数据传输服务下载数据,多次校验不通过,刷写将会中断。
检验刷写的数据的可靠性,在软件/数据刷写完毕时,刷写设备通过例行程序服务来验证刷写到内存区域的每块数据是否成功。
使用31例程控制服务FF01确认刷入的软件和ECU的硬件,基础软件是匹配的。
整个刷写完成后,刷写设备要求ECU硬件复位,ECU进入应用程序。
11复位服务重启ECU,使刷写的新软件生效。
刷写后的步骤与刷写前的步骤是对应的,启用刷写前禁用的通信等。
此时网络恢复到正常的模式,ECU以默认的波特率进行正常的通信,并能进行故障码的检测和存储。刷写结束后要求各ECU恢复非诊断消息的发送及接收。
默认状态下ECU在01默认会话中,使用UDS会话切换(1003)进入拓展会话。在拓展会话中,启用非诊断通信、清除刷写阶段产生的故障码、各ECU恢复故障码的检测。
使用28通信控制服务启用在刷写前停止收发的一般通讯报文。
恢复故障码检测,使用85诊断故障码设置服务设置故障码设置类型为ON(01)恢复DTC的存储。
从拓展会话切换回默认会话。
刷写中最主要的安全维修就是安全访问被突破,而后就能获取ECU中的软件/数据以及刷入篡改的固件。
安全访问算法一般采用对称加密算法,通常还是简单的移位算法,算法强度较低。
故障注入:算法大部分主机厂自己设计实现的,算法本身的安全性很少验证。使用故障注入等方式存在被绕过认证的可能。
泄露:主机厂/供应商代码、企标等在互联网上泄露。
易被逆向:seed2key一般以so文件存在,对固件、诊断仪中的库文件逆向得到安全访问算法。
配置问题:Key的有效长度过短,CVE-2017-14937安全气囊安全访问(SA)Key为2个字节,第一个字节恒为0x01,那么气囊点火算法只有256个可能的密钥对。
除了算法本身以外,最重要的就是安全常量。安全常量通常为4个字节。
安全常量硬编码:安全常量硬编码在so库中,逆向安全访问算法得到安全常量。
默认:使用默认的安全常量,在渗透测试中曾多次遇到,0xc541a9是最常见的安全常量。
使用相同常量:使用同一种算法的ECU依赖于不同的安全常量来保障安全性。不会因为一个模块算法和常量被分析出来之后,直接影响到另外一个模块上。此外,同一车型同一类型ECU的常量通常相同,很少有实现一机一密的。
1staticuint32UDS_GenerateSeed(void)2{3uint32u32LocalSeedValue;45u32LocalSeedValue=STM0_TIM0.U;6u32LocalSeedValue^=UDS_ku32LocLevel01;7u32LocalSeedValue=(u32LocalSeedValue<<7)|(u32LocalSeedValue>>24);89returnu32LocalSeedValue;10}种子随机性:种子随机性较弱,多次请求出现相同种子的情况。
固定种子:每次获取到的种子相同,这使得爆破出Key成为了可能。
种子恢复:ECU复位后种子相同,每认证一次后复位一次,能够有效降低爆破的数量级。
由于CAN广播传输的特性,任何节点都能接收到发送的消息。当下载固件时,如果固件没有加密传输(在请求下载中指定为不加密),持续监听总线,当执行ECU升级时,能够监听获取到固件。
经过认证后,通过篡改固件或发送伪造消息启用需要额外付费的功能。
使用非对称算法:使用29服务替代27服务,29服务支持非对称算法,安全性能够得到很大的提升。即使算法泄露,也不会造成影响。
安全常量采用安全存储:自行实现的对称加密算法安全常量通常硬编码在so库中,容易被逆向出。安全常量应采用安全存储。
算法逻辑安全:ECU复位后,产生的种子每次都一样,应避免采用类似缺陷的算法;敏感功能都受到安全访问保护。
安全配置:Key的有效长度能够有效防御暴力破解等;刷写前置条件健全,在特定条件下方能执行刷写流程。
安全启动:应用安全启动,当安全访问被突破后,拒绝启动刷入经过篡改的固件。
安全传输:固件采用加密传输,请求下载数据传输标识指明为加密传输,并对应使用加密固件。
监测:检测潜在的攻击,及时阻断。
还原:检测到被篡改,通过备份、云端等信息恢复。
ISO14229Unifieddiagnosticservices(UDS)—Part1
XXXXECU刷新规范
汽车安全
Bootloder开发方案(基于UDS)
基于UDS的ECU软件刷写流程
UDS诊断服务基础篇之27
CANoe中使用CAPL刷写流程详解(Trace图解)
【VCU】详解S19文件(S-record)
SREC(fileformat)-Wikipedia
IntelHEXfileformat
IntelHEX-Wikipedia
us-18-Milburn-There-Will-Be-Glitches-Extracting-And-Analyzing-Automotive-Firmware-Efficiently