近日,CNCERT发布了《开源软件代码安全缺陷分析报告——框架类软件专题》。本期报告聚焦国内外知名框架类开源软件安全开发现状,通过多款知名框架类开源软件产品的安全缺陷,评估开源项目的代码安全控制情况。360代码卫士团队为本期报告提供了技术支持。
1、概述
随着软件技术飞速发展,开源软件已在全球范围内得到了广泛应用。数据显示,99%的组织在其IT系统中使用了开源软件。开源软件的代码一旦存在安全问题,必将造成广泛、严重的影响。为了解开源软件的安全情况,为了解开源软件的安全情况,CNCERT持续对广泛使用的知名开源软件进行源代码安全缺陷分析,并发布季度安全缺陷分析报告。
本期报告聚焦国内外知名框架类开源软件安全开发现状,通过多款知名框架类开源软件产品的安全缺陷,评估开源项目的代码安全控制情况。选取关注度高的开源项目,结合缺陷扫描工具和人工审计的结果,对各开源项目安全性进行评比。
2、被测开源框架
综合考虑用户数量、受关注程度以及更新频率等情况,选取了20款具有代表性的框架类软件。表1列出了本次被测的开源框架类软件项目的概况。本次检测的软件涵盖了C,C++,Java,PHP等编程语言。这些开源软件项目都是国际、国内知名的,拥有广泛用户的软件项目,其中不乏由知名软件公司开发的软件。由于这些软件大多具有巨大的用户群体,软件中的安全缺陷很可能会造成严重的后果。
表1 被测开源软件项目概览
项目名称 | 版本号 | 主要编程语言 | 功能说明 | 代码行数 |
---|---|---|---|---|
Laravel | 5.6.19 | PHP | laravel是web应用程序目录结构分析框架 | 2,570 |
Dubbo-Spring | 2.6.1 | Java | Spring 开发的RPC应用程序框架 | 4,123 |
Server_Framework | 1.0 | C | Server_Framework C语言实现的异步服务器框架 | 920 |
Codelgniter | 3.1.8 | PHP | PHP 网站开发者使用的 Web 应用程序开发框架和工具包 | 195,232 |
Kore | 2.0.0 | C | 可扩展web应用程序框架 | 3,494 |
Faker | 1.7.1 | PHP | PHP填充数据的库,可以往数据库里填写大量数据用于测试使用 | 104,594 |
WaFer | 1.0 | C | 基于C语言的轻量级,可伸缩性服务器端web应用程序框架 | 385 |
WebCollector | 2.7 | Java | 基于Java的开源Web爬虫框架 | 9,676 |
Kumuluzee | 1.0 | Java | Java EE应用程序微服务迁移框架 | 16,893 |
LibPhenom | 1.0.0 | C | 一个用于构建高性能和高可伸缩性的系统事件框架 | 38,355 |
Lce | 1.0.0 | C++ | 一款支持线程池、异步非阻塞、高并发、高性能的linux网络编程框架 | 3,761 |
Acl | 3.3.1 | C | 一个跨平台的网络通信库及服务器编程框架,同时提供实用功能库 | 492,744 |
Kvproxy | 0.1.0 | C++ | 一个数据库的代理框架 | 18,130 |
Yii2 | 2.0.15.1 | PHP | 一个适用于开发 WEB 2.0 应用的 PHP 框架 | 168,893 |
Cphalcon | 3.3.2 | PHP | PHP语言编写的C的扩展应用,提供了高性能,低资源消耗的Web框架 | 159,241 |
Datumbox | 0.8.1 | Java | 一个快速开发机器学习和统计应用的框架 | 45,986 |
Concordion | 2.1.2 | Java | 一个功能测试框架 | 30,572 |
Symfony | 4.0 | PHP | 一个基于MVC模式的面向对象的PHP5框架 | 433,742 |
Jodd | 4.3.2 | Java | 一套友好开发工具,微观框架 | 319,699 |
BioJava | 5.0.0 | Java | 用于处理生物学数据的一款Java框架 | 311,539 |
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分别展示了项目不同级别缺陷的数量,并按照高危缺陷数量对项目进行了排序,图中用蓝色折线图展示了每千行包含缺陷数 。
图2 开源软件项目缺陷情况
从中可以看出,本次选取的框架类开源软件都存在不同程度的安全问题。本次检测从这些项目中总计发现高危缺陷234个,中危缺陷105个。缺陷数量排名靠前的项目处于极易被攻击者利用的状态,实际使用者需通过安装补丁或者更新版本的方式进行修复和升级。
在所有被测软件中,中高危缺陷总数最多的是框架类开源软件Biojava,包含107个高危缺陷和21个中危缺陷。值得一提的是,这128个高中危缺陷包括路径遍历、资源未释放、XML外部实体注入等缺陷,一旦有恶意攻击者进行攻击或者恶意构造数据,可能导致非授权访问敏感目录、拒绝服务攻击等严重问题。此外,Java微框架 Jodd总体风险也较高,包含33个高危缺陷和17个中危缺陷,高中危缺陷中大多数为跨站脚本、权限绕过,这类问题同样可能被恶意攻击者利用,导致非授权访问、拒绝服务攻击等严重问题。
全部被测软件中,两款开源框架软件Wafer和Server_Framework虽然每千行代码缺陷较高,但由于这两款软件本身代码行数也较小,所以认为统计分析的指标性意义并不大。
4.2、高危安全缺陷分布情况
本部分对高危缺陷的分布情况进行分析说明。图3展示了被测项目中高危缺陷大类的分布情况。数据表明,大多数缺陷为“输入验证”类缺陷,该类缺陷主要是由于对用户输入未做充分验证导致的,易造成缓冲区溢出、路径遍历、跨站脚本及各类注入问题,一旦攻击者构造恶意输入,可能造成任意命令执行、任意文件读取等严重安全问题。
图3 被测项目中高危安全缺陷的分布情况
(按大类划分)
“安全特性”类缺陷也占据了一定份额,这类缺陷主要涵盖身份认证、数据加密等方面的问题,攻击者可利用该类缺陷实现越权访问,窃取隐私信息等。根据此次检测结果,多个软件存在“不安全的随机数”问题,这将严重降低软件抵御加密攻击的能力。图4进一步展示了被测项目中的各种具体的高危安全缺陷的分布情况。为方便展示,将出现不超过5次的缺陷统一归入“其他”,主要包括空指针解引用、API误用等问题。在被测的20个项目中,出现较多的几类缺陷是路径遍历(19%,43个)、访问说明符操纵(18%,42个)和XML外部实体注入(16%,38个)。下面对这三种缺陷进行简要说明,并给出防范建议。
图4 被测项目中高危安全缺陷的分布情况
(按具体缺陷划分)
1)路径遍历(属于输入验证与表示类缺陷)
危害:应用程序对用户可控制的输入未经合理校验,就传送给文件访问API。攻击者可能会使用一些特殊的字符(如“..”和“/”)摆脱受保护的限制,访问一些受保护的文件或目录。防范:严格验证用户的输入,建议创建合法资源名的列表,并规定用户只能访问其中的文件。
2)访问说明符操纵(属于输入验证与表示类缺陷)
危害:程序员可以绕过由java访问说明符提供的接入控制检查,导致程序私有字段、私有方法和行为被反向调用,可能产生未授权的命令执行等严重安全隐患。防范:对访问说明符进行合理的权限限制。
3)XML外部实体注入(属于代码注入缺陷)
危害:攻击者通过引入构造恶意内容的外部实体,可导致读取任意文件、执行系统命令,从而达到提权,获取敏感信息的目的。防范:验证所有输入数据,有效检测攻击。
4.3、安全缺陷总体分布情况
上文针对被测项目中的高危缺陷的检出情况对项目的安全状况进行了分析。通常来说,与高危缺陷相比,中危缺陷在实际运行环境中的危害相对较小,但仍不容忽视,且能在一定程度上反映出项目的代码质量、开发人员对代码安全问题的重视程度等。为了更全面的了解被测项目的安全状况,本节进一步展示包括中危缺陷在内的安全缺陷的总体分布情况。
图5展示了被测项目中安全缺陷大类的分布情况。与高危级别的缺陷分布情况相比,输入验证类、资源管理类、安全特性类缺陷仍然占比较大。其中,资源管理类缺陷问题通常是由于开发者遗漏了对系统资源的释放处理导致的,例如,流资源未释放,产生竞价条件等。与输入验证类问题相比,这类问题被直接用于发动攻击的可能性较小,但仍然会造成性能降低、程序不稳定等风险,严重情况下也会导致系统运行异常、甚至系统崩溃。
图5 被测项目中的中高危安全缺陷的分布情况
(按大类划分)
图6进一步展示了被测项目中的各种具体的中高危安全缺陷的分布情况。本次检测结果中有24种出现不超过10次的缺陷,如“文件包含”、“操纵设置”等,为方便展示,将其统一归入“其他”。在被测的20个项目中,出现较多的缺陷是是路径遍历(14%,47个)、资源流未释放(14%,46个)和访问说明符操纵(12%,42个)。下面对这几种缺陷进行简要说明,并给出防范建议。
图6 被测项目中的中高危安全缺陷的分布情况
(按具体安全缺陷种类划分)
1)路径遍历(属于输入验证与表示类缺陷)
危害:应用程序对用户可控制的输入未经合理校验,就传送给文件访问API。攻击者可能会使用一些特殊的字符(如“..”和“/”)摆脱受保护的限制,访问一些受保护的文件或目录。防范:严格验证用户的输入,建议创建合法资源名的列表,并规定用户只能访问其中的文件。
2)资源流未释放(属于资源管理类缺陷)
危害:应用程序未释放申请的资源,可能导致程序运行效率低下、资源耗尽等安全问题。防范:提高代码编写质量,及时释放使用完毕的资源。
3)访问说明符操纵(属于输入验证与表示类缺陷)
危害:程序员可以绕过由java访问说明符提供的接入控制检查,导致程序私有字段、私有方法和行为被反向调用,可能产生未授权的命令执行等严重安全隐患。防范:对访问说明符进行合理的权限限制。
关于本报告的说明
一、本报告仅从代码角度进行缺陷分析。本报告中统计的缺陷是指由于代码编写不规范导致的有可能被攻击者利用的安全隐患。在实际系统中,由于软件实际部署环境、安全设备等的限制,部分缺陷可能无法通过渗透测试得到验证。
二、本报告中的缺陷仅适用于表1中列出的特定软件版本。当软件版本有任何更新、修改和优化时,本报告不再适用。
三、本报告由360代码卫士团队提供部分技术支持。