物联网设备固件的安全性分析

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了物联网设备固件的安全性分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

存储位置

物联网设备的安全问题,本文将围绕固件的存储方式、获取方法和护方法来呈现物联网设备固件的安全性。

仅仅知道固件在存储器中,也是不够的,还应该知道固件在存储器的哪个部分。因为存储器中的数据是根据地址来读取和写入的。 “有心人”必须知道物联网设备固件被厂家写入的地址,才算完整地获取到固件的位置信息。一般,固件在主板上存储的方式,可以简单分成两类:集成式和分离式。

集成式固件存储:当设备的功能比较简单,不需要运行复杂的操作系统或者集成复杂的协议栈,也不需要足够强的计算性能,一般厂商会把固件集成到他们的主控芯片中,以节约成本。暂且把这类设备称为弱设备。主控器厂商(如ST、Nxp等)把系统正常运行所需的内存(Ram),硬盘(Flash等可重复擦写、掉数据不丢失的存储器),CPU(计算核心)和外围接口(用于同外围设备通信)集成到一个芯片中,这个芯片由于通常用于对传感器、电机等外围设备的简单控制,又被称为微型控制单元(MCU),也就是常说的主控器。

从内部集成的32bIT RISC CPU来看,其寻址能力可以达到2^32字节,也就是4GB。其内部的固件一定会被存放rom中,也就是Flash或者EEPROM中,一般,设备的固件会被写入到Flash中,EEPROM用于重要系统参数或数据存放。

在可寻址的4GB的空间内,Flash区域的地址空间为0x00080000~0x00100000(512KB)。只要“有心人”能通过某种方法,读取到这段地址空间中的数据,固件也就得到了。

分离式固件存储:当主控器内部的存储容量不能完全存储所需的固件或信息时,厂商一般会外接存储器到主控器上,一般,存储器会有下面3种,如图 6所示(下面三个芯片),对应来看,上面的设备可以作为读取下面的存储器的模块来使用,插入电脑,利用配套软件即可读出固件,这时候,“有心人”无需知道这三类存储器在主控器或CPU中的地址映射是怎样的,直接把芯片取下来,对应模块读出即可。

不取下这些芯片,有没有可以读出来的办法?那就通过Bootloader或者利用JTAG/SWD等调试接口,把通过控制主控器的读写存储器流程,进而读出固件内容。利用这种方式读取固件内容,需要知道这类存储器的地址在主控器中被映射到了哪段固件在存储器中的位置,寻找方法类似JN5169的固件地址,这里不再赘述。

固件获取方法

网络升级截获(FTP、HTTP)

固件不仅可以在本地获取。当物联网设备进入升级流程时,可以通过抓取升级过程的流量信息,进而得到物联网设备通过网络升级固件的具体途径,进而复现固件升级流程而获取固件。

通过抓取网络升级过程的流量进而获取固件的方法,适合在设备购买回来第一时间进行抓包,因为有的设备通过静默升级的方式来升级固件,用户是感知不到的。如果设备采取的是静默升级的方式,而此时设备刚好是最新的固件版本,设备将不会进入升级流程,此时固件是没有办法通过升级来获取的。

直接读存储芯片

直接读取存储器中的数据,进而获取到固件.直接把存储器通过焊接的方式取下来,必然需要用到焊接工具

“有心人”除了有这个编程器以外,还会从卖家得到一个配套软件,运行在PC上,作为上位机读取NanDFlash中的内容,如。图 12所示。利用该软件和编程器,将存储芯片和PC建立连接后,直接读出即可。

通过串口等通信总线读取

一种比较“温柔”的方式,那就是通过主板上暴露的UART接口,在PC与固化在主控器中的Bootloader程序之间建立通信,进而通过控制主控器读取固件中指令的流程,把固件读取出来。此处以STM32单片机为例,介绍如何利用主控器内部的Bootloader进而得到主控器内部的Flash区域的代码。

官方介绍来看,这段Bootloader的主要作用是方便芯片使用者(嵌入式软件开发工程师)下载固件程序到主控器的Flash区域中。事实上,除了这个功能外,Bootloader还具备读取固件的能力。这要从Bootloader的整个运行流程谈起。

通过调试接口读取

有些产品的主板上,会暴露硬件开发调试时所用的接口,如JTAG/SWD接口。一般,如果只是利用串口,在开发调试阶段是没办法设置程序断点的,所以厂商实现了JTAG/SWD硬件模块,以特定的协议,通过一个硬件调试器作为通信协议适配器,方便开发者在PC上动态调试正在运行在芯片中的代码。利用JTAG/SWD的接口,使PC与主控器建立连接和适配后,相当于控制整个芯片或者设备。

