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

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

1、概述

随着软件技术飞速发展,开源软件已在全球范围内得到了广泛应用。数据显示,从2012年起,已有超过80%的商业软件使用开源软件。开源软件的代码一旦存在安全问题,必将造成广泛、严重的影响。为了解开源软件的安全情况,CNCERT持续对广泛使用的知名开源软件进行源代码安全缺陷分析,并发布季度安全缺陷分析报告。本期报告聚焦国内知名互联网公司的软件安全开发现状,通过检测公司旗下多款开源软件产品的安全缺陷,评估各公司的代码安全控制情况。针对国内知名互联网公司,选取关注度高的开源项目,结合缺陷扫描工具和人工审计的结果,对各公司的项目安全性进行评比。

2、被测开源软件

本期报告聚焦国内知名互联网公司阿里巴巴、腾讯、百度、网易、新浪,综合考虑用户数量、受关注程度等情况,选取了这些公司旗下的20款具有代表性的开源项目,表1列出了本次被测的开源软件项目的概况。

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

项目名称

版本号

主要编程语言

公司名称

功能说明

代码行数(L)

Otter

4.2.12

Java

阿里巴巴

基于数据库增量日志解析的分布式数据库同步系统

122,473

Canal

1.0.24

Java

阿里巴巴mysql数据库binlog的增量订阅和消费组件

60,616

Fastjson

1.1.64

Java

Java语言的JSON解析、转换器

178,155

Dubbo

2.2.0

Java

高性能的基于Java的RPC开源框架

175,853

Tinker

1.8.1

Java

腾讯

为安卓应用提供热修复的解决方案,支持不重装APK的情况下的应用更新

43,506

Angel

1.2.0

Java

基于参数服务器理念开发的高性能分布式机器学习平台

96,456

PhxPaxos

0.9

C++

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

8,062

PhxRPC

0.8.0

C++

微信后台团队推出的轻量级RPC框架

3,841

Tera

2.7.0

C++

百度

一个高性能、可伸缩的结构化数据存储系统,被设计用来管理搜索引擎万亿量级的超链与网页信息

50,504

Sofa-pbrpc

1.0.0

C++

基于Google Protocol Buffers RPC框架实现的网络通信库

11,641

Protobuf RPC

3.5.9

Java

一种基于TCP协议的二进制RPC通信协议的Java实现

29,330

Familia

0.3.4

C++

工业级主题建模工具

1,658

Emmagee

2.4

Java

网易

一个实用的特定安卓应用的性能测试工具

4,824

Arrow

0.0.2

Java

主要供QA工程师使用的测试插件

1,973

Dagger

1.3.0

Java

网易杭州研究院QA团队开发的一个轻量级、运行稳定的WebUI自动化测试框架

2,558

Libpomelo2

0.3.5

C

Pomelo的客户端SDK

5,537

Motan

0.3.2

Java

新浪

用于高性能分布式服务快速开发的RPC框架

128,520

Yar-java

1.0.0

Java

对Yar协议的java实现

2,040

Prism

1.0.0

Java

实时数据分析平台

3,656

HTTPDNSLib

1.0.0

Java

域名解析服务库

43,187

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展示了各个项目高危、中危缺陷的数量,并按照高危缺陷数量对项目进行了排序,图中用蓝色折线图展示了每千行包含缺陷数。

在本次被测软件中,来自新浪的两款软件Yar-java(对Yar协议的java实现)、Prism(实时数据分析平台)和来自网易的测试插件Arrow不存在高危缺陷,同时中危缺陷数量也较少,总体安全性较高。来自新浪的域名解析服务库HTTPDNSLib在本次被测的20款软件中高危缺陷居多。在72个高危缺陷中,存在53个不安全的随机性问题,如果程序依赖于这些随机数产生密钥、个人凭证等敏感数据,将造成严重的安全隐患。作为APP特有的缺陷,本次还检测出33处Activity劫持风险,提示该应用的界面存在被恶意软件覆盖从而导致用户输入的敏感信息泄露的风险;此外,该软件被检测出30处权限相关问题,包括冗余权限、缺少权限等。

阿里巴巴的RPC开源框架Dubbo也包含了数量较多的高危缺陷。在70个高危缺陷中,除包括跨站脚本(10个)、空指针引用(8个)等常见缺陷外,还包括21个XMLSchema问题,由于未指定元素的最大出现次数(maxOccurs),导致攻击者可构造特定的XML文档以耗尽系统资源。

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

中高危缺陷总数最多的是来自百度的数据存储系统Tera,124个中危缺陷中包含107个危险函数,主要是C++的memcpy、strcpy等内存、字符串操纵函数,由于未做严格的边界检查,导致存在缓冲区溢出的风险。

考虑到项目的绝对缺陷数量可能与项目大小相关,因此本报告计算了每千行缺陷数,用该数据反映缺陷在项目中的分布密度。根据该数据,代码安全性最好的前5个项目依次是来自阿里巴巴的Fastjson(0.03)、Otter(0.16)、Canal(0.18)、来自新浪的Motan(0.21)和来自腾讯的Angel(0.39)。而缺陷分布密度相对较高的项目是来自网易的Libpomelo2(14.45)、Emmagee(4.98)、Dagger(3.52)、来自新浪的HTTPDNSLib(3.43)、来自百度的Tera(3.11)。可以看到,不同项目的缺陷密度差别巨大,其中阿里巴巴的Fastjson项目平均大约每3万行代码会出现一个缺陷,而网易的Libpomelo2项目平均大约每70行代码就会出现一个缺陷。

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

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

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

由于每个公司的项目被检测出缺陷的绝对数量与项目数量、项目大小相关,不能直接反映公司的产品安全性,因此本部分重点关注每千行缺陷数。根据该数据,阿里巴巴的总体产品安全性较高,平均每一千行代码仅包含0.3个安全缺陷。网易的总体产品安全性在5个公司中较差,平均每千行缺陷数量是阿里巴巴本次抽样产品的近26倍。

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

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

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

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

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

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

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

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

在上一期的开源软件安全缺陷分析报告中,选取了国外知名互联网公司Google、Twitter、Facebook旗下的12款开源项目进行安全性评估。结合上期报告的评估结果,本部分将国内外互联网公司的产品安全情况进行对比。由于项目的绝对缺陷数量与项目大小有关,因此本部分主要针对安全缺陷密度(即每千行代码平均包含的安全缺陷数量)开展对比。图6展示了国内外互联网公司产品的缺陷密度对比情况。可以明显看到,总体而言,这三家国外公司在产品的安全缺陷方面控制的较为严格,其产品安全性显著优于国内互联网公司的平均水平,国内互联网公司的软件开发安全意识有待提高。同时值得一提的是,根据本次评估结果,阿里巴巴在产品安全缺陷控制方面表现不俗,能够代表国内一流水平,且优于国外公司Twitter。

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

“关于本报告的说明”

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

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

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

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

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