目录

固件提取的原理

通过调试连接提取

如何防范调试连接提取固件

使用夹具挂载Flash

使用编程器读取Flash

小结

参考


本文总结了目前最为流行的存储器固件提取技术,虽然在技术的层面上没有任何新意可言,但是确是少数以防守为目的进行的总结,可以更好地理解ECU的存储安全需求,制定更加合理的安全存储策略。

固件提取的原理

提取固件的技术大致可以分为两类:侵入式提取与非侵入式提取。”侵入“在固件提取中的具体涵义为”是否需要拆卸存储器“,如果不需要拆卸存储器,那么我们就将这类提取技术归为”非侵入式提取“,反之则归类为”侵入式提取“。

非侵入式有两种实现思路,一种思路是通过JTag、SWD等调试接口与设备建立连接,然后通过协议实现的数据读取功能实现提取;另外一种思路是通过夹具连接存储器管脚,将存储器变成树莓派等提取工具的外挂存储器,使用树莓派给存储器上电并提取存储器中的内容。

侵入式提取,即将存储器拆卸下来,通过读卡器或者编程器读取存储器内的固件。

通过调试连接提取

这种方式主要针对控制器的内置Flash,因为内置Flash没有直接向攻击者暴露管脚,物理拆卸难度极大,所以站在攻击者的角度考虑,通过调试提取的方式可行性最高。如下为通过调试接口提取STM32系列芯片存储器固件的原理图:

调试器(如JTag、Jlink等)通过调试接口与设备相连,实际的设备接线方式类似下图:

连接好设备之后,通过调试命令即可提取固件,如下为通过JTag提取固件的命令:

jtag> readmem 0x1fc00000 0x400000 flash.bin
address: 0x1FC00000
length:  0x00400000
reading:
addr: 0x20000000
Done.

需要注意的是,在线提取需要一些前提条件,比如设备release之后调试端口依然可用,并且调试连接的建立不需要password,以及控制器的读保护功能未开启。

如何防范调试连接提取固件

针对调试提取的方式,STM32自带的一种读保护机制(RDP)值得我们参考和学习。根据STM32开发手册的描述[1],STM32在内置存储器中划分了一篇选项配置区域,该区域用来配置STM32运行时需要用到的各种重要参数,其中就包含了对RDP的描述。RDP配置包含一个用来描述是否开启RDP功能的比特位,以及开启后保护的地址范围的字节信息。选项配置区域的写权限由管理员掌握的password保护,以保证该区域的安全性。

调试器与STM32建立连接后,会给STM32发送调试命令。当STM32收到读取存储器内容的命令时,首先会判断RDP位是否已经置位,如果已经置位,说明开启了RDP功能,在这种情况下STM32直接返回否定响应NACK,以拒绝调试器的读取请求。下图为STM32在USART协议中对读命令的处理流程:

通过相关安全研究人员的博客[2],我对STM32 RDP的代码层实现进行了求证。STM32中RDP的实现主要集成在bootloader之中,因为bootloader实现了各种通信或调试协议,因此理所当然地应该在这些协议中加入对RDP的判断逻辑。下图所示汇编代码包含了在USART通信过程中,当STM32收到读地址内容的请求之后,调用RDP判断函数的过程:

如下汇编代码包含了RDP的判断逻辑,该代码片段表明STM32从0x40022000获取了一个地址,然后以此为基址,取了0x1C偏移处的内容,通过LSLS移位和BPL跳转条件判断第二个bit位是否置位:

这个实现完全符合STM32开发手册中的描述,STM32使用选项寄存器FLASH_OBR的第一个比特位RDPRT控制RDP:

在设备的bootloader中实现RDP具备一定的开发成本,对于本身不具备RDP功能的设备,需要充分考虑安全需求和实现成本。如果成本受限但又必须考虑安全性,那么可以考虑直接禁用调试端口,或实现基于口令的安全调试。从安全的角度考虑我们应该直接禁用调试,但是从研发的角度考虑,我们在各个阶段都会存在调试需求,因此基于口令或证书的安全调试可能是一个不错的选择。

