物联网设备之所以存在安全隐患,是因为其暴露了足够的敏感信息,从而被攻击者利用来制造攻击。这些敏感信息,从暴露位置来看,可分为两类:一类是存储在设备中的固件和印制在产品内部的信息(如PCB丝印、芯片型号)等;另一类是传输在网络(不仅仅是以太网、Wi-Fi、蓝牙等)中的信息。本文通过从本地信息、网络信息这两个角度介绍物联网弱设备存在的安全隐患,进而提出设备加固的方法。
一、简介
近年来,随着物联网技术的迅速发展,物联网产品的数量也在呈爆发式增长。Gartner预测,两年后,物联网设备的装机量将超过200亿[1] ,这些物联网设备所带来的信息量将非常庞大。与此同时,因物联网设备导致的信息安全隐患也在逐年增加,甚至有些隐患已经造成了不可挽回的损失,如2016年底的Mirai事件[2] ,就是因为大量的暴露在互联网上的物联网设备存在弱口令和未修复的漏洞。2018年3月27日,《绿盟科技2017物联网安全年报》[3] 发布,其中对物联网资产的暴露情况、物联网设备的脆弱性和物联网设备面临的威胁风险进行了分析,并给出了物联网安全防护体系。
物联网设备之所以存在安全隐患,是因为其暴露了足够的敏感信息,从而被攻击者利用来制造攻击。这些敏感信息,从暴露位置来看,可分为两类:一类是存储在设备中的固件和印制在产品内部的信息(如PCB丝印、芯片型号)等,在本文我们暂时称其为本地信息;另一类是传输在网络(不仅仅是以太网、Wi-Fi、蓝牙等)中的信息。
目前看来,不论是生产厂商还是用户,对弱设备的安全问题的关注并不是非常足够。例如,在2017年9月的XPwn2017未来安全探索盛会[4] 上,某黑客逆向了某共享单车的单片机程序,从而挖掘出了漏洞。2017年10月,物联网安全研究人员渗透进LIFX智能灯泡的Zigbee网络[5] ,并对设备的固件进行逆向破解,从而得到了其Wi-Fi网络密码。
由此可见,物联网设备存在许多的安全隐患,而且,我们面临一个挑战:如何消除这些安全隐患。本文就以弱设备为例,阐述如何对弱设备进行加固,解决已经出现的安全隐患。
后续小节中,笔者会先介绍物联网弱设备存在的安全隐患,再介绍物联网弱设备的加固方法与建议,最后再进行简单地总结。
二、物联网弱设备存在的隐患
一般,攻击者会收集足够的信息,以利用现有的漏洞或挖掘新的漏洞对设备发起攻击行为。如果攻击者拿不到可以利用的信息,设备的安全隐患也就不会存在。物联网弱设备一般会暴露哪些信息呢?从信息的未知看,可以分为本地的信息和网络中的信息两类。接下来,将从这两方面介绍物联网弱设备存在的安全隐患。
1. 本地信息
所谓本地信息,这里定义为可以通过购买设备,观察或者使用工具直接对产品接触式操作获取到的信息。一般包含PCB丝印、硬件接口、固件信息等。
(1) PCB丝印
PCB中文名称为印制电路板。在设计和制作PCB的过程中,丝印为工程师的焊接、调试工作带来了极大的便利。然而,在产品出厂后,它上面的PCB丝印信息对用户没有任何帮助,反而为攻击者的成功破解提供了信息。
以图 1所示的Wi-Fi智能插座[6] 为例,在PCB上,插座暴露了三类敏感信息:JTAG调试接口(红色标记的位置)、UART接口位置(紫色标记的位置)和设置程序启动位置的BOOT(蓝色标记的位置)。JTAG和UART是芯片供应商提供给工程师进行读取和下载程序的两类接口。攻击者也可以利用这两类接口尝试把固件读取出来。其具体的读取、下载方法,可参考《渗透低性能智能设备的关键技术-固件提取》[7] 。
图 1 — 某智能插座PCB丝印信息
(2) 硬件接口和芯片信息
上节已经提到了JTAG、UART接口信息。事实上,这两类接口对攻击者是最有帮助的,因为只需要一些工具,就可以把设备内的固件信息读取出来,进而分析出更多的信息。
图 2 — 某智能设备PCB
以图 2所示的PCB为例,我们很容易发现规则排列的6个焊盘(红色方框标记),结合芯片上的型号信息(JN516x),很容易在芯片手册[8] 中查到该芯片的引脚图和芯片的固件下载方式,如图 3所示。
图 3 — JN5169的芯片引脚图
根据图 3,结合万用表,可以测试出这6个焊盘和芯片的引脚是否直接相连(短路测试),如果是直接相连,就可以确定,该接口是用来下载程序的。事实上,芯片JN5169下载程序使用的接口,一共需要的也是6个。
攻击者定位程序下载接口所需的信息,只是通过搜索设备拆解文章,或者把设备买回来拆解后即可获取。攻击者获取这些信息的目的非常明确:拿到固件,从而分析出更多的信息或挖掘出网络通信相关的漏洞。
(3) 固件信息
固件中几乎包含了除了网络信息中的全部信息,包括程序执行流程,初始化参数等。如果双方通信的内容一开始就是被加密的,那初始或默认的加密参数(如密钥、初始向量)等信息将被编码到固件中。如Z-Stack协议栈中,Zigbee通信的默认密钥会被硬编码,如图 4和图 5所示。如果再深入一些,在IAR编译环境下生成多个固件,分析该密钥出现的位置,就会发现密钥出现的位置比较有规律。
图 4 — Z-Stack中的默认密钥信息
图 5 — 编译Z-Stack得到的固件中,Zigbee通信使用的默认密钥
2. 网络信息
网络中包含两类信息,一类是用于控制的信息,另一类是用于共享、存储的信息。一般,如果网络信息存在隐患,说明前者会存在设备失控的隐患,或者后者存在隐私泄露的隐患。
一般,网络中存在的攻击有以下几种:
重放:蓝牙、Wi-Fi等协议,云管端通信的应用层控制报文等。
明文:HTTP协议等不安全协议的应用,导致敏感信息泄露、设备受控等。
Dos:拒绝服务攻击,使设备不能正常提供网络服务。
接下来,笔者以低功耗蓝牙协议栈为例,简单介绍控制信息和存储/共享信息在网络传输过程中存在的隐患。
低功耗蓝牙协议栈和其他的协议栈一样,也可以采用分层模型来理解。一般,制造低功耗蓝牙芯片的厂商会在芯片手册中介绍协议栈,并总结出类似的分层模型。此处引用Nordic[9] 总结的模型,如图 6所示,大抵可分为3层,底层为Controller,中间层为Host,顶层为Profiles。
图 6 — 低功耗蓝牙协议栈分层模型
这里不对协议栈做深入的分析,但是,需要注意的是GATT部分。当蓝牙设备通信在GATT层时,通信双方可理解为Client和Server,当二者建立连接后,可以相互对双方的服务(以UUID标识)进行读写。例如:
图 7 — 协议栈中预定义的UUID
介绍两个例子,分别代表控制信息被利用,用于共享、存储的信息被非法获取这两种情况。一般情况下,如果往UUID为0x1802的服务中写入值,会引起设备报警。如果低功耗蓝牙设备(A,用户实际使用的产品)没有对攻击者使用的蓝牙设备(B,电脑、手机等双模蓝牙设备)进行身份认证,攻击者在利用B攻击A时,非常容易写入成功,即引起设备异常报警。同样,也可以读取A设备内UUID为0x180D的服务中的数据来获得用户的心率(前提是信息没有被加密)。事实上,某些厂商的手环类产品的通信过程是没有经过加密的,造成了设备可控或隐私信息泄露。
三、加固方法与建议
一般,漏洞挖掘过程会涉及代码审计、黑盒测试、文档研究等。本节的弱设备加固方法会最大限度地保证攻击者无法对弱设备进行代码审计,保证黑盒测试结果不会存在有价值的信息。所以,笔者提出防护方法的目的很明确:不让攻击者获取到源码、固件、端口等信息。禁止这些信息泄露的方法很直接,可以分两步:信息读保护设置和信息加密设置。这样能保证:有信息不可读(不可见),即使读出来,也极难解密。
1. 信息不可读的方法
(1) 针对PCB:
一般,PCB上会有丝印、接口、芯片型号等信息,这些信息为攻击者查找固件提取接口提供了便利。如图 1所示,暴露的JTAG、UART、BOOT模式选择接口能使攻击者有目标地提取出固件。
所以,建议开发工程师把PCB丝印、芯片型号等信息清除,同时,把下载固件的接口移除。但是,这并不能从根本上解决问题,如果攻击者熟悉主控芯片的封装,通过测试总是可以匹配上的。
(2) 针对固件-MCU内部:
弱设备由控制芯片和外围模块(如传感器、联网模块等)组成,代码在控制芯片中或联网控制芯片上或联网模块中。可以做到固件不可读。存储设备有读保护能力。可以通过设置一些读保护选项,使内存里的内容不可读。
以常见的STM32f1系列的单片机为例。
可以通过设置RDP(Global Read-out Protection)寄存器的值来改变单片机内部flash读保护选项。当启用读保护选项时,单片机的固件是无法通过JTAG和UART接口读出来的。也就是说,必须破坏芯片结构,才有可能把芯片内部的程序读出。
图 8 — STM32f1系列单片机的RDP功能
类似的功能不仅仅出现在ST公司的芯片中,还有NXP的CRP(Code Read Protection)、TI 的FMPRE寄存器等。
实现这一安全能力,需要产品研发团队投入足够的精力在MCU的读保护策略的学习上,以保证代码安全。
(3) 针对固件-MCU外:
对弱设备来说,目前市场上,MCU外的固件会存放在专门的ROM芯片中,如以SPI总线进行通信的SOP8封装的W25Q128系列,如图 9所示。
图 9 — SOP8封装的Flash芯片
一般,之所以选用Flash芯片作为存储固件的存储器,是因为仅仅一个MCU中集成的Flash容量,不足以保证协议栈的完整移植。
所以建议协议栈的代码和产品业务相关的代码分开,在MCU中运行业务相关的代码,并使用读保护功能开启,这样即可保证业务代码不可读。必要时,可以对协议栈的代码进行部分加密保护和混淆,以防止攻击者进行逆向分析或漏洞挖掘。
2. 信息加密
比较安全的加密算法是RSA,而且,根据目前的MCU发展情况看,在MCU中实现RSA加密体制并不难。如IEEE 802.15.4无线芯片cc2538的内部集成了ECC RSA-2048加速器,可以提高单片机在RSA密码体制下的工作效率;ST公司提供了加密的库函数(Cryptographic Library)。从当前芯片的性能看,在弱设备上做RSA加密已经不是一个难题了。
(1) 协议栈
以lwip协议栈为例,在协议栈的官方文档中,找不到关于加密传输的内容,所以,有必要对该协议进行二次加密功能的集成,如图 10所示。
比较理想的是利用RSA和AES混合加密方法:利用RSA来加密传输AES密钥,再基于AES加密实现数据传输。因为,设备端保存的公钥是没有解密能力的,仅仅根据密文和公钥解密出AES密钥非常困难,攻击者得不到解密密钥,那就没办法对信息解密,从而保证了信息传输的安全。
图 10 — lwip协议栈的特性
(2) 应用层通信
应用层加固的方法有三个:加密应用层传输的数据、关闭不必要的端口开放、黑白名单策略。
加密应用层传输的数据可以解决2.2 节中提到的蓝牙数据包被解密的导致的一系列问题。安卓手机可以对蓝牙通信过程以日志的形式进行抓包保存,保存后,可以使用wireshark等工具软件打开该日志文件进行分析,而此时的数据包是经过蓝牙协议栈解密的。如果在产品开发过程中,消息传输的内容是明文的,会导致信息(gatt的描述信息和值等)泄露的问题出现。此时,加密(依然是采用RSA和AES加密混合方式)是一个比较好的方式,有助于防止黑客进行加密重放。
作为弱设备,要尽可能的关闭不必要端口,笔者建议不开启端口。弱设备和云端的交互过程中作为客户端角色存在即可。良好的黑白名单机制可以保证设备的通信对象合法。这里对这两种方法不再深入介绍。
四、总结
本文通过从本地信息、网络信息这两个角度介绍物联网弱设备存在的安全隐患,进而提出设备加固的方法。总的来说,弱设备防护的思路比较简单,就是消除冗余的信息。只要生产厂商的产品设计方案和研发流程都比较规范,产品存在的安全隐患会比较少,甚至没有。
评论
查看更多