1、概述
随着软件技术飞速发展,开源软件已在全球范围内得到了广泛应用。数据显示,99%的组织在其IT系统中使用了开源软件。开源软件的代码一旦存在安全问题,必将造成广泛、严重的影响。为了解开源软件的安全情况,CNCERT持续对广泛使用的知名开源软件进行源代码安全缺陷分析,并发布季度安全缺陷分析报告。
自2005年国际电信联盟(ITU)正式提出“物联网(IoT)”这一概念以来,物联网在全球范围内迅速获得认可。随着物联网技术的发展创新,大量智能家居和可穿戴设备进入了人们的生活,“万物互联”成为全球网络未来发展的重要方向。根据Gartner报告预测,2020年全球物联网设备数量将高达260亿个。然而,由于安全标准滞后,以及智能设备制造商缺乏安全意识和投入,物联网已经埋下极大隐患,为个人隐私、企业信息安全甚至国家关键基础设施带来严重的安全威胁。
本期报告选取全球20款知名物联网软件进行源代码安全缺陷分析,结合缺陷分析工具和人工审计的结果,评估项目的安全性。从测评结果来看,与往期其他领域开源软件相比,物联网类软件的安全缺陷较多,潜在的安全问题不容忽视。同时,技术人员随机抽取安全缺陷进行人工利用,发现存在能够被证实的安全漏洞,通过漏洞能够获取物联网云端服务器权限,一旦该漏洞被黑客利用,则存在物联网设备被远程操纵的安全风险。
2、被测开源软件
综合考虑用户数量、受关注程度以及更新频率等情况,选取了20款具有代表性的物联网类开源软件。表1列出了本次被测的开源物联网软件项目的概况,项目按照Github上Star的数量降序排列。本次检测的软件涵盖了C、C++、Java、JavaScript(JS)等编程语言。这些开源软件项目都是国际知名的,拥有广泛用户的软件项目,其中不乏由知名软件公司开发的软件。由于这些软件大多具有巨大的用户群体,软件中的安全缺陷很可能会造成严重的后果。
表1 被测开源软件项目概览
项目名称 | 版本号 | 主要编程语言 | 功能说明 | 代码行数 | Github star数 |
Serverless | master | JS | 使用无服务器架构构建Web、移动、物联网应用的框架 | 20,150 | 26,124 |
Node-RED | master | JS | 用于连接物联网的可视化工具 | 100,840 | 6,447 |
JerryScript | V1.0 | C | 用于物联网的超轻量级JavaScript引擎 | 97,559 | 3,223 |
ArduinoJson | V5.13.4 | C++ | 物联网的JSON库 | 27,583 | 3,078 |
POCO | V1.9.0 | C++ | 支持桌面、服务器、移动、物联网、嵌入式系统上的联网应用开发的跨平台的C++函数库 | 526,721 | 2,929 |
CrateDB | master | Java | 一个分布式SQL数据库,可以轻松实时存储和分析大量机器数据 | 314,984 | 2,131 |
ThingsBoard | master | Java | 一个用于数据收集、处理、可视化和设备管理的物联网平台 | 112,704 | 1,987 |
RIOT | 2018.10版 | C | 支持常见物联网设备的实时、多线程的操作系统 | 1,341,539 | 1,979 |
Blynk Library | V0.5.4 | C++ | 嵌入式硬件的Blynk库。Blynk是一个物联网应用平台,旨在简化物联网的移动或者Web应用构建。 | 17,206 | 1,831 |
IoT.js | master | JS | 使用JavaScript的物联网平台 | 42,910 | 1,826 |
OpenThread | V2.0.0 | C++ | OpenThread是Thread网络协议的开源实现 | 661,696 | 1,713 |
Blynk Server | V0.39.6 | Java | 基于Netty的Java Server,主要用于在Blynk移动应用和嵌入式设备之间传递消息。 | 75,555 | 1,097 |
Kaa | master | Java | 开源中间件平台,用于构建、管理和集成联网的产品和设备 | 461,511 | 984 |
MySensors | V2.3.0 | C++ | 专注于提供智能居家和物联网的DIY服务 | 17,788 | 871 |
SmartHome | master | Java | 智能家居的灵活框架 | 801,053 | 745 |
OpenIoT | develop | Java | 物联网中间件的基础架构,用于支撑联网设备的数据采集、流量清洗、事件处理算法的灵活配置和部署 | 269,387 | 369 |
Freedomotic | V5.6.0 | Java | 开放物联网框架 | 259,708 | 258 |
Link Kit SDK | V2.3.0 | C | 阿里云物联网套件 | 56,384 | 257 |
SiteWhere | master | Java | 一个面向物联网的工业级开源应用支持平台 | 216,796 | 235 |
IotXmpp | master | Java | 基于XMPP的安卓客户端,实现与物联网节点的交互 | 130,607 | 118 |
3、测试内容
3.1、安全缺陷种类
本次测试涵盖各类常见安全缺陷。根据缺陷形成的原因、被利用的可能性、造成的危害程度和解决的难度等因素进行综合考虑,可以将常见的安全缺陷分为八类:
1、输入验证
输入验证与表示问题通常是由特殊字符、编码和数字表示所引起的,这类问题的发生是由于对输入的信任所造成的。这些问题包括:缓冲区溢出、跨站脚本、SQL注入、命令注入等。
2、API使用
API是调用者与被调用者之间的一个约定,大多数的API误用是由于调用者没有理解约定的目的所造成的。当使用API不当时,也会引发安全问题。
3、安全特性
该类别主要包含认证、访问控制、机密性、密码使用和特权管理等方面的缺陷。
4、并行计算
线程和进程之间的交互及执行任务的时间顺序往往由共享的状态决定,如信号量、变量、文件系统等。与分布式计算相关的缺陷包括竞态条件、阻塞误用等。
5、错误和异常处理
这类缺陷与错误和异常处理有关,最常见的一种缺陷是没有恰当的处理错误(或者没有处理错误)从而导致程序运行意外终止,另一种缺陷是产生的错误给潜在的攻击者提供了过多信息。
6、代码质量
低劣的代码质量会导致不可预测的行为。对于攻击者而言,低劣的代码使他们可以以意想不到的方式威胁系统。常见的该类别缺陷包括死代码、空指针解引用、资源泄漏等。
7、封装和隐藏
合理的封装意味着区分校验过和未经检验的数据,区分不同用户的数据,或区分用户能看到和不能看到的数据等。常见的缺陷包括隐藏域、信息泄漏、跨站请求伪造等。
8、代码运行环境
该类缺陷是源代码之外的问题,例如运行环境配置问题、敏感信息管理问题等,它们对产品的安全仍然是至关重要的。
前七类缺陷与源代码中的安全缺陷相关,它们可以成为恶意攻击的目标,一旦被利用会造成信息泄露、权限提升、命令执行等严重后果。最后一类缺陷描述实际代码之外的安全问题,它们容易造成软件的运行异常、数据丢失等严重问题。
3.2、安全缺陷级别
我们将源代码的安全问题分为三种级别:高危(High)、中等(Medium)和低(Low)。衡量级别的标准包括两个维度,置信程度(confidence)和严重程度(severity)。置信程度是指发现的问题是否准确的可能性,比如将每个strcpy()调用都标记成缓冲区溢出缺陷的可信程度很低。严重程度是指假设测试技术真实可信的情况下检出问题的严重性,比如缓冲区溢出(buffer overflow)通常是比空指针引用(null pointer dereference)更严重的安全问题。将这两个因素综合起来可以准确的为安全问题划分级别,如图1所示。
图1 缺陷级别与严重程度、置信程度的关系
4、开源物联网软件项目的安全缺陷情况
本部分首先展示从被测项目中检出安全缺陷的数量,由此对被测项目的安全性进行大致的评估。然后进一步讨论被测项目中安全缺陷的分布情况,了解项目中出现较多的、容易被忽略的安全问题。
4.1、安全缺陷情况概览
本部分展示被测项目查出缺陷的数量,由此对被测项目的安全性进行大致的评估。图2分别展示了项目不同级别缺陷的数量,并按照高危缺陷数量对项目进行了排序,图中用蓝色折线图展示了每千行代码包含缺陷数,红色折线图为项目在Github上的star的数量。
图2 开源软件项目缺陷情况
从中可以看出,本次选取的物联网类开源软件都存在不同程度的安全问题。本次检测从这些项目中总计发现高危缺陷667个,中危缺陷3702个。缺陷数量排名靠前的项目处于极易被攻击者利用的状态,实际使用者需通过安装补丁或者更新版本的方式进行修复和升级。
在所有被测软件中,物联网应用平台Blynk的函数库Blynk Library的安全性最高(无高危缺陷,有3个中危缺陷)。物联网应用框架Serverless、物联网开发JS平台IoT.js、物联网实时操作系统RIOT的缺陷总数较少,总体安全性较高。
物联网中间件基础架构平台OpenIoT在本次被测的20款软件里高危缺陷居多,包含370个高危缺陷和669个中危缺陷。其中,包括556个输入验证类缺陷,其中283个缺陷为跨站脚本问题(高危),344处资源未释放问题(中危),提示该项目应加强对安全缺陷的管理,特别是加强对来自信任边界之外的用户输入的过滤和验证;同时,应进一步提升代码质量,避免攻击者利用资源泄露的问题发起拒绝服务攻击。
中高危缺陷总数最多的是联网应用开发函数库POCO,包含1个高危缺陷,和1380个中危缺陷。其中,项目被检测出748处“将比特位数不同的操作数进行位运算”、300处“使用了不安全的内存拷贝函数”、234处“在对字符类型比较时未明确其符号属性”问题。这些问题会降低程序的稳定性和可移植性,可能会导致程序发生非预期的行为,同时也增加了安全隐患。建议项目的开发者提升安全意识,可在开发过程中使用代码缺陷扫描工具提升代码质量和安全性。
考虑到项目的绝对缺陷数量可能与项目大小相关,因此本报告计算了每千行缺陷数,用该数据反映缺陷在项目中的分布密度。根据该数据,物联网实时操作系统RIOT每千行缺陷数仅为0.002,平均每10万行代码出现1个以下的中高危缺陷,为本次被测软件中安全缺陷密度最低的被测项目。此外,代码安全缺陷密度较低的项目有物联网应用框架Serverless、物联网开发JS平台IoT.js,这些项目平均每一万行代码出现1个以下的中高危缺陷。安全缺陷分布密度相对较高的项目是物联网DIY工具MySensors(6.97)、物联网中间件基础架构平台OpenIoT(3.79)、物联网的JS引擎JerryScript(3.53),这些项目平均每一千行代码中就会出现数个中高危缺陷。
4.2、高危安全缺陷分布情况
本部分对高危缺陷的分布情况进行分析说明。图3展示了被测项目高危缺陷大类的分布情况。数据表明,绝大多数缺陷为“输入验证”类缺陷,该类缺陷主要是由于对用户输入未做充分验证导致的,易造成缓冲区溢出、路径遍历、跨站脚本及各类注入缺陷,一旦攻击者构造恶意输入,可能造成任意命令执行、任意文件读取等严重安全问题。
图3 被测项目中高危安全缺陷的分布情况(按大类划分)
图4进一步展示了被测项目中各种具体的高危安全缺陷的分布情况。为方便展示,将出现不超过10次的缺陷统一归入“其他”,主要包括越界访问(9个)、硬编码密码(6个)等问题。在被测的20个项目中,出现较多的几类具体缺陷依次是跨站脚本(488个)、路径遍历(76个)和SQL注入(53个)。由于本期被测软件主要为物联网应用开发框架,提供物联网服务器端服务,这些缺陷将极大的提升服务器被攻击者获取控制权的风险,从而导致物联网设备被恶意操控、用户个人隐私泄露的风险。
图4 被测项目中高危安全缺陷的分布情况(按具体缺陷划分)
4.3、安全缺陷总体分布情况
上文针对被测项目中的高危缺陷的检出情况对项目的安全状况进行了分析。通常来说,与高危缺陷相比,中危缺陷在实际运行环境中的危害相对较小,但仍不容忽视,且能在一定程度上反映出项目的代码质量、开发人员对代码安全问题的重视程度等。为了更全面的了解被测项目的安全状况,本节进一步展示包括中危缺陷在内的安全缺陷的总体分布情况。
图5展示了被测项目中安全缺陷大类的分布情况。与高危级别的缺陷分布情况相比,代码质量类、API使用类缺陷占比大幅提升。项目中存在大量的“不当的位运算”、“不当的字符比较”、“资源未释放”、“使用不安全的函数”等问题,集中反映出开发者的不良编程习惯。与输入验证类问题相比,这类问题被攻击者利用的门槛相对较高,但一旦被利用,仍然会发生拒绝服务、执行任意命令等严重风险。
图5 被测项目中的中高危安全缺陷的分布情况(按大类划分)
表2进一步展示了被测项目中的各种具体的中高危安全缺陷的分布情况。由于本次被检测出的缺陷数量较大,共出现了85种中高危缺陷,为方便阅读,仅在表中列出出现50次以上的缺陷种类。
表2 被测项目中的中高危安全缺陷的分布情况
(按具体安全缺陷种类划分)
中高危缺陷种类 | 出现频次 |
将比特位数不同的操作数进行位运算 | 1,076 |
跨站脚本 | 571 |
资源未释放 | 562 |
不安全的内存拷贝函数 | 352 |
不当的字符类型比较 | 256 |
空指针解引用 | 157 |
不安全的字符串处理函数 | 132 |
路径遍历 | 98 |
SQL注入 | 97 |
Servlet的线程安全问题 | 90 |
XML外部实体注入 | 90 |
隐私泄漏 | 63 |
不当的格式化字符串 | 62 |
硬编码密码 | 53 |
未经检查的循环条件 | 52 |
5、本年度项目安全横向对比
本部分将本期被测的物联网类软件项目与本年度往期被测的人工智能类、开发框架类软件从平均每千行缺陷数的角度进行了横向对比。
图6 2018年度不同领域被测软件每千行缺陷数对比
如图6所示,物联网类的软件安全缺陷密度较高,从某种程度上反应出智能设备制造商的安全意识相对薄弱,提示物联网类开发者应加强对代码安全性的重视,并切实采取手段提升软件安全性。
6、缺陷验证情况
对于本次检测出的安全缺陷,报告编制组随机抽取缺陷进行人工利用,发现存在能够被证实的安全漏洞,本部分以Blynk Server路径遍历漏洞为例进行说明。Blynk Server是物联网服务器端组件,主要用于在Blynk移动应用和嵌入式设备之间传递消息。
图7 Blynk Server(版本0.39.6)路径遍历漏洞获取文件截图
图7展示了存在问题的代码片段,代码直接读取用户输入的URI(188行),未做任何验证和过滤就直接进行文件读取(210行),使得用户可通过“../”实现对服务器文件系统的路径遍历,从而可以获取任意文件内容。例如,如图8所示,通过URL“/static/js/../../../../../../../../etc/passwd”即可获得系统账户文件等敏感内容。由于Blynk Server主要用于在移动应用与物联网设备的微控制面板之间传递消息,因此一旦攻击者获取了服务器权限,将能够截获所有来自物联网设备的消息,从而导致物联网设备所有者的个人隐私泄露问题;此外,攻击者也能够通过篡改、操控发送至物联网设备的指令,实现对物联网设备的远程操控。
该漏洞得到了Blynk Server开发者确认,并获得了CVE确认(CVE-2018-17785),该漏洞在0.39.13及之后的版本中得到修复。建议软件的使用者尽快更新到最新版本,以避免不必要的安全风险。
图8 Blynk Server(版本0.39.6)路径遍历漏洞获取文件截图
7、关于本报告的说明
一、本报告仅从代码角度进行缺陷分析。本报告中统计的缺陷是指由于代码编写不规范导致的有可能被攻击者利用的安全隐患。在实际系统中,由于软件实际部署环境、安全设备等的限制,部分缺陷可能无法通过渗透测试得到验证。
二、本报告中的缺陷仅适用于表1中列出的特定软件版本。当软件版本有任何更新、修改和优化时,本报告不再适用。
三、本报告由360代码卫士团队提供部分技术支持。