另外,STM32的开发文档明确指出了RDP是对”internal Flash“的保护,但是按照实际的实现逻辑,只要STM32的bootloader在收到读取指令时进行RDP的判断,理论上对外置存储器的读请求也会拒绝掉。STM32这么描述的原因,我猜测其出发点是保护的效果,因为对于内置存储而言,拆卸难度太大,最有效的提取方式就是调试连接,如果在调试连接中实现了RDP,可以说基本阻断了提取途径;但对于外挂存储器,还存在其他可行的攻击手段,比如通过夹具挂载Flash,以及拆卸Flash,禁用调试读命令完全达不到保护的效果。

使用夹具挂载Flash

使用芯片夹具挂载Flash,首先需要一个Host,可选的设备包括树莓派、Arduino等。另外,是否能够使用夹具挂载Flash,直接取决于芯片的封装方式。如果芯片的封装方式暴露了管脚,则可以很方便地使用夹具,如果芯片的封装方式完全隐藏了管脚,那么这种方式就失去了尝试的必要。从这个角度来讲,芯片的管脚也属于一种攻击面。另外,我觉得没有必要研究芯片具体采用了哪种封装方式,因为管脚是否暴露是肉眼可见的,如下图所示:

隐藏管脚的封装方式一般如下图:

针对暴露管脚的存储器芯片,使用夹具进行提取的接线方式如下图所示:

以使用树莓派为例,需要开启树莓派SPI,结合存储器芯片管脚的定义以及树莓派管脚的定义,将存储器挂载为树莓派的SPI Flash,然后通过flashrom工具从SPI Flash中提取固件[3]。

flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000 -r rasp.bin

因此站在防守的角度,如果我们能够控制存储器芯片封装的方式,那么最佳的实现应该是使用能够隐藏芯片管脚的封装方式。

使用编程器读取Flash

最后一种方式可能成本相对最高,但是理论却最为简单。首先需要购买一个编程器,然后使用热风机融化芯片焊锡,取下芯片之后放在编程器上,通过编程器对应的界面工具选择芯片型号,读取芯片内容,如下所示[4]:

为了防范通过编程器提取固件,我们可以选择加密存储的方式,或者依赖文件系统的NAND Flash,来增加提取原始固件的成本。

小结

因为提取固件的成本和难度相较于其他实验较高,本问相关内容均是参考其他研究人员的成果。但这并不妨碍我们加深对存储器攻防技术的理解,通过这种方式我们依然可以掌握攻击的原理,并且总结防守的方案。关于防守,除了文中提到的相关参考,在实际应用中需要更加细致的考虑,比如对内置和外置存储安全方案的区分,对不同代码、数据保护方案的细化,等等,希望读者结合项目实际灵活应用。

参考

[1] https://www.st.com/content/ccc/resource/technical/document/programming_manual/10/98/e8/d4/2b/51/4b/f5/CD00283419.pdf/files/CD00283419.pdf/jcr:content/translations/en.CD00283419.pdf

[2] Read secure firmware from STM32F1xx flash using ChipWhisperer - Prog.World

[3] 树莓派提取固件 | SkYe231 Blog

[4] unsafe.sh - 不安全

