据统计,目前互联网上的95%以上的应用都在使用第三方开源的程序库,67%的应用程序包含漏洞,确定的开源漏洞平均年龄1894天。
在当前的软件开发环境当中,为了节省时间和效率,我们在项目中大量的使用开源的第三方组件,这些组件由开源社区的程序员来开发,但是这些程序员对安全方面的了解几乎为0。结果可想而知,当我们在使用这些开源软件的时候,面临着多大的风险。下面主要介绍一下SCA 开源解决方案Depency-Check工具。
一、基本介绍
Dependency-Check是一种软件成分分析(SCA)工具,它试图检测项目依赖项中包含的公开披露的漏洞。它通过确定给定依赖项是否存在通用平台枚举(CPE)标识符来完成此操作。如果找到,它将生成一个报告,链接到相关的CVE条目。
Dependency-Check会检查当前可用于扫描Java和.NET应用程序,识别已知易受攻击组件的使用。用于Python,Ruby,PHP(composer)和Node.js应用程序是实验性质的分析器;这些都是实验性的,可能存在误报和漏报。要使用实验的分析仪,必须通过适当的实验配置专门启用它们。此外,Dependency-Check具有实验性分析器,可用于扫描某些C / C ++源代码,包括OpenSSL源代码以及使用Autoconf或CMake的项目。
Dependency-Check具有命令行界面,Maven插件,Ant任务和Jenkins插件。核心引擎包含一系列分析器,这些分析器检查项目的依存关系,收集有关依存关系的信息(在工具内称为证据)。然后,将证据用于识别给定依赖项的通用平台枚举(CPE)。如果标识了CPE,则会在报告中列出相关的常见漏洞和披露(CVE)条目的列表。其他第三方服务和数据源(例如NPM Audit API,OSS Index,RetireJS和Bundler Audit)用于特定技术。
Dependency-Check会使用NIST托管的NVD数据Feed自动更新自身。”重要提示“:数据的初始下载可能需要十分钟或更长时间。如果您至少每隔7天运行一次该工具,则只需下载一个小的JSON文件即可将数据的本地副本保持最新状态。
二、如何工作
Dependency-Check通过收集有关其扫描文件的信息(使用分析器)来工作。收集的信息称为证据,收集了三种类型的证据:供应商,产品和版本。例如,JarAnalyzer将从Manifest,pom.xml以及扫描的JAR文件中的包名称中收集信息,并且具有启发式方法,可以将来自各种来源的信息放入一个或多个证据桶中。
在NVD CVE数据(可在此处找到)中,每个CVE条目都有一个易受攻击的软件列表:
<entry id="CVE-2012-5055">
...
<vuln:vulnerable-software-list>
<vuln:product>cpe:/a:vmware:springsource_spring_security:3.1.2</vuln:product>
<vuln:product>cpe:/a:vmware:springsource_spring_security:2.0.4</vuln:product>
<vuln:product>cpe:/a:vmware:springsource_spring_security:3.0.1</vuln:product>
</vuln:vulnerable-software-list>
...
</entry>
这些CPE条目为 “cpe:/[Entry Type]:[Vendor]:[Product]:[Version]:[Revision]:…”.。收集CPE数据并将其存储在Lucene Index中。然后进行依赖性检查,使用收集到的证据并尝试匹配Lucene CPE Index中的条目。如果找到,CPEAnalyzer会将标识符添加到依赖关系,然后再添加到报告中。一旦确定了CPE,则将关联的CVE条目添加到报告中。
关于证据的重要一点是,使用不同的置信度对证据进行评级-低,中,高和最高。这些置信度适用于每个证据。确定CPE后,将给出一个置信度,该置信度等于在识别过程中使用的证据的最低置信度。如果仅使用最高置信度证据来确定CPE,则CPE将具有最高置信度。
由于Dependency-Check的工作方式,可能同时存在误报和漏报。Dependency-Check当前不使用文件哈希进行识别。如果依赖项是从源构建的,则哈希可能与“已发布”哈希不匹配。尽管当前使用的基于证据的机制也可能不可靠,但设计决策是避免维护已知漏洞库的哈希数据库。将来的增强可能会为非常常见的知名库(Spring,Struts等)添加一些哈希匹配。
三、文件类型分析器
Dependency-Check包含多个文件类型分析器,用于从分析的文件中提取标识信息。
分析仪 | 扫描的文件类型 | 分析方法 |
---|---|---|
Archive | 压缩文件格式(* .zip,。ear,。war,。jar,。sar,。apk,。nupkg); 磁带存档格式(* .tar); Gzip格式(* .gz,。tgz);Bzip2格式( .bz2,*。tbz2) | 提取压缩文件内容,然后使用所有可用的分析器扫描内容。 |
Assembly | .NET程序集(* .exe,*。dll) | 使用GrokAssembly.exe,它需要安装.NET Framework或Mono运行时。 |
CMake | CMake项目文件(CMakeLists.txt)和脚本(* .cmake) | 正则表达式扫描项目初始化和版本设置命令。 |
Jar | Java存档文件(* .jar); Web应用程序归档文件(* .war) | 检查档案清单清单元数据和Maven项目对象模型文件(pom.xml)。 |
RetireJS | JavaScript文件 | 使用RetireJS数据库分析JavaScript文件。 |
Node.js | NPM软件包规范文件(package.json) | 解析package.json以收集Node JS项目的清单。 |
Node Audit | 使用npm audit API报告已知的易受攻击的node.js库。该分析仪需要Internet连接。 |
|
Nugetconf | Nuget packages.config文件 | 使用XPath解析规范XML。 |
Nuspec | Nuget软件包规格文件(* .nuspec) | 使用XPath解析规范XML。 |
OpenSSL | OpenSSL版本源头文件(opensslv.h) | 正则表达式解析OPENSSL_VERSION_NUMBER宏定义。 |
OSS Index | 使用OSS IndexAPI报告在NVD中找不到的漏洞。该分析仪需要Internet连接。 | |
Ruby bundler-audit | RubyGemfile.lock 文件 |
执行捆绑审核,并将结果合并到依赖性检查报告中。 |
四、命令行方式使用
导入用于签署所有相关性检查版本的GPG密钥:gpg --keyserver hkp://keys.gnupg.net --recv-keys F9514E84AE3708288374BBBE097586CFEA37F9A6
。下载的依赖性检查命令行工具GitHub上发布,并从相关的GPG签名文件GitHub上发布。验证下载的加密完整性:gpg --verify dependency-check-6.0.5-release.zip.asc
。将zip文件解压缩到计算机上的某个位置,然后将“ bin”目录放入路径环境变量中。
Homebrew
$ brew install dependency-check
这会将可执行dependency-check
脚本放入/bin
您的自制程序安装目录中。要扫描系统上的文件夹,可以运行:
Windows
dependency-check.bat --project "My App Name" --scan "c:javaapplicationlib"
*nix
dependency-check.sh --project "My App Name" --scan "/java/application/lib"
要查看命令行参数,请参阅参数页面,或者可以运行:
Windows
dependency-check.bat --help
*nix
dependency-check.sh --help
延伸介绍
1、 RetireJS
http://retirejs.github.io/retire.js/
RetireJS是一个开源的工具,特别用于JavaScript程序的依赖检查。它包含如下组件: 一个命令行扫描器以及Grunt、Gulp、Chrome、Firefox、ZAP和Burp的插件。
RetireJS还做了一个站点检查服务,以供那些想找出自己使用的JavaScript库是否存在已知漏洞的JS开发者使用。
RetireJS从NIST NVD以及其他许多其他来源获取漏洞信息,信息途径包括邮件列表、错误跟踪系统和流行的JavaScript项目的博客。
RetireJS的Erlend Oftedal认为,安全是每个人的问题,需要更多的合作。”我希望看到流行的开源框架的作者们自己向Retire.js这样的工具报告安全修复,以便让他们的软件用户更安全。”
2、OSS Index
https://ossindex.net/
OSSIndex 支持多种技术平台的扫描。它从NPM、Nuget、Maven Central Repository、Bower、Chocolatey和MSI中提取依赖信息,它覆盖了JavaScript、.NET/C#和Java生态系统。
OSSIndex还免费提供了一个漏洞API。
OSSIndex目前从NIST的NVD中获取漏洞信息。OSSIndex的Ken Duck计划在不久的将来,可以从一些关键的邮件列表、数据库和错误跟踪系统中自动导入漏洞信息。
3、Bundler-audit
https://github.com/rubysec/bundler-audit
Bundler-audit是一个专注于Ruby Bundler的开源、命令行依赖检查器。该项目从NIST NVD和RubySec中检索漏洞信息,RubySec是一个Ruby漏洞数据库。
4、Dependency-check
https://www.owasp.org/index.php/OWASP_Dependency_Check
Dependency-check是一个来自OWASP的开源命令行工具,它维护得非常好,可以在独立模式下使用,也可以在构建工具中使用。Dependency-check支持Java、.NET、JavaScript和Ruby。该工具严格地从NIST NVD中获取漏洞信息。
原文始发于微信公众号(洋洋自语):SCA工具介绍
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/273010.html