C6:确保组件安全
描述
在软件开发中,利用库和框架是一种常见做法。具有内嵌安全功能的库和软件框架有助于软件开发人员防止与安全相关的设计和实现缺陷。
从零开始编写应用程序的开发人员可能没有足够的知识、时间或预算来正确实施或维护安全功能。利用安全框架(包括开源和供应商提供的)有助于更高效、更准确地实现安全目标。
在可能的情况下,重点应放在利用框架现有的安全功能上,而不是导入又一个需要定期更新和维护的第三方库。最好让开发人员利用他们已经使用的东西,而不是强制他们使用另一个库。
将第三方库或框架整合到软件中时,考虑以下两类最佳实践非常重要:
- 识别可引入到软件中的可信库和框架。
- 监控和更新软件包,以确保您的软件不会受到第三方组件可能引入的安全漏洞的影响。
威胁
- 攻击者可能利用过时第三方组件中已知漏洞,获取未经授权的访问或执行恶意代码。
- 攻击者可能通过入侵开发过程中使用的库或框架来发动供应链攻击,从而可能将恶意代码植入最终产品。
- 攻击者可能通过利用未正确加固的第三方组件中的不安全配置来提取敏感信息。
- 攻击者可能通过针对外部库中的已知漏洞发起拒绝服务攻击,从而可能中断服务的可用性。
实施
以下将对这些类别进行进一步详细说明,以帮助保护您的软件安全。
识别可信库的最佳实践
以下列出了一些可用于为您的软件选择下一个库或框架的标准。这并非一份详尽的列表,但它是一个良好的开端。
-
来源:通过安全链接从官方来源下载推荐的安全库,并优先选择已签名的软件包,以减少包含修改过的恶意组件的可能性(参见A08:2021-软件和数据完整性故障)。
-
流行度:利用被众多应用程序使用并拥有庞大社区的库和框架。考虑诸如软件包源代码库在GitHub上获得的星数,以及从软件包管理器中下载的次数等数据点。
-
活跃度:确保库/框架得到积极维护,并且问题得到及时解决。
-
成熟度:使用稳定版本。处于早期开发阶段的项目对您的软件风险更高。
-
复杂性:一个拥有大量依赖项的庞大复杂库,更难集成到您的软件中。此外,大量的依赖项也意味着未来需要进行更多升级,以确保所有这些依赖项都是最新且安全的。
-
安全性:如果软件包是开源的,您可以先使用静态应用程序安全测试(SAST)或 软件组成分析(SCA)来帮助识别恶意代码或安全弱点,然后再将其首次包含进来。
保持组件安全性的最佳实践
新的安全漏洞每天都在披露,并发布在公共数据库中,例如使用通用漏洞披露(CVE)识别公开已知漏洞的NIST国家漏洞数据库(NVD)。此外,公共数据库中提供的利用工具允许攻击者自动化其攻击。因此,定期确保您的软件没有已知的安全漏洞非常重要。
-
维护所有第三方组件的清单目录。建议在构建管道中自动创建SBOM(软件物料清单)。SBOM包含所有使用的第三方依赖项及其版本,并且可以由各种供应链管理工具自动监控。
-
执行持续检查。将您的SBOM与OWASP Dependency-Track等定期或持续监控工具结合使用,以自动检测已知的公开披露漏洞。
-
尽早且频繁地验证安全性 - 在软件开发的早期阶段集成SCA工具,以从软件开发生命周期的每个阶段了解软件及其依赖项的安全漏洞的数量和严重性。
-
主动更新库和组件。软件更新必须是一个贯穿应用程序或产品整个生命周期(从构思到淘汰)的周期性任务。
防止的漏洞
安全框架和库有助于防止各种Web应用程序漏洞。至关重要的是,要按照使用已知漏洞的易受攻击和过时组件(Top 10 2021)中所述,保持这些框架和库的最新状态。
参考资料
- OWASP速查表:第三方JavaScript管理
- OpenSSF记分卡 - 开源安全健康指标
工具
- OWASP依赖检查 - 用于识别项目依赖项并检查公开披露的漏洞
- OWASP依赖跟踪 - 定期监控SBOM文件以发现新的漏洞
- Retire.JS JavaScript库扫描器
- Renovate自动化依赖更新工具
- Harbor :一个通过策略和基于角色的访问控制来保护工件的开源注册表