软件成分分析(SCA)完全指南
上一篇文章中,我们讨论了 DAST 的概念、重要性及其工作原理。那在开发过程中如何查找开源软件包中的漏洞并学习如何修复?本指南带你一起了解 SCA 工具及其最佳实践。
如今,绝大多数代码驱动的应用程序都包括开源组件。但是,开源代码可能包含一些致命的漏洞,比如 Log4Shell 漏洞。
软件成分分析(SCA)是查找开源软件包中的漏洞并学习如何修复它们的最佳选择,确保代码和应用程序处于安全状态。本指南将带你一起了解使用 SCA 工具时的最佳实践。
什么是软件成分分析 SCA?
软件成分分析 Software Compostition Analysis(SCA) 是一种用于管理开源组件应用安全的方法。通过 SCA,开发团队可以快速跟踪和分析引入项目的开源组件。同时,SCA 工具可以发现所有相关组件、支持库以及它们之间直接和间接依赖关系。SCA 工具还可以检测软件许可证、已弃用的依赖项以及漏洞和潜在威胁。扫描过程会生成物料清单 Bill of Materials(BOM),从而提供项目软件资产的完整清单。
SCA 本身并不新奇,但随着开源组件的普及和广泛应用,SCA 逐渐成为应用程序安全项目的关键部分,而 SCA 工具数量也随之激增。包括 DevSecOps 在内的现代软件开发实践中,SCA 需要便于开发人员使用,同时也能让安全团队能够有能力在软件开发生命周期 Software Development Life Cycle (SDLC)内引导和指导开发人员安全地进行开发。
为什么要使用 SCA?
开源组件俨然成为每个垂直领域软件的主要部分。而 SCA 工具有助于跟踪应用程序使用的开源组件,这从生产和安全角度来看都至关重要。
安全漏洞带来的惨痛代价
Gartner 预计超过 70%的应用程序因使用开源组件而产生缺陷和漏洞。正如美国征信巨头 Equifax 的案例所表明,这些漏洞可能会给企业和组织带来灾难性后果。
在此事件中,Equifax 最初表示,网络犯罪分子利用 Apache Struts 的漏洞获取文件。随即,Equifax 在公告中确认,先前披露和修复的漏洞是就是在这次数据泄露事件中恶意攻击者所利用的漏洞,当时这个漏洞的评分有 10 分之高。而 Equifax 在漏洞出现后没有及时修复,黑客利用其系统中未修复的 Apache Struts 漏洞发起攻击,导致 1.43 亿用户的信用记录被泄露,其中包括姓名、出生日期、地址,以及驾驶证号码等,这是有史以来规模最大的数据泄露案。最终,此案以 Equifax 支付 7 亿美元的赔偿金和罚款,索赔期限延长四年落幕。
Equifax 漏洞事件成为安全行业,尤其是应用程序安全的重要标志,因为它强调了控制措施的重要性,开源组件引入的风险应当得到管理。该漏洞也揭示了对速度的要求,企业需要能够快速,重复地查找和修复他们正在使用的开源软件包中的漏洞。而在 Tidelift 2022 年开源供应链报告中显示,有 57%的企业认为,即使有现代安全工具的助力,在使用开源进行开发时识别和解决安全漏洞仍然是一项巨大的挑战。
为什么 SCA 这么重要?
越来越多的应用程序由开源代码组成。据估计,开源代码占到了应用程序代码的 90%。实际上应用程序是由不同的组件组成,企业需要保证所有的组件成分都是安全的,这样才能够有效地管理和降低风险。这也正是企业在确保代码库安全时所面临的挑战。
开源已成为软件领域的中流砥柱
软件正在吞噬世界,而开源在吞噬软件。在当今竞争激烈的市场中,开源能够帮助公司将服务数字化,让企业在市场中获得一定的竞争优势。
开源是怎样帮助企业实现服务数字化的呢?当企业在进行软件开发时,从零开始构建消耗大量的时间和资源。而使用提供完全相同功能的开源软件包能够有效降低这些成本。
开源本质上是高度灵活的。在社区的支持和严格审查下,开源通常很安全。同时,免费的开源软件和组件能够帮助企业和组织避免软件厂商的束缚。
在 Tidelift 最近的一项研究中,68%的受访者指出,节省资金和开发时间是企业鼓励使用开源组件进行应用程序开发的首要原因。而 48%的受访者则表示,使用开源是为了提高应用程序开发和维护效率。开源的使用在新冠疫情之前就达到了顶峰,而疫情的出现加速了采用率。Gartner 预计,90% 的企业应用程序将依赖于开源的使用。
当今的软件供应链
开源是构成现代云原生应用程序的一部分。如今,应用程序更多是组装而非从零构建。除了开源软件包之外,应用程序还由专有代码、容器和基础设施组装而成,成为软件供应链的组成部分。而软件供应链中的这些组件和模块也是恶意攻击的潜在目标。利用软件供应链中的漏洞能对整个应用程序,进而扩大攻击面。
以 Octopus Scanner 恶意软件为例,它通过滥用构建过程影响整个供应链,经过该供应链产生的工件影响其他项目。受影响的项目可能会被许多不同的系统克隆、Fork 和使用,也就是所说的“套娃”攻击。而最近的 SolarWinds 攻击主要针对特定软件,这也进一步证明了现代软件供应链给企业和组织带来的风险越来越大。
开源 ≠ 安全
开源项目被认为使用起来更安全。毕竟当整个社区参与维护和开发项目时,问题常常被更快地识别和修复。这当然包括安全漏洞在内的各种 bug。话虽如此,这并不代表开源是没有风险的。
开源项目是公开的,且对所有人都是可见。当然也包括恶意攻击者。在其中发现并修复的任何漏洞都会暴露给潜在的攻击者。开源项目越受欢迎,该软件包的吸引力就越大,而对应事件的攻击影响也就越大。
当然企业使用开源组件需要自担风险,因为没有供应商通知他们缺陷,或者签署的合同让他们摆脱责任。
SCA 五大挑战
如前文所述,SCA 是应用程序安全方法和工具的总称,这些方法和工具通常在开发期间扫描应用程序(如 SAST),来定位应用程序中使用的开源组件,并随后识别安全漏洞和软件许可证问题。为了有效管理和降低这些开源组件带来的风险,企业将面临一系列与利用开源构建现代应用程序的方式相关的风险与挑战。
1. 代码的低可见性
将开源代码嵌入到应用程序代码库中的方式带来了巨大的可见性挑战。开发人员可能会直接在代码中使用许多开源包,而这些包又包含一些开发人员不了解的其他开源包。这些直接或可传递的依赖关系复杂多层,因此很难对应用程序实际使用的开源进行端到端的可见性。
而绝大多数安全漏洞都存在于复杂多层的关系中。Snyk State of Open Source Security 报告发现,超过 86%的 .js 节点漏洞是在可传递依赖项中发现的。在 Java 和 Ruby 上也发现了类似的数字。这意味着应用程序中的绝大多数安全漏洞通常都能在开源代码中找到,开发人员甚至不知道他们使用了这些代码。
云原生应用程序以另一种方式利用开源,这同样可能会给企业带来代码可见性的难题。容器镜像可以由各种开源组件组成,这些组件还需要识别和测试漏洞。容器为开发人员提供的抽象层,从开发的角度来看是一个优势,从安全角度来看也是一个弱点。
2. 依赖关系错综复杂
为了准确识别应用程序正在使用的依赖关系以及它们引入的漏洞,需要深入了解每个生态系统如何处理依赖关系。开源包在安装时的解析、锁定文件、开发依赖关系 - 所有这些都是影响如何识别开源包中的漏洞并将决定后续修复步骤的要素。SCA 解决方案需要理解这些细微差别,以避免产生过多误报。
3. 漏洞数量持续增加
由于已识别的漏洞数量庞大,因此掩盖了漏洞的可见性及其对企业构成的风险。Snyk Intel 漏洞数据库增加了 10000 多个漏洞,也反映了漏洞数量的持续增长。
这些上升趋势会体现在已识别且需要注意的漏洞列表中,其中通常由数千个问题组成。鉴于开发和安全团队可支配的资源有限,如果没有一定的安全技能或嵌入高级安全专业知识的工具,就很难确定工作的优先级。基于通用漏洞评分系统 CVSS (Common Vulnerability Scoring System)是评估风险和确定工作优先级的常用方法,但这个方式存在一些固有的弱点需要在使用时特别注意。
4. 不易找到完善的漏洞数据库
有关已知漏洞的信息较为分散。国家漏洞数据库(NVD)通常用于接收有关漏洞的更新,但其他来源(如问题跟踪器、在线论坛、安全新闻通讯等)也能提供大量有关漏洞的安全情报。NVD 也可能无法及时添加漏洞。例如,NVD 中 92%的 JavaScript 漏洞都是事先添加到 Snyk 中的。及时了解漏洞很重要。
5. 安全检查降低开发速度
开发人员的开发节奏很快,而安全团队却很难赶上。由于需要更快、更频繁地交付代码,开发人员越来越多地使用到开源。缺乏人力和资源的安全团队试图在软件开发生命周期的各个不同阶段进行安全检查,但这实际上导致开发速度减慢。然而减慢的开发节奏可能对整体应用程序安全更不利,因此这些检查最终会被绕过或忽略。
因此,在安全模型中出现了 DevSecOps 和安全防护左移(Shift Left)的概念,即将安全责任转移到开发团队中,以确保对开发工作流的干扰最小,同时确保安全性。
SCA 的 6 个最佳实践
软件组合分析 (SCA) 工具是查找开源包中的漏洞并学习如何修复它们的最佳选择,保护代码和应用程序的运行状况。在使用 SCA 工具时,请参考以下六个最佳实践。
1. 使用开发者友好的 SCA 工具
开发人员忙于写代码。他们需要全面思考,高效设计,并快速迭代。因此对开发人员不友好的 SCA 工具会减慢开发节奏。而便于开发人员使用的 SCA 工具能够轻松设置和使用。它应该简单地与现有的开发工作流和工具集成,并尽早在软件开发生命周期(SDLC)中集成。
在确定工具后,也需要给开发人员普及 SCA 的重要性以及用处。让开发人员明确从开发初期就考虑安全问题,并将安全检查完善到他们的工作流程中。这将有效避免开发人员因为修复安全问题而重写代码所花费的时间。
2. 了解依赖关系
开源包有两种依赖关系:直接依赖和传递依赖。直接依赖项,就是你直接使用在项目里的开源包。而直接依赖项之一使用的开源包,便是传递(间接)依赖项了。
分析表明,开源软件包中 80%的漏洞存在于传递依赖关系中。这意味着代码中的大多数漏洞都包含在未知且正在使用的(嵌套)依赖项中。而一个优秀的 SCA 工具,应该准确地检查代码中的所有依赖项,并且应该能够识别和检查传递依赖项。了解代码中使用的开源包的深度和复杂性,能够确保在各个级别都进行合适有效的漏洞检测。
3. 自动扫描与可操作修复
一个好的 SCA 工具可以为企业提供定期运行自动扫描的选项。利用这一点,企业可以来设置对代码的主动和持续监控。自动扫描能够提供有关漏洞所在位置以及如何修复漏洞的可操作警报。请认真对待 SCA 工具提供的修复漏洞的方向,采用该方向来应用修复程序。
4. 将 SCA 集成到 CI/CD 流水线中
使用 SCA 工具并不意味着需要在开发—测试—生产过程中停滞下来。相反,企业应该将 SCA 扫描集成到 CI/CD 流水线中,以便识别和修复漏洞,并成为软件开发和构建过程中的一个功能部分。同时,这也可以帮助开发人员更轻松地适应代码安全作为其日常工作流程一部分。
5. 利用报告及物料清单
包括美国联邦政府在内的许多组织,在购买软件时都要求包含软件物料清单 (SBOM) 报告。在产品中提供详细的物料清单表明企业了解跟踪应用程序内每个组件的价值。有关安全扫描和修复的清晰报告也非常强大。提供有关企业的安全实践和修复的漏洞数量的详细报告,表明对软件安全的承诺和践行。
6. 加强安全策略,提高许可证合规性
清楚地了解开发人员使用的开源包,将有助于企业创建定义和实施安全准则的策略。企业可以使用通过漏洞扫描获得的知识,指导开发人员在使用开源软件包时考虑安全性。
跟踪开源代码本身对于应用程序安全很重要,同时跟踪开源许可证对于合规性也至关重要。开源许可证明确了开源软件包的法律使用条款,使用 SCA 工具能够帮助企业深入了解开源组件的许可条款和条件。在制定安全策略时,企业也需要鼓励开发人员在软件开发生命周期初期采用许可证合规性的规范。
SCA 的未来
鉴于开源的日益普及,以及最近违规和网络攻击的宣传,大众对 SCA 的关注热度逐步上升。开源在推动数字化转型中所扮演着不可忽视的角色,而这个趋势在近期几乎不会发生改变。
企业使用开源来帮助他们在各自的市场中拥有竞争优势。同时,人们逐渐意识到,他们必须控制开源的使用来管理和减少其伴随的风险。当 SCA 工具能够满足我们所提到的这些关键需求,将能成功帮助企业在市场中更好地竞争。
参考链接:
Equifax 信息泄露案落幕
https://www.secrss.com/articles/39075
TideLift: 2020 managed opensource survey
https://tidelift.com/subscription/2020-managed-open-source-survey
版权声明: 本文为 InfoQ 作者【SEAL软件供应链安全】的原创文章。
原文链接:【http://xie.infoq.cn/article/5369d9323a55d879b8edd1bcf】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论