开源软件在软件开发中的应用越来越广泛,但开源软件的使用也带来了不容忽视的安全威胁,开源软件中的漏洞容易直接被引入,企业安全合规面临的新挑战也在逐渐增加。
为了对开源软件进行管理,软件成分分析(Software Component Analysis, SCA)工具被用来分析易受攻击的组件。然而对于 SCA扫描的结果,业界还没有一个公认的标准和基本规范。

为此,Scantist特别推出「SCA工具对比分析和应用解读」系列,提供系统性评估SCA工具的指南,旨在为大家带来基本知识框架和优化实践的紧密关联,为行业提供有价值的参考信息和解决方案。
如何满足企业的需求变化又要考虑解决方案的适配性?
基于企业的安全视角,专业化的开源组件管理工具在安全治理工作中可以发挥很大作用。Scantist科研团队经过探索与验证,总结了 SCA工具应该解决的问题和挑战,以提供更加标准和精确的组件检测服务。在此基础上,我们提出了SCA范围指南(以下简称SSG),该指南适用于对所有语言平台的扫描,例如Java、C/C++、Golang、Python、JavaScript等组件语言类型。
Maven是最著名的 Java包管理器,它由一组插件组成,用来管理项目中的组件。现有的 SCA工具依赖于 Maven依赖插件来分析 POM文件以检测 Java项目中的组件。为了更详细地研究对Maven项目的扫描,我们对Maven中的各种设置展开研究并设计出完整的模型来进行指导。我们对7个开源和商业 SCA工具进行了实证研究,以揭示它们对指南和基准的支持。
我们进一步对比并研究了每个工具的漏洞发现能力、可达性分析能力、提供补救能力和检测许可能力。此外,我们还对 SCA的其他方面的工具进行了评估,包括效率、 CVE检测、 CVE可达能力分析、补救建议和许可证冲突解决。
SCA工具面临的挑战
1. SCA扫描算法
开源软件组件可以通过不同的方式被导入项目中。单独的组件检测算法无法检测到所有的通过不同的方法导入的组件。
首先,最常见的导入组件的方式是使用软件包管理器,例如 Java项目的 Maven。包管理器的作用是维护依赖关系信息并将这些明确地存储在清单文件中。SCA工具应当借助包管理器的功能或者元文件(例如pom.xml)所提供的信息来查找所有与项目相关的组件。
其次,有的项目是通过导入二进制文件的方式引入依赖。SCA工具应当能够对二进制文件进行扫描并收集其依赖信息。通常会有程序员选择直接手动从其他软件库复制粘贴源代码到自己的项目中。SCA工具也应该能够对这种舶来的关键函数进行识别。
而根据我们的观察, SCA工具支持所有导入方法是一个很大的挑战,目前还没有工具能够完全做到这点。
2、SCA扫描模式

图1:采用扫描模式的DevSecOps
在软件开发的不同阶段采用适当的扫描方式可以提高安全性。图1显示了具有适当 SCA扫描模式的标准 DevSecOp生命周期。为了在整个生命周期中保护项目, SCA工具可能需要支持所有类型的扫描。但是,这对所有工具来说都是一个巨大的挑战。大多数工具只关注一种扫描模式。本文中,我们为 Maven源代码项目的build scan和 pre-build scan提供指导。随着“安全左移”思想的流行,对源代码的扫描变得非常重要。因为从源代码扫描中, SCA工具不仅可以借助元文件、包管理器获取充足的信息,而且还能在代码开发的较早阶段就提供警告。
Build Scan和Pre-build Scan是源代码最重要的两种扫描方式。
Build Scan指具有项目完整编译环境下,SCA工具借助包管理器功能(例如mvn dependency:tree) 获取完整依赖树的过程。DevSecOps 的设计者建议在 Build阶段进行这种扫描,因为 SCA工具可以直接从包管理器导出依赖关系列表。支持这种扫描方式的有OWASP,Eclipse Steady等工具。
Pre-build Scan是一种在没有构建或构建项目之前发生的源代码扫描。它通过解析清单文件(例如, POM文件)来检测组件目录,该过程通常发生在诸如 GitHub 或 Gitee 的在线代码仓库中。一旦添加了新的组件信息,Pre-build Scan可以在早期检测并帮助开发人员识别潜在的风险。这也意味着他能够在整体代码还处于开发阶段的初期就提供风险指导。支持这种扫描方式的有GitHub的Dependabot Alerts。
3. Maven 中的SCA扫描
在处理build Scan时, maven可以自动处理依赖关系分析。但是对于pre-build而言,SCA工具不仅需要获取最表层的直接依赖,更要通过已有信息推断间接依赖以还原整棵依赖树。因此, SCA工具需要在充分理解和支持Maven POM中各项设置(我们称之为“特征元素”)的基础上构造整个依赖关系结构。我们对Maven的特征元素进行了详细的研究和分类,包括dependency Management, parent, exclusion等,保证工具能够在pre-build中尽可能翔实地还原依赖树的全貌。
为了验证市场主流工具对build Scan和pre-Build Scan的支持程度,我们对市面上常用的SCA工具进行了对比分析,包括Dependabot Alerts、OWASP Dependency Check、OSS Index、Eclipse Steady及Scantist SCA。

表1:部分SCA工具的特征元素支持条件
分析小结
从表1中可见,在Pre-build Scan过程中,大多数 SCA工具只能检测当前 POM文件中列出的组件,而不能检测那些从parent POM文件中继承的组件。另外,许多引用到parent POM中的 dependency management依赖不完整。因此,只关注当前POM会丢失的跨项目信息。现有的工具不仅要提高对元素模型的覆盖率,还要从用户那里收集更多的部署设置。
除了Dependabot以外,其余的SCA工具都支持Build Scan。目前只有Dependabot和Scantist支持Pre-build scan,且仅有Scantist同时支持两种扫描模式。
SCA应要能够在整个SDLC中扫描所有可交付的工件。SCA几乎在SDLC的每个阶段都需要扫描,而各阶段之间的组件是不同的,扫描模式也不同,扫描要求随着SDLC的变化而变化。因此,在不同的场景中完成扫描是必要的。
Scantist自研引擎可提供源代码多种扫描方式,以检测不同语言及文件识别所有开源及三方组件,支持映射组织依赖关系,同时支持项目级、依赖级、文本级、代码片段级许可证识别,通过项目检测功能调用不同检测引擎分析项目及识别风险,查询SCA数据库确定组件及版本,提供许可证检测和漏洞修复建议。
目前Scantist SCA可以免费申请使用,对使用Scantist SCA帮助管理开源安全和合规性风险感兴趣的企业用户可以点击【这里】自行去注册使用。
SCA工具对比-研究论文下载方式
直接在本文章回复评论,即可获取(完整版) 下载链接。