开源软件源代码安全缺陷分析报告

——探秘国内知名互联网公司产品安全状况第二期

1、概述

随着软件技术飞速发展,开源软件已在全球范围内得到了广泛应用。数据显示,从2012年起,已有超过80%的商业软件使用开源软件。开源软件的代码一旦存在安全问题,必将造成广泛、严重的影响。为了解开源软件的安全情况,CNCERT持续对广泛使用的知名开源软件进行源代码安全缺陷分析,并发布季度安全缺陷分析报告。

本期报告聚焦国内知名互联网公司的软件安全开发现状,通过检测公司旗下多款开源软件产品的安全缺陷,评估各公司的代码安全控制情况。针对国内知名互联网公司,选取关注度高的开源项目,结合缺陷扫描工具和人工审计的结果,对各公司的项目安全性进行评比。

2、被测开源软件

本期报告聚焦国内知名互联网公司和ICT公司:华为、小米、搜狐、美团、大众点评,综合考虑用户数量、受关注程度等情况,选取了这些公司旗下的20款具有代表性的开源项目,表1列出了本次被测的开源软件项目的概况。

表1 被测开源软件项目概览

项目名称

版本号

主要编程语言

公司名称

功能说明

代码行数(L)

eSDK_SSO

2.1.00

Java

华为

单点登录软件,提供了用户只需要一次登录就可以访问所有相互信任的应用系统的功能

1,870

OpenApi_Windows_Java

2R1C00

Java

华为eSDK提供eSDKOpenApi(Java) API 可以帮助开发者通过调用REST接口对存储设备进行资源管理

36,300

IoT_OceanConnect

1.1

Java

华为OceanConnect北向RESTful接口,完成了北向应用大部分的功能

3,999

eSDK_FC_SDK_Java

2.1.00

Java

FusionCompute是云操作系统软件,主要负责硬件资源的虚拟化,以及对虚拟资源、业务资源、用户资源的集中管理

149,600

android_tv_metro

1.0

Java

小米

专辑和显示项目

12,859

LuckyMoneyTool

1.0

Java

抢红包

272

chronos

1.0

Java

微信后台团队自主研发的基于Paxos协议的多机状态拷贝类库

3,514

linden

1.0

Java

linden是一个建立在Lucene之上的分布式实时搜索系统

31,100

Cachecloud

1.3

Java

搜狐

