近日,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函数调用都标记成缓冲区溢出缺陷的可信程度很低。严重程度是指假设测试技术真实可信的情况下检出问题的严重性,比如缓冲区溢出通常是比变量未初始化更严重的安全问题。将这两个因素综合起来可以准确的为安全问题划分级别。
|