渗透低性能智能设备的关键技术-固件提取

近十年,随着传感器技术、无线通讯技术的迅速发展,愈来愈多的物联网产品出如今咱们的视野中,Gartner预测,到2020年,物联网设备的装机量将超过200亿,但不少物联网设备受到成本、研发人员安全素质等因素的限制,存在大量的安全问题。例如2016年末的Mirai事件,就是由于弱口令和未修复的设备漏洞引发的。物联网终端的安全,也愈来愈受到人们的关注。算法

2017年10月,物联网安全研究人员渗透进了某智能灯泡,获取到了Mesh网络内传输的WiFi信息(包括WiFi密码)。尽管在该案例中WiFi密码被加密,可是研究人员依然经过获取设备的底层固件,获得了加密算法和密钥信息,最终获得了明文的WiFi密码。固件提取进而分析固件是攻击者常见的渗透手段,反之若是厂商想要生产出高安全级别的智能灯泡,第一步就是要防止固件内容被窃取。编程

接下来,咱们对此次案例作个简单的分析,而后进一步分析固件提取原理和过程,最后总结在现有的技术背景下获取固件的方法和相应的防御方法。为了描述方便,咱们把这种获取固件的技术称为固件提取。安全

案例回放

文章中提到的攻击,能够分3步:网络

1.利用单片机和支持IEEE 802.15.4无线通讯的模块来抓取6LoWPAN流量中的数据,提取出WiFi信息(此时加密的)。工具

2.经过提取固件、分析固件,分析出其采用的是AES加密算法,并提取出加密密钥和初始向量等信息。性能

3.根据2中获取的信息来解密获得WiFi密码。ui

这是一个典型的针对家庭局域网络内的嗅探攻击。从此的物联网设备将有一大部分是做为Mesh网络节点存在,只不过网关多是手机、路由器、笔记本电脑等一切具有蓝牙、ZigBee、WiFi等无线联网能力的设备。基于现有的网络来看从此的物联网,设备若是想要具备联网能力,则必须利用至少一条有线或无线的通道链接到互联网。若是是经过WiFi链接,必要的信息就是WiFi的SSID和密码。加密

案例中,攻击者经过分析固件获得了解密WiFi密码所需的信息——加密密钥和AES初始向量。那为何研究人员能够获取到固件呢?下面咱们将分析固件提取的原理,而且分析在现有的技术背景下,提取低性能的物联网节点上的智能设备的固件方法。翻译

固件提取的原理

咱们已经理清楚了攻击的方法,本次就针对其中重要一环——固件提取,谈一谈固件提取的原理,进而总结现有的固件提取方法。设计

以STM32F103系列单片机为例。该单片机基于ARM Cortex M3内核,片内带有64KB的Flash和20KB的SRAM。单片机读取程序到SRAM再进行译码。目前已知的有两个地方会存储须要运行的程序:

1.单片机内的Flash/ROM。

2.单片机外挂的Flash/ROM。

对于存储器来讲,读和写的操做是最基本的,即:必然存在一种方式,能够把存储器中的数据读取出来。若是读取的数据是单片机须要翻译的机器码,那么咱们就把读取的过程叫提取,把要读取的数据称为固件。

stm32f103c8t6单片机的片内Flash的地址是0x08000000-0x0801ffff(如上图所示),总共64KB。若是要提取出固件,有必要了解代码是如何烧写进芯片内的Flash区域里面的。

在开发过程当中,会有以下过程:

1.搭建好编译环境,编写程序代码(通常采用高级程序设计语言,如C语言),编译、生成可执行文件。

2.搭建好烧写环境,把可执行文件传到单片机芯片中,使单片机上电能够运行。

编译环境就是用把单片机C语言程序编译成汇编、机器码等,生成16进制hex文件或者二进制bin文件,一个编译器便可。烧写环境就是把机器码下载到上图的Flash区域的过程当中所需的工具,包含J-link、U-link、ST-LINK(stm32单片机专用)等硬件工具和STVP、mcuisp等软件(使用一套软硬件便可)

请注意,烧写、下载、上传、提取这四个词,说白了,就是对Flash区域读写的过程。目前发现两种读取固件的方式,第一种是依托于生产厂商固化在芯片内的bootloader,把Flash中的固件读取出来,第二种是经过调试接口把固件读出来。第一种须要bootloader支持,并且通常是支持的。第二种是依靠硬件调试工具直接读取,在前面的案例中,研究人员经过PCB上保留的JTAG调试接口,把固件读取了出来。