CacheCloud提供一个Redis云管理平台:实现多种类型(Redis  Standalone、Redis Sentinel、Redis  Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减少运维成本和误操作,提高机器的利用率,提供灵活的伸缩性,提供方便的接入客户端

92,600

jedis-2.8.0-stat

2.8.x and  3.0.x

Java

精简版redis java客户端

26,800

sohutv.github.io

1.0

Javascript

高可用,高性能,分布式有序队列

7,007

pushcloud-demo

1.0

PHP/Java

pushcloud-demo展示模块

8,460

cat

1.3.8

Javascript

大众点评

CAT基于Java开发的实时应用监控平台,包括实时应用监控,业务监控

484,900

Pigeon

2.9.7

Java

Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一

58,600

Zebra

2.8.3

Java

Zebra是点评内部使用的数据库访问层中间件

33,500

dianping-open-sdk

1.0

Java

大众点评网的API

5,679

Robust

0.4.72

Java

美团

Robust是新一代热更新系统

4,181

walle

1.1.5

Java

Android Signature V2  Scheme签名下的渠道包打包器

5,012

DBProxy

0.0.2

C

DBProxy是由美团点评公司技术工程部DBA团队(北京)开发维护的一个基于MySQL协议的数据中间层

80,300

SQLAdvisor

1.0.0

C

SQLAdvisor是由美团点评公司技术工程部DBA团队开发维护的一个分析SQL给出索引优化建议的工具

48,8900

3、测试内容

3.1、安全缺陷种类

本次测试涵盖各类常见安全缺陷。根据缺陷形成的原因、被利用的可能性、造成的危害程度和解决的难度等因素进行综合考虑,可以将常见的安全缺陷分为八类:

1、输入验证与表示(Input Validation and Representation)

输入验证与表示问题通常是由特殊字符、编码和数字表示所引起的,这类问题的发生是由于对输入的信任所造成的。这些问题包括:缓冲区溢出、跨站脚本、SQL注入、命令注入等。

2、API误用(API Abuse)

API是调用者与被调用者之间的一个约定,大多数的API误用是由于调用者没有理解约定的目的所造成的。当使用API不当时,也会引发安全问题。

3、安全特性(Security Features)

该类别主要包含认证、访问控制、机密性、密码使用和特权管理等方面的缺陷。

4、时间和状态(Time and State)

分布式计算与时间和状态有关。线程和进程之间的交互及执行任务的时间顺序往往由共享的状态决定,如信号量、变量、文件系统等。与分布式计算相关的缺陷包括竞态条件、阻塞误用等。

5、错误和异常处理缺陷(Errors)

这类缺陷与错误和异常处理有关,最常见的一种缺陷是没有恰当的处理错误(或者没有处理错误)从而导致程序运行意外终止,另一种缺陷是产生的错误给潜在的攻击者提供了过多信息。

6、代码质量问题(Code Quality)

低劣的代码质量会导致不可预测的行为。对于攻击者而言,低劣的代码使他们可以以意想不到的方式威胁系统。常见的该类别缺陷包括死代码、空指针解引用、资源泄漏等。

7、封装和隐藏缺陷(Encapsulation)

合理的封装意味着区分校验过和未经检验的数据,区分不同用户的数据,或区分用户能看到和不能看到的数据等。常见的缺陷包括隐藏域、信息泄漏、跨站请求伪造等。

8、代码运行环境的缺陷(Environment)

该类缺陷是源代码之外的问题,例如运行环境配置问题、敏感信息管理问题等,它们对产品的安全仍然是至关重要的。

前七类缺陷与源代码中的安全缺陷相关,它们可以成为恶意攻击的目标,一旦被利用会造成信息泄露、权限提升、命令执行等严重后果。最后一类缺陷描述实际代码之外的安全问题,它们容易造成软件的运行异常、数据丢失等严重问题。

3.2、安全缺陷级别

我们将源代码的安全问题分为三种级别:高危(High)、中等(Medium)和低(Low)。衡量级别的标准包括两个维度,置信程度(confidence)和严重程度(severity)。置信程度是指发现的问题是否准确的可能性,比如将每个strcpy函数调用都标记成缓冲区溢出缺陷的可信程度很低。严重程度是指假设测试技术真实可信的情况下检出问题的严重性,比如缓冲区溢出通常是比变量未初始化更严重的安全问题。将这两个因素综合起来可以准确的为安全问题划分级别,如图1所示。

图1 缺陷级别与严重程度、置信程度的关系

4、开源软件项目的安全缺陷情况

本报告仅针对检出的高危、中危缺陷进行统计和分析。本部分首先展示从被测项目中检出安全缺陷的数量,并由此对国内互联网公司的产品安全性进行比较;然后进一步讨论各公司被测项目中安全缺陷的分布情况,了解各公司出现较多的缺陷类型;最后结合上一期报告中国外互联网公司产品安全性评估数据,对国内外互联网公司的产品安全情况展开对比。

4.1、安全缺陷情况概览

本部分展示被测项目查出缺陷的数量,由此对被测项目的安全性进行大致的评估。图2展示了各个项目高危、中危缺陷的数量,并按照高危缺陷数量对项目进行了排序,图中用蓝色折线图展示了每千行包含缺陷数。

在本次被测软件中,华为的软件OpenApi_Windows_Java(通过调用接口对存储资源进行管理)不存在高危缺陷,同时中危缺陷数量也较少,软件安全质量相对较好。小米的软件LuckyMoneyTool(抢红包)虽然也不存在高危缺陷,中危缺陷数量也少,但是由于软件代码行数过少,不具备一定的统计意义。

华为的物联网北向应用GUI程序IoT_OceanConnect在本次被测的20款软件中高危缺陷居多。在59个高危缺陷中,存在35个http响应截断问题,可能导致攻击者注入自定义的http头,存在10个代码质量问题(用户信息未得到充分保护),存在14个http参数污染的问题  。

大众点评的三款开源软件,cat、pigeon也包含了数量较多的高危缺陷。在两款软件总计107个高危缺陷中,除包括跨站脚本(21个)、http响应截断(12个)、不安全的随机数(10个)等常见缺陷外,还包括流资源未释放,API误用,空引用等安全缺陷。

图2 开源软件项目缺陷情况

中高危缺陷总数最多的是来自大众点评的数据访问中间件zebra,总计203个高中危缺陷中包含142个数据库资源未释放,主要是程序创建数据库对象资源后未进行合理释放,导致攻击者可通过数据库连接池耗尽的方式发起拒绝服务攻击。

考虑到项目的绝对缺陷数量可能与项目大小相关,因此本报告计算了每千行缺陷数,用该数据反映缺陷在项目中的分布密度。根据该数据,代码安全性最好的前5个项目依次是华为的eSDK_FC_SDK_Java(0.07),搜狐的sohuTV(0.07)、PushCloud(0.11),美团的SQLAdvisor(0.12)和大众点评的cat(0.14)。而缺陷分布密度相对较高的项目是华为的IoT_OceanConnect(10.73)、eSDK_SSO(3.52),大众点评的zebra(4.53)、dianping_open_sdk(2.73)和小米的Lucky   MoneyTool(3.08)。可以看到,不同项目的缺陷密度差别巨大,其中华为的eSDK_FC_SDK_Java项目平均大约每1.5万行代码会出现一个缺陷,而同样是华为的IoT_OceanConnect项目平均大约每100行代码就会出现一个缺陷。

4.2、各公司产品安全性对比

本部分对不同互联网公司的产品安全性概况进行对比,图3展示了每个公司在本次测试中检测出的高危、中危缺陷总数,以及以公司为单位统计的每千行缺陷数。

图3 互联网公司产品安全性对比图

由于每个公司的项目被检测出缺陷的绝对数量与项目数量、项目大小相关,不能直接反映公司的产品安全性,因此本部分重点关注每千行缺陷数。根据该数据,本期报告抽取的5家IOT和互联网公司的开源项目均有较好的软件质量控制,每千行代码缺陷数在0.18至0.53之间,属于合理范围内。

4.3、各公司高危缺陷分布情况

本部分展示各公司高危缺陷的分布情况,了解各公司出现较多的高危缺陷类型。图4展示了各公司的高危缺陷类型和分布情况,为了方便展示,统一将每个公司项目中出现5次以下的高危缺陷类型归入“其他”。可以看到,各公司的高危缺陷分布情况不尽相同。相对出现较为普遍的缺陷类型为“资源未释放”、“空指针解引用”、“不安全的随机性”。

图4 各公司高危缺陷分布情况

4.4、各公司中危缺陷分布情况

本部分继续展示各公司中危缺陷的分布情况,了解各公司出现较多的中危缺陷类型。如图5所示,各公司的中危缺陷分布情况不尽相同。为了方便展示,统一将每个公司项目中出现5次以下的中危缺陷类型归入“其他”。

图5 各公司中危缺陷分布情况

其中,相对出现较普遍的缺陷类型为“资源未释放”、“内存泄露”。这两类问题类似,都会导致系统资源的持续消耗,进而引发性能下降、甚至系统崩溃的问题。而内存泄露特指那些由于操作不当导致内存无法被回收的情况,例如声明了非静态的内部类等。

4.5、国内外互联网公司产品安全性对比

在最近三期的开源软件安全缺陷分析报告中,选取了国内外知名互联网公司旗下的几十款开源软件项目进行了安全性评估。结合上两期报告的评估结果,本部分将国内外互联网公司的产品安全缺陷和其软件自身的安全性进行了对比。对比参考数据是软件安全密度。图6展示了软件安全缺陷和软件安全密度之间的对比关系。可以明显看到,软件自身的安全性和软件代码中存在的安全缺陷数量有明显的正相关性。安全缺陷越多的软件,软件自身的安全性和健壮性越差。

图6 国内外互联网公司产品安全缺陷密度对比

“关于本报告的说明”

一、本报告仅从代码角度进行缺陷分析。本报告中统计的缺陷是指由于代码编写不规范导致的有可能被攻击者利用的安全隐患。在实际系统中,由于软件实际部署环境、

安全设备等的限制,部分缺陷可能无法通过渗透测试得到验证。

二、本报告中的缺陷仅适用于表1中列出的特定软件版本。当软件版本有任何更新、修改和优化时,本报告不再适用。

三、本报告由360代码卫士团队提供部分技术支持。

声明:本文来自CNCERT风险评估,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。