小结

以上,介绍了“有心人”获取固件所需的输入信息以及获取方法。究其(固件提取)本质,还是在获取Flash、RAM的访问权限,进而读取映射到内存地址中的内容。

在获取方法的介绍过程中,有意对方法分类,分类的依据是该方法需要控制设备的程度。如:

  • 方法1利用升级的方法,只是利用了设备的工作模式,而没有去控制设备,即可获取固件;
  • 方法2直接读取存储器的方法,绕过了控制设备控制器(或处理器),直接控制设备的Flash芯片,直接把芯片中的整片内容读取到;
  • 方法3则需要控制MCU(或处理器)的Bootloader中读取Flash的流程,进而把数据通过通信总线输出到主机端(如PC);
  • 方法4则控制了整个MCU(或处理器),就是通常说的进入了上帝模式。

如何防护

固件本是可以得到足够的防护的,这个有效的前提是:“有心人”没有工作环境和成本,来解剖芯片,利用显微技和芯片制作的工艺、技术直接读取存储在芯片内部的固件信息。对于物联网设备来说,这种级别的防护已经足够安全,因为其破解成本远远大于大多数物联网设备能提供给“有心人”的价值

加密传输与认证

为了防止固件被“有心人”在局域网中获取到,必须在产品的升级流程中加入加密传输和请求认证的功能。

隐藏接口

  • 隐藏主控芯片引脚和型号信息。

采用BGA封装的芯片,可以较好地隐藏芯片的引脚,以增加判断调试接口位置的难度。如果再把芯片的型号信息抹去,此时“有心人”是没有特定的文档做参考,以确定芯片型号,进而确定接口位置的。如果主板上留有这两类接口的焊盘,他们只能通过这些焊盘来盲目测试以确定接口位置。

  • 删除主板上这两类接口的焊盘和相关的丝印。

如果把主板上这两类接口相关的布线和焊盘删去,此时“有心人”除非把主控芯片焊接下来才有可能接触到BGA封装的芯片引脚。如果他们想读取出固件,必然要引出导线建立与PC的连接才可以。如果固件是分离式存储,把芯片取下来,是没有办法通过主控芯片读取外部存储器的固件的,因为即使PC和芯片建立连接,存储器和芯片之间的连接已经被断开了。此时只能读取到主控芯片内部的固件,或者直接把存储器取下来,直接读取存储器中的固件。

删除焊盘、丝印、芯片信息,隐藏芯片引脚,这两种方式已经把“有心人”读取固件的方法限定到两种方法:通过焊接去下存储器或主控芯片,利用其它工具获取固件的暴力方法了。

设置主控芯片的读保护

在主控芯片内设置读保护,可以防止“有心人”通过读取芯片内部Flash区域的固件。以STM32主控器提供的RDP读保护功能为例。如果主控芯片内部设置了对内部存储区域的读保护操作,那必须要先解除读保护操作才可以读取内部存储区,而解除读保护的操作,会导致正片存储区域的擦除,事实上,如果解除了读保护机制,主控芯片内的固件已经被擦除了。所以,这种方法可以防止“有心人”暴力取下主控器,单独制板读取内部Flash数据,进而读取到固件。

加密保护

如果不加入特定的保护电路,从软件上已经没办法防止“有心人”把外部存储器中的固件读取出来了。退一步讲,可以加密一部分固件,以防止他们从固件中获取有效的信息(如文件系统)。如加密除Bootloader以外的代码,解密程序在Bootloader中实现。解密密钥相关的信息完全可以放到主控器中,并加以读保护,这样,即便他们拿到了加密的固件,和Bootloader中的算法,也没办法得到解密密钥,获取不到有用的信息。

综上所述,如果能综合利用加密技术、读保护技术,并在产品开发期间注意隐藏接口、芯片信息,“有心人”是很难读取到设备固件,或者利用固件获取到有效信息的。没有固件,没有接口能进入系统控制台的情况下,他们只能盲目地对设备进行测试,从而在一定程度上保证物联网设备本身的安全性。

参考

[1] 物联网设备固件的安全性分析 – 绿盟科技技术博客 (nsfocus.net)

脚本宝典总结

以上是脚本宝典为你收集整理的物联网设备固件的安全性分析全部内容,希望文章能够帮你解决物联网设备固件的安全性分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。