篇幅所限,读取过程当中的交互细节很少介绍,直接介绍两类固件提取的工具和方法,一类是以stm32单片机为例的单片机固件提取的工具和方法,一类是外挂Flash形式的Flash固件提取的工具和方法。

单片机片内Flash的固件提取的工具和方法

单片机固件提取方式有两类,一类是经过bootloader读取,一类是经过调试接口读取。

利用bootloader提取

经过串口,把芯片和电脑相连,运行mcuisp软件,点击读Flash便可。

mcuisp软件一般被用来经过串口通讯下载固件到单片机。串口通讯也是通讯技术的一种,目的是实现芯片A到芯片B的数据传输,是芯片之间常常用到的通讯方式。例如:若是个人目的是把程序代码“abcd”传输到芯片A中,可是,我仅仅经过电脑与没有bootloader的单片机进行串口通讯,“abcd”是没办法直接储存到Flash区域的,必须在单片机内部写好一段代码,在“abcd”已经经过串行接口,一个一个的到达单片机内部的缓冲器时,把 “abcd”一个一个的转存到Flash区域。这样就实现一种电脑直接写入“abcd”到Flash的假象,达到用户无感知或是透明传输的效果。提取固件的过程相反与上述过程相反,只须要利用bootloader把Flash的内容经过串口通讯发送给电脑便可。

利用硬件调试接口提取

在开发单片机程序时,会用到硬件调试工具,实现单步运行来查看程序实时运行的效果。通常能够经过下面两类调试接口,把Flash中的数据读取出来。

(1)SWD接口,利用硬件:J-LINK OB或者J-LINK或者ST-LINK;利用软件:J-LINK驱动程序自带的J-FLASH或者ST官网提供的STVP。

(2)JTAG接口,利用硬件:J-LINK;利用软件:J-LINK驱动自带的J-FLASH。

若是找不到串行接口,能够用这种方式,固然,前提是产品电路板上能够引出这两类接口之一,不然只能取下芯片了。

单片机片外Flash的固件提取工具和方法

做为一个存储器,上电以后不可能本身就把数据显示给咱们,就好像U盘买回来,得插电脑上,加载完驱动才能读取到里面的数据。对于片外Flash,须要把Flash芯片从产品的电路板中取下来,再放到另一个带有MCU的电路板上来读取数据。万能的淘宝提供了编程器,方便了对众多Flash芯片的内部数据的提取。

这种方式有两个缺点:一是比较暴力,须要把Flash芯片从电路板上取下来,再把Flash芯片放到编程器上面,利用配套的PC端软件,把固件读取出来。二是Flash芯片型号须要获得编程器的支持。那问题来了,若是这个编程器不支持个人Flash的型号呢?那就本身写个单片机程序把程序读出来吧。通常,在大学本科修读电子信息工程、通讯工程或自动化专业的,有独立硬件项目开发经验的同窗,均可以独立实现。

防御措施

介绍了这么多提取固件的工具和方法,那如今有哪些方法能有效防止产品固件被提取出来呢?

针对单片机固件提取的防御:咱们能够经过编程的方式,把内部Flash区域设置为读保护状态,这样只要不对MCU进行解封,利用显微镜对内部Flash的电平状态进行破坏,是很难篡改固件的,至于读取固件,基本上不可能。例如,咱们对stm32单片机的RDP寄存器进行设置,使内存保护等级提高至level 2,或者把重要的程序和数据利用PCROP功能保护起来,防止读取。

对外挂的Flash内的固件,目前,就本人所知,只要能取下来,得到型号,就能够获得固件。那问题就变成了:如何不让攻击者把Flash安全地取下来?我建议硬件设计工程师把PCB上的Flash芯片,依靠电路设计保护起来。例如:设计Flash芯片在线检测电路,一旦Flash芯片的引脚出现断线,则马上发动强电压攻击,将Flash芯片破坏,防止攻击者读取出Flash芯片中的固件。

总结

咱们经过分析固件提取的原理,介绍固件提取可用的方法和工具以及相应的防御措施,但愿可使更多的电子工程师、嵌入式软件工程师重视智能设备固件的保护。同时,咱们但愿这篇文章能够给物联网安全从业人员带来一些物联网设备的防御建议。但愿在智能设备开发工程师和安全测评工程师的共同努力下,咱们身边的智能设备变得愈来愈安全。