软件中为什么会依赖开源组件?
在软件开发的过程中,我们往往会使用一些第三方或者开源的组件,来提供一些基础的功能或者服务,从而简化开发工作,提高效率和质量。例如,我们可能会使用 Apache Commons、Spring Boot、jQuery 等开源组件来实现一些常见的操作,如字符串处理、Web 开发、DOM 操作等。
使用开源组件的好处是显而易见的,它们可以帮助我们节省时间和成本,提供更多的选择和灵活性,以及获取最新的技术和创新。根据一项调查,超过 90% 的组织在他们的应用程序中使用了开源组件。这意味着现代的应用程序中,开源代码的比例已经超过了自定义代码。
为什么要排查软件中使用了哪些开源组件?
虽然使用开源组件有很多好处,但是它们也带来了一些风险和挑战。其中最主要的一个就是安全风险。由于开源组件的源代码是公开的,任何人都可以查看和修改它们。这就给了攻击者一个机会,他们可以利用开源组件中存在的漏洞,或者向其中植入恶意代码,来对使用这些组件的软件进行攻击。
根据另一项调查,78% 的代码库至少有一个漏洞,86% 的代码库中被调用的组件不是最新版本。这说明了很多软件在使用开源组件时,并没有及时更新和修复它们。如果不及时排查和解决这些问题,就可能导致严重的后果,如数据泄露、系统崩溃、法律诉讼等。
除了安全风险之外,还有一些其他的风险和挑战,比如:
- 许可证风险:不同的开源组件可能有不同的许可证协议,有些许可证可能会对软件的分发、修改、商业化等方面有一些限制或者要求。如果不遵守这些许可证协议,就可能面临法律纠纷或者声誉损失。
- 兼容性风险:不同的开源组件可能有不同的依赖关系、版本要求、API 接口等。如果不注意这些差异和变化,就可能导致软件出现错误或者无法正常运行。
- 维护性风险:开源组件可能会随着时间而变化或者停止更新。如果不及时跟进这些变化或者寻找替代方案,就可能导致软件出现过时或者无法维护的问题。
因此,为了保证软件的安全、合规、稳定和可持续发展,我们需要对软件中使用了哪些开源组件进行有效地排查,并及时采取相应的措施。
如何排查软件中使用了哪些开源组件及具体版本?
要排查软件中使用了哪些开源组件及具体版本,我们需要有一个准确和完整的组件清单(SBOM),也就是一个包含了所有第三方和开源组件及其相关信息(如名称、版本、许可证、位置、依赖关系等)的列表。
有了这个清单,我们就可以对软件中的每个组件进行分析和评估,比如:
- 检查组件是否有已知的漏洞或者安全风险,如果有,就需要及时更新或者替换组件。
- 检查组件是否有合适的许可证协议,如果没有,就需要避免使用或者获取授权。
- 检查组件是否是最新的版本,如果不是,就需要考虑是否有必要升级或者降级组件。
- 检查组件是否有冲突或者不兼容的情况,如果有,就需要解决或者调整组件。
那么,如何获取这个组件清单呢?有以下几种常见的方法:
- 手动检查:这是最简单也最不可靠的方法,就是通过人工的方式,查看软件中使用了哪些组件及其相关信息。这种方法的缺点是非常耗时和容易出错,而且很难保持清单的更新和完整。
- 解析包管理文件:这是一种比较常用也比较有效的方法,就是通过解析软件中使用的包管理工具(如 Maven, NPM, Pip 等)生成的包描述文件(如 pom.xml, package.json, requirements.txt 等),来获取组件的信息。这种方法的优点是比较快速和准确,而且可以覆盖直接和间接的依赖。但是这种方法也有一些局限性,比如:
- 不同的包管理工具可能有不同的格式和规范,需要进行转换或者适配。
- 一些组件可能没有使用包管理工具来管理,而是直接下载或者复制到软件中,这样就无法通过包描述文件来获取它们的信息。
- 一些组件可能在运行时才动态加载或者生成,而不是在编译时就确定,这样就无法通过包描述文件来获取它们的信息。
- 构建软件项目:这是一种比较全面也比较复杂的方法,就是通过构建软件项目的过程,来获取组件的信息。这种方法的优点是可以覆盖所有类型和来源的组件,而且可以获取更多的细节和元数据。但是这种方法也有一些挑战,比如:
- 需要配置和运行构建环境和工具,可能会遇到一些技术或者资源上的困难。
- 需要处理构建过程中可能出现的错误或者异常,可能会影响构建结果和效率。
- 需要分析和提取构建过程中产生的大量数据和日志,可能会增加复杂度和开销。
有什么常用的工具可以自动生成软件依赖的开源组件列表?
根据上面介绍的方法,我们可以看出,排查软件中使用了哪些开源组件及具体版本并不是一件容易的事情。幸运的是,有一些专业的工具可以帮助我们自动生成软件依赖的开源组件列表,并提供一些额外的功能和服务,来帮助我们管理和优化我们的开源使用。下面介绍一些常用的工具:
- 墨菲安全(苏木):这是一个专业的软件供应链安全管理平台,它可以帮助我们快速、准确、全面地分析我们的代码中使用的所有开源组件,发现并修复其中存在的安全风险和合规问题。它的主要特点和优势有:
- 快速接入:它可以在 3 分钟内快速配置接入超过十种开发工具,如 IDE, GitLab, GitHub, Jenkins 等,无缝集成到我们的开发流程中,一键修复安全漏洞。
- 深度分析:它可以持续地检测我们的代码中使用的所有开源组件,并与一个包含超过 300 万个开源库的数据库进行对比。它可以生成详细的 SBOM 清单,包括依赖、许可证、位置、版本、漏洞和合规性等信息。
- 智能修复:它可以提供一些智能的建议和修复方案,来帮助我们优化我们的开源使用。它可以自动更新或者替换有风险的组件,避免或者解决许可证冲突,提升代码质量和安全性。
- 专业知识库:它拥有全球领先的专业漏洞知识库,包括独家的 0day 漏洞及投毒情报,超过 25 个专业的漏洞知识库字段。它可以及时有效地提供漏洞预警和通报,帮助我们防患于未然。
工具官网:https://www.murphysec.com
- OSS Review Toolkit (ORT):这是一个开源的软件策略自动化和编排工具集,可以帮助我们以战略、安全和高效的方式管理我们的(开源)软件依赖项。它可以生成 CycloneDX, SPDX SBOMs 或者自定义格式 的开源软件归属文档(Software Bill of Materials, SBOM),并提供一些分析和报告功能,如许可证合规性检查、漏洞扫描、策略评估等。它支持多种语言和包管理工具,如 Java, Python, NPM, Gradle 等,并可以与其他工具集成,如 Jenkins, GitHub Actions 等。
工具官网:https://github.com/oss-review-toolkit/ort
- Mend:这是一个专业的开源管理平台,可以持续地检测我们的代码中使用的所有开源组件,并与一个包含超过 300 万个开源库的数据库进行对比。它可以一键生成一个详细的开源组件清单报告,包括依赖、许可证、位置、版本、漏洞和合规性等信息。它还可以提供一些智能的建议和修复方案,来帮助我们优化我们的开源使用。它支持多种语言和包管理工具,如 Java, JavaScript, Ruby, PHP 等,并可以与其他工具集成,如 GitHub, GitLab, Bitbucket 等。
工具官网:https://www.mend.io/
以上就是一些常用的工具可以自动生成软件依赖的开源组件列表。当然,还有其他一些工具,如 Snyk, Black Duck, WhiteSource 等,也可以提供类似或者更多的功能和服务。我们可以根据我们的需求和偏好,选择合适的工具来帮助我们排查软件中的开源组件使用情况。