物联网设备固件的安全性分析(下篇)

百家 作者:绿盟科技 2018-08-01 09:57:38

 如何防护

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


上篇,介绍了“有心人”获取固件所需的输入信息以及获取方法。本篇,将为各位读者介绍物联网设备固件的防护方法。这些方法是已有的,集成了物联网芯片厂商在芯片中的防护方法和现有的密码学手段,针对上篇提到的获取固件的方法,提出防护方法,最终使“有心人”在有限的成本和工作条件下,对物联网设备固件无计可施。


加密传输与认证

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


如果产品请求的是FTP服务,可以改用SFTP服务代替FTP服务,并进行双向认证。这样他们看到的内容是加密的文件传输流量,如果没有解密所需信息,是无法对数据包进行解密的,同时,针对密钥的认证,也能防范中间人攻击。SFTP服务是基于SSH服务实现,所以可以通过设置SSH服务的方式来设置好双向认证流程,具体方法可以参考网络上的相关文档或教程,本文不再展开陈述。


如果产品请求的是HTTP服务,可以改用HTTPS服务代替HTTP服务,并进行双向认证。网络上有许多基于Nginx和Apache进行HTTPS加密通信和双向认证的设置,本文不再呈现设置方法。


但是,设备侧应如何实现传输加密和认证呢?这里以Kaa(版本0.10.0)开源物联网解决方案举例,来说明物联网设备端应如何设计,以实现安全认证和传输加密。


从Kaa架构图上看,Kaa为物联网设备生成了SDK,使用Kaa的工程师可以从服务端下载SDK源码进行编译并运行,进而连接到Kaa服务端。通过分析Kaa SDK的源码,有以下结论:

1、Kaa服务端和设备端的数据传输,是基于AES256加密的方法。

2、Kaa服务端会对设备端认证,设备端对云端的认证,并没有找到。

3、设备端是以AES密钥作为被签名的文本,采用的RSA签名方式。

图 18 Kaa整体架构

Kaa的加密方法足够强,目前看来,其签名认证采用的单向认证,如何把Kaa的单向认证改为双向认证呢?在设备端,需要在建立TCP连接之后,对设备签名的信息传输之前,加入设备对服务端进行认证流程。认证方法也可以采用另一个RSA秘钥对,在生成SDK时,使设备带有服务端签名验证的密钥,进而对服务端认证。在服务端,可以独立于Kaa服务开启另一个认证服务,专用于加密传输认证信息。


不过,需要注意的是,需要对该私钥做到足够的保护,可以把密钥放到芯片内部可以进行读保护的区域,利用读保护的方法防止攻击者获取云端密钥信息。


隐藏接口

如何隐藏UART、JTAG等调试接口?这里提供以下思路:


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

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

图 19 BGA封装的芯片

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

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


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


设置主控芯片的读保护

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

图 20  STM32 RDP读保护的官方描述

到此为止,集成式存储固件的产品,其固件可以受到保护,使“有心人”基本没有任何办法读取到主控器中的固件。“有心人”可利用的方法,现在只能针对分离式的产品,把存储器取下来,再利用编程器读取出来。


加密保护

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


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

本文所有图片均来源于网络和官方手册截图。本文所有内容,避免不了有所疏忽,如果您认为本文所阐述的内容是错误的或者对本文的观点持有不同意见,非常欢迎您及时指出并随时交流。




请点击屏幕右上方“…”

关注绿盟科技公众号
NSFOCUS-weixin

↑↑↑长按二维码,下载绿盟云APP

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接