ECU存储安全之存储器安全相关推荐

  1. ECU存储安全之深入理解Flash

    目录 陌生的存储器 两种类型的Flash NAND Flash原理介绍 NOR Flash原理介绍 NAND与NOR的比较 NAND子类之EMMC 陌生的存储器 传统安全领域的工程师刚开始接触车联网安 ...

  2. python存储数据丢失的存储器是_数据缺失值的4种处理方法

    一.缺失值产生的原因 缺失值的产生的原因多种多样,主要分为机械原因和人为原因.机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未 ...

  3. 随机存取 随机存储_随机存取存储器(RAM)

    随机存取 随机存储 In random-access memory(RAM) the memory cells can be accessed for information transfer fro ...

  4. 计算机组成原理(3)三级存储 局部性原则 存储器性能指标 扩展 DRAM编址方式 cache 三种映射 替换策略

    三级存储 RAM,随机存储 ROM,只读存储 ,MROM,PROM不可编程,可编程 EPROM,E^2PROM 紫外,电 擦除 三级存储内存,cache,外存 局部性原则 时间局部性:一条指令或数据, ...

  5. python多进程存储数据丢失的存储器是_python查漏补缺 --- 模块、文件、异常

    有些知识学着学着就忘了,有些博客看着看着就想留言了,本片博客仅代表作者本人的观点,如有错误及疑问,欢迎提出宝贵的意见! 1.方法定义好之后,如,def test(x) : ,此时将方法名赋值给一个新的 ...

  6. 时代全芯卡位新型存储 聚焦PCM相变存储器

    2021开年,"缺货"."涨价"这两大关键词就博足了半导体从业人士的眼球.存储市场在这波氛围带动下,也迎来全面上涨.日经报道指出,老款的DRAM价格暴涨2倍,I ...

  7. 机器字长,存储字长,存储芯片的数据线,CPU的数据总线,MDR位数,MAR位数,存储芯片和存储器的关系。

    CPU总线的宽度=运算器的位数=通用寄存器的宽度=数据总线宽度 (字长:不加修饰的一般为机器字长) ------------------------------------------- 首先明确一点 ...

  8. 湖北IC产业分析:长江存储“搅动”存储器产业

    湖北,位于长江中游.洞庭湖以北,因为水网纵横,湖泊密布而被称为"千湖之省".如此充沛的生产资源对于每天都需要消耗大量水.电的集成电路产业而言无疑是一个巨大的优势. 事实上,凭借着天 ...

  9. 车用计算机内部结构图,ecu的基本组成结构 ECU的工作过程

    汽车ECU基本构造 1).输入回路 从传感器来的信号,首先进入输入回路.在输入回路里,对输入信号进行预处理,一般是去除杂波和把正弦变为矩形波后,在转换成电压信号. 模拟信号:是指信息参数在给定范围内表 ...

  10. 计算机组成原理读写周期波形图,第3章存储器层次结构-1讲述.ppt

    第3章存储器层次结构-1讲述 计算机组成原理 * 计算机组成原理 --存储器层次结构(1) 2016-3-18 几个基本概念 1.存储器:计算机系统中的记忆设备,用来存放程序和数据. 2.存储元:存储 ...

最新文章

  1. MySQL数据库实用教程考核_《MySQL数据库实用教程》郑明秋,蒙连超,赵海侠【pdf】...
  2. Openstack_通用技术_RPC 远程异步调用
  3. Linux crontab的使用方式,sh脚本的编写,sh脚本自动启动tomcat服务器,sh监控系统运行情况
  4. 超级计算机预测南方下雪,南方九省即将大雪纷飞?超级计算机:可能性增加,但还没有确定...
  5. 123. 买卖股票的最3佳时机 III
  6. 数据结构课程设计------扫雷游戏(升级版,可展开)
  7. SQL Server 内存泄露(memory leak)——游标导致的内存问题
  8. 【体系结构】共享SQL的理解
  9. 数据之路 - Python爬虫 - urllib库
  10. iOS-成为或取消第一响应者
  11. 揭密出席第九届中国云计算大会的专家—近20个国家学者共话云计算大数据生态、应用...
  12. Xcom传送文件实例
  13. 经纬度坐标转为上海地方坐标代码(js代码)
  14. Java异常 | JedisException: Could not get a resource from the pool
  15. 爱上一个人的七种表现
  16. 【媒体聚焦】“我们为什么要为景安点赞”——记景安网络十四年峥嵘岁月
  17. STM32+W25QXX实现模拟U盘-HAL库
  18. 检验电子邮件地址是否真实存在
  19. 美允许4G技术与WiFi共享5G频段;全球移动用户将达50亿│IoT黑板报
  20. Picker 选择器

热门文章

  1. 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 一
  2. 教你有效清理C盘空间不足的方法
  3. python中fact_python中fact函数使用
  4. java架构知识-分布式(学习笔记)
  5. 电脑系统或者office系列使用小马激活工具,电脑开机桌面出现假的Edge浏览器
  6. 风华散尽,葬送何言?伤感日志分享
  7. 如何在Oracle官网下载旧版本的JDK
  8. Echarts 3d地球toolstips实现
  9. Windows下批量合并文本文件
  10. windows10 共享视频到 Ipad