1、信息记录材料 2023 年 7 月 第 24 卷第 7 期基于 Dependency-Check 的开源漏洞扫描系统设计与实现刘宇博(湖南师范大学信息科学与工程学院 湖南 长沙 410081)【摘摘要要】随着科学技术的快速发展,互联网极大地改善了社会生活质量,越来越多的中小型互联网企业应运而生,但随之衍生的开源代码漏洞入侵问题也愈见增多。针对如何保障现代软件开发过程中,来自第三方的开源组件安全问题,介绍了开源漏洞以及漏洞检测的理论概念,分析了 Dependency-Check 漏洞扫描工具的组成成分及其代码结构,提出并实现了一个基于 Dependency-Check 的开源漏洞扫描系统。该系统
2、由漏洞数据库、扫描引擎、Web 页面三个部分组成。根据测试结果显示,该系统能够对第三方的开源组件进行全面有效的扫描,并生成最终的扫描报告。【关关键键词词】网网络络安安全全;开开源源漏漏洞洞;D De ep pe en nd de en nc cy y-C Ch he ec ck k 插插件件库库【中中图图分分类类号号】TP31 【文文献献标标识识码码】A 【文文章章编编号号】1009-5624(2023)07-0118-040 引言现代软件的开发 80%的代码都来自第三方资源库或组件,各种软件产品对第三方开源组件的依赖性很强。然而在程序开发设计阶段,开发者又经常忽略了开源代码的漏洞审查,从根本
3、上就缺乏了安全审计。如果某个资源库文件存在漏洞,那么大量使用了该库文件的软件程序都将面临安全威胁1。如 OpenSSL 出 现的心脏滴 血漏洞(Heartbleed)、Strusts2 出现的 Rce 漏洞和 Java 中的反序列化漏洞等,这些都是实际应用程序中,存在第三方资源库或应用框架漏洞的典型案例。这些开源代码很多都应用于信息系统的底层,且应用范围广泛,因此漏洞带来的安全危害非同一般。面对如此大规模的开源组件安全威胁,本文主要研究了基于 Dependency-Check 的开源组件漏洞检测技术,主要工作如下:(1)建立开源漏洞库。该漏洞库主要给扫描引擎提供漏洞特征。(2)分析 Depen
4、dency-Check 扫描组件,对漏洞进行特征匹配。对分析器扫描得到的源码、资源文件,通过与漏洞数据库的特征条目(如漏洞版本、通用名称 CVE、公告日期等)进行特征匹配,以此判断该开源组件是否存在安全隐患。(3)搭建 Web 界面。以 B/S(浏览器/客户端)的形式,将第三方组件以压缩包(rar/zip)的形式上传、检测和展示。1 开源漏洞及其相关知识1.1 漏洞及其成因漏洞,是指在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而使攻击者能够在未授权的情况下访问或破坏系统。即某个程序在设计时未考虑周全,当程序遇到一个看似合理,但实际无法处理的问题时,引发的不可预见的错误。一旦这些错
5、误被黑客或不法分子利用,就会造成不可挽回的损失。开源漏洞,即公开披露的、已知的漏洞。根据漏洞的危害程度可将漏洞等级分为 A、B、C 三个等级2。1.2 开源漏洞检测方法目前常用于开源漏洞的检测方法主要是通过安全扫描技术,检测组件中是否存在已公布的安全漏洞。安全扫描,也称为脆弱性评估,其基本原理是通过一系列文件分析器对文件进行扫描搜集信息,从而对检测目标可能存在的已知安全漏洞进行逐项检查。本文所设计的检测系统使用 Dependenncy-Check 中所包含的文件分析器来分析第三方组件中的组成成分,再采用特征匹配的方法,根据已知漏洞的特征定位到关键应用程序编程接口(application pro
6、gramming interface,API),并通过分析上下文环境来判断第三方组件中是否存在开源漏洞。2 系统设计本文系统采用 Dependency-Check 作为服务器程序,将Dependency-Check 二进制版本封装为 Web 接口。使用者只需登录浏览器网站便可以对第三方组件进行开源漏洞检测,并生成漏洞扫描报告。该漏洞扫描系统由以下几部分组成。2.1 漏洞数据库开源漏洞从公开披露到被纳入美国国家漏洞数据库(national vulnerability database,NVD)需要相当一段时间,这给使用开源软件相关组织带来极大的安全隐患。因此,一个专门针对开源漏洞的数据库是十分必
7、要的。针对开源漏洞的特点,开源漏洞数据库应具备以下几个特点:(1)更新及时,避免因漏洞纳入延迟而造成的危害。(2)提供精确的开源漏洞特征数据,提高漏洞扫描的准确率。(3)漏洞报告简单,减少收录发布漏洞时的工作量。本文设计的开源漏洞数据库主要依据中国国家信息安全 漏洞库(CNNVD),同 时参考 CNNVD 共享 平 台、WhiteSource 漏洞数据库(WSVD)等大型漏洞数据库,通过爬虫定期抓取 CNNVD、WSVD 的漏洞信息用于更新本地811信息记录材料 2023 年 7 月 第 24 卷第 7 期漏洞数据库。漏洞数据库包含扫描结果存储表和漏洞迹象表两部分。扫描结果存储表用于接收扫描引
8、擎返回的结果,便于结果的展示以及报告的生成。漏洞特征信息库用于存储漏洞特征信息,为漏洞扫描引擎模块提供必要的漏洞特征信息。2.2 扫描引擎扫描引擎模块通过文件分析器,分析组件成分生成分析结果,将分析结果与漏洞特征信息库中的数据作为输入数据,通过字符串搜索引擎进行特征匹配,进而完成第三方组件的开源漏洞检测,最后将扫描结果数据存储到扫描结果存储表中。2.2.1 扫描引擎设计与实现本文设计的扫描引擎模块基于 Dependency-Check 包含的文件分析器,对文件进行扫描搜集信息。我们将搜集到的信息称之为迹象;搜集了三种类型的迹象,分别是 vendor(供应商),product(产品)和 vers
9、ion(版本)。例如,jarAnalyzer 将从 jar 文件包中的 Mainfest、pom.xml 和包名进行信息搜集,并将从各个来源搜集到的信息放到一个或者多个漏洞迹象表中3。在漏洞迹象表中,每个漏洞都有一个 CVE 名称,每个 CVE 条目都有一个易受攻击的软件列表,这些易受攻击软件的 CPE(标准化名称 标 识)条 目 为“cpe:/Entry Type:Vendor:Product:Version:-Revision”。通过搜集到的迹象与迹象表中的 CPE 条目进行字符串匹配,如果匹配成功,分析器将会对相应的文件添加标识符并添加到扫描结果存储表中;一旦确认 CPE 条目后,关联的
10、 CVE 条目也将添加到扫描结果存储表中,并输出 XML 格式的分析报告,如图 1 所示。图 1 漏洞的 CVE 条目 2.2.2 文件分析器文件分析,是指对计算机外部存储设备中的某项调查活动形成的数据和程序运用电子计算机技术进行研究考察,以达到认识调查材料本质的目的。作为一个开发人员,查看文件的编码、开发工具以及类型是必不可少的;作为一个普通用户,了解未知的文件类型以及真实扩展名能间接地防止病毒的入侵和认识文件的用途4-5。本系统扫描引擎模块的核心在于文件分析器对文件的组成成分分析,从文件中提取关键的标识信息。本系统中的文件分析器及其扫描文件类型与分析方法如表 1 所示。表 1 文件分析器及
11、其扫描文件类型与分析方法分析器扫描的文件类型分析方法Archive压缩文件格式(.zip,.ear,.war,.jar,.sar,.apk);磁带存档格式(.tar);Gzip 格式(.gz,.tgz);Bzip2 格式(.bz2,.tbz2);RPM 格式(.rpm)提取压缩文件内容,使用所有可用的分析器扫描内容Assembly.NET 程序集(.exe,.dll)使用 GrokAssembly.exe,JarJava 存档文件(.jar);Web 应用程序归档文件(.war)检查档案RetireJSJavaScript 文件使用 RetireJS 数据库分析 JavaScript 文件No
12、de.JSNPM 软件包规范文件(package.json)解析 package.json 以收集 Node JS 项目的清单Node Audit使用 Node Audit 接口报告已知的易受到攻击的 Node.JS 库;需要互联网连接NugetconfNuget packages.config 文件使用 Xpath 解析规范 XMLNuspecNuget 软件包规范文件(.nuspec)使用 Xpath 解析规范 XM。OpenSSLOpenSSL 版本源头文件(opensslv.h)OPENSSL_VERSION_NUMBER 宏定义的正则表达式解析OSS Index使用 OSS Inde
13、x 接口报告 NVD 中未发现的漏洞;需要互联网连接RubyBundler-auditRuby Gemfile.lock 文件执行捆绑包审核并将结果合并到漏洞检测报告中 2.3 Web 页面 Web 页面设计的目的在于为用户提供可视化界面的操作接口,简化操作流程。其主要页面包括登录页面、文件上传页面、扫描结果页面等,如图 2 所示。911信息记录材料 2023 年 7 月 第 24 卷第 7 期图 2 Web 界面工作流程2.3.1 工作流程系统的整体工作流程如下:Step1:用户登录或注册账号;Step2:用户在 web 客户端发起扫描漏洞任务操作;Step3:服务器端接收 socket 传
14、递过来的任务 id 后,将用户上传的扫描信息存储至本地漏洞库;Step4:控制 dependecy-check 后台,创建扫描任务;Step5:dependency-check 对扫描目标进行扫描任务并将结果返回至控制后台;Step6:控制后台对扫描结果进行 xml 解析工作,并将解析后的内容存储至数据库中;Step7:用户从数据库中取出扫描结果报告。3 实验测试3.1 漏洞匹配的数据来源开源软件漏洞检测方法需要基于一定的漏洞集合,因此需要构建开源软件漏洞库。本文设计的开源软件漏洞库主要依据 CNNVD,通过爬虫定期抓取 CNNVD 的漏洞信息用于更新漏洞数据库。根据爬虫获取到的目标信息与开源
15、软件漏洞库进行特征比对、分析,我们将漏洞库大体分为输入验证、缓冲区溢出、API 误用、内存管理和信息泄露这 5 大类漏洞问题。本文采用的 7 大类漏洞问题的部分关键点如表 2 所示。表 2 漏洞问题及其对应关键函数漏洞问题对应关键函数输入验证insect,create,select,alter,update,exec,order,cookie,subject,system,command,open,close缓冲区溢出strcpy,strlen,strcat,strchr,scanf,sprintf,strerror,strcoll,sbumpc,strcnpy,cin,gets,fgets,
16、getchat,getc,getpass,malloc,istream,API 误用cin,gets,fgets,getchat,getc,getpass,memcpy,malloc,getParameter,equals,getProperty,read内存管理malloc,calloc,realloc,alloca,free,new,delete,memcpy,memmove,memcmp,memchr信息泄露malloc,calloc,realloc,alloca,memcpy3.2 测试结果展示首次使用 dependency-check 时会自动去 NVD 同步他的漏洞库,同步完成后
17、dependency-check 会对数据包进行扫描并与数据库中的漏洞进行匹配,最终生成该数据库的漏洞报告,如图 3 所示。图 3 iot-dc3-master 漏洞报告 该漏洞报告会指出包括依赖检查版本、报告生成时间、扫描的依赖项、易受攻击的依赖项以及最重要的发现的漏洞的数量多少。此时显示已发现的漏洞有四处并说明该漏洞的危害如何,如图 4 所示。4 结语针对广泛存在的开源漏洞问题,本文设计并实现了基于 Dependency-Check 的漏洞开源扫描系统,系统由漏洞数据库、扫描引擎、Web 页面三个部分组成,漏洞库主要给扫描引擎提供漏洞特征,扫描引擎完成信息提取、特征匹配、021信息记录材料
18、 2023 年 7 月 第 24 卷第 7 期图 4 iot-dc3-master 漏洞展示漏洞扫描等操作,Web 页面则优化丰富了用户的操作体验,提供可视化操作接口和详细的分析报告。通过实验测试得出的结束,该系统能够满足用户的需求,该系统的建立与测试得到国家级大学生创新创业训练项目支持,在实际应用场景中具备一定的可行性。【参考文献】1 王景中,王雷硕.基于 Nessus 的漏洞扫描系统设计与实现J.网络安全技术与应用,2012(11):21-23.2 贾培养,孙鸿宇,曹婉莹,等.开源软件漏洞库综述J.信息安全研究,2021,7(6):566-574.3 吴丹,刘嘉勇,贾鹏,等.基于特征匹配的 Android App 漏洞检测系统设计与实现J.网络安全技术与应用,2017(1):93-95.4 王博瑞.分布式漏洞扫描系统的设计与实现D.西安:西安电子科技大学,2015.5 赵书博.基于 OpenVAS 的漏洞扫描系统设计与实现 D.济南:济南大学,2016.基金项目:国家级大学生创新创业训练计划支持项目:基于Dependency-Check 的 开 源 漏 洞 扫 描 系 统 设 计 与 实 现(S20210542030)。作者简介:刘宇博(2001),男,内蒙古呼和浩特,本科,研究方向:计算机软件 Web 网页开发。121