一、引言

随着智能家居设备的逐渐普及,智能家居终端带来的风险也逐步暴露,在智能终端上实现安全能力的需求也逐渐变大。像传感器这类简单的智能终端的防护工作应该如何开展,似乎成为了一个难题。一来,这类简单的终端没有通用操作系统或软件,篡改固件、网络攻击实施门槛较高;二来,终端的功能极其简单,在攻击方面利用价值不太大;三来,常见的弱终端通常在内部网络中,暴露面较小,攻击者难以接触。

然而,这类弱终端的安全性就可以置之不理了吗?必然是不行的。2018年2月3日,来自美国东北大学和SEEMOO实验室的两位研究员分享了如何破解小米生态下的智能设备的案例1,这些终端包括了智能传感器、智能灯泡在内的弱设备。可见弱终端的安全也应重视。尽管其存在配置较低、非常见操作系统等限制,但是也应配合适当的防护方法,如日常状态监控、异常分析和恶意行为阻断。

根据官网给出的文档,可以自行构建开发环境。笔者是用的Ubuntu 16.04 server 版本的Linux镜像,在虚拟机里面构建的编译环境2。构建好以后,就可以直接通过make flash monitor这一命令烧写固件到模组并查看相应的日志输出了。这些信息文档里面都有,搭建好编译环境即可熟练使用,本文不赘述。

如果需要配合服务端做行为监控,终端侧需要上传必要的、能反映出设备运行行为的信息才行。一般,需要采集的信息包含:终端基本信息、内存占用信息、IP、端口、域名等,以覆盖终端的运行信息以及联网信息。我们以ESP8266这个Wi-Fi模组为例,其功能结构如图1所示,以源码分析的方式,介绍数据的采集以及其实现方式。前两种是终端的指纹以及操作系统信息,后三种是终端的网络请求、连接信息,本文以后三者的信息收集功能为例,基于官方RTOS的SDK源码[1],介绍将信息上传到云端方法。

[1]ESP8266 Wi-Fi模组的官方SDK有两个,分别对应有无RTOS,这个RTOS是FreeRTOS。本文的实例基于RTOS版本的SDK。

图1 ESP8266 Wi-Fi芯片功能图

需要注意的是,必须打通一个安全通道,以安全地将数据送上云端,所以第一步是打通安全通道实现安全通信,第二步是上传数据进行异常检测与防护。接下来按照章节分别介绍。

二、安全通信

基于双向的SSL协议的应用层协议比较理想的安全通信方式。然而,单片机类终端或者模组本身的内存资源有限,采用双向的SSL通信,如果应用和SSL通信内存使用冲突时,安全就得让步,本文就以单向的SSL通信方式为例,介绍基于单向SSL的MQTT通信。

2.1 证书生成

网上有一些密钥生成的工具,mbedTLS的库目前对证书的校验过程,如果有SHA1算法做哈希参与,就会有哈希不匹配的问题,需要保证密钥是2048位以上且没有SHA1算法参与制作证书过程中。

运行如图2所示脚本3即可保证生成正常的密钥。如需对接密钥管理平台,请根据上述两个原则,自行适配。

图2 密钥生成脚本

脚本中需要配置好域名内容和密钥长度。一键生成即可。生成的tls.crt和tls.key分别可以作为客户端、服务端的证书和私钥,cacerts.pem是CA证书,用来校验客户端和服务端证书用的,如果是单向的,校验方只需要有这一个CA证书即可。CA的私钥请保管好,产品化则需要部署密钥管理系统。具体如图3所示。

图3 证书参数配置注意事项

2.2 证书烧录

搭建环境完成后,会存在~/esp/ESP8266_RTOS_SDK/examples/protocols/esp-mqtt/ssl,把这个目录复制到esp目录下,并将cacerts.pem改名为iot_eclipse_org.pem放到esp/ssl /main目录下。在ssl目录里面运行如下命令make menuconfig配置好热点参数以及云端服务信息(基于SSL的MQTT服务配置,网络上有很多资源,本文不赘述),并运行make flash monitor生成固件并烧录到模组即可将证书烧录到模组中。esp/ssl/main目录下的component.mk中配置了证书的位置及命名。

烧录完固件后,在日志中即可看到连接到云端的信息,如图4所示,其中打码部分是笔者的调试信息,为防止理解有误已隐藏。

图4 运行成功表现

到此为止,模组已经通过基于单向认证的MQTT通信连接到了云端服务。下面介绍如何采集信息。

三、异常检测与防护

如果做异常检测,得有终端上传到云端的信息。当云端分析后,还要向终端下发控制指令,以保证告警,断开恶意连接。所以,终端需要具备信息上传和恶意连接阻断的能力。本章以上传IP、端口、域名信息为例,介绍信息上传的实现思路。

3.1 信息上传

每个例程中,main.c文件中都有一个app_main函数,该函数已被ESP8266框架内的入口函数调用,如图5所示。所以,用户如果想添加自己的应用程序,直接在app_main函数中操作即可。如需深入交流,可联系作者(zhangkelei@nsfocus.com),本文不再深究。

图5 app_main函数调用位置

esp_transport_ssl_init函数下有esp_transport_set_func承接了协议栈的标准函数,如图6所示我们只要通过ssl_connect函数即可找到数据采集的位置。因为在tcp连接建立时,必然会有域名、IP、端口的传递。

图6 函数转接

通过一步一步查找函数调用关系,可以找到ssl_connect-> esp_tls_conn_new_sync-> esp_tls_low_level_conn-> esp_tcp_connect的函数调用链条。开发者只需要在esp_tcp_connect函数中将域名、IP、端口信息提取出来即可,因为这个函数的输入参数就是域名、端口,经DNS解析后,IP信息就会存在于某一变量中。提取方法有多种,本文不再赘述。

3.2 防护

防护方案必须考虑产品本身被破解后的风险。例如智能插座,一般会被隐藏在内部往来中,已经能保证一定程度的安全,原因有两点:其一,如果攻击者想破门而入,必须突破门锁、门窗的安全防线;其二,如果想连入内网,必须突破网关的安全防线,一般是非常不易的。

像智能插座这类终端,除了加入芯片厂商自身提供的信息保护能力(如安全启动、安全存储,这种功能可根据芯片厂商提供的SDK实现),配合使用场景自身的安全能力以外,考虑产品网络侧的异常告警与阻断即可。而基于IP、端口的防护机制类似于防火墙,是比较容易实现和落地的。原因有二:其一,机制不依赖于硬件,可以单独作为模块嵌入到产品中;其二,终端行为非常简单,白名单中IP数量极少,总量甚至不到1KB(一个IP占用4字节),所以,在匹配白名单过程中,这种机制对内存的消耗比较小。

总之,从可行性角度来说,这种防护机制是能实现的。只需要在数据采集的位置之后,启动网络连接之前,将该机制插入进来即可。该机制相对比较简单,本节不再以代码作为示例呈现。

四、小结

在模组或者单片机类终端,功能和系统都比较简单,并没有比较复杂的操作系统,本身也没有非常多的资源供开发者使用。所以,除了注意一些硬件安全配置事项以外,还需要聚焦在安全通信和终端行为分析这两方面能力。从这些终端中构建安全功能,需要开发者既具备安全知识,又要有较强的嵌入式背景,才能比较顺利地完成安全开发。

参考文献

1. RECON BRX 2018:Reversing IoT Xiaomi ecosystem,https://recon.cx/2018/brussels/resources/slides/RECON-BRX-2018-Reversing-IoT-Xiaomi-ecosystem.pdf

2. ESP8266官方文档及源码,https://github.com/espressif/ESP8266_RTOS_SDK

3. 一键生成ssl自签名证书脚本,https://www.cnblogs.com/kcxg/p/10671831.html

本文作者:绿盟科技创新中心 张克雷

声明:本文来自关键基础设施安全应急响应中心,版权归作者所有。文章内容仅代表作者独立观点,不代表士冗科技立场,转载目的在于传递更多信息。如有侵权,请联系 service@expshell.com。