现代软件供应链由多个组件组成,这些组件在开发过程的每个阶段采用不同的形式。在开发阶段,将开源包、容器镜像、IaC 模块等第三方软件组件集成到代码库中。构建和部署阶段依赖于第三方管道,例如 VCS 提供程序、容器镜像注册表和 CI/CD 管道,这些管道有助于集成、构建、打包、测试和部署工件。而在运行时,第三方软件组件成为真正运行的容器、资源、工作负载和服务。
这些软件供应链组件中的任何一个弱点都可能是软件供应链攻击中使用的入口点或支点。当你考虑到我们的软件供应链已经变得很复杂时,2021 年软件供应链攻击增加了 51%也就不足为奇了。 直到最近,安全供应商和从业者主要关注锁定软件组件。从 SAST、DAST 和 SCA 到容器镜像和基础设施即代码 (IaC) 扫描,消除漏洞和错误配置已成为一个价值数十亿美元的行业。我们最近才意识到保护底层管道的重要性,例如版本控制系统 (VCS) - 有时称为源控制管理 (SCM) 工具 - 和持续集成/持续交付 (CI/CD) 管道.
交付管道和软件供应链安全
为了支持快速、迭代和高质量的部署,托管 VCS 和 CI/CD 管道已成为云原生组织的命脉。但随着组织采用越来越多的工具和流程来跟上开发生命周期日益复杂的步伐,保持整个软件供应链的可见性变得更具挑战性。正因为如此,VCS 存储库和 CI/CD 管道正越来越多地成为攻击的目标。 VCS 或 CI/CD 管道缺陷可能会暴露敏感信息,然后这些信息可用于获得特权访问和泄漏敏感数据。如果没有适当的控制,恶意代码注入或中毒可能会破坏整个交付管道。采用 VCS 和 CI/CD 安全最佳实践将有助于保护软件开发和部署中涉及的组件、操作和过程。 在这篇文章中,我们将研究 VCS 和 CI/CD 管道中一些最常见的安全漏洞,这些漏洞可能会使供应链受到攻击。然后,我们将介绍安全专业人员可以实施以减轻供应链攻击的几个最佳实践。
弱 VCS 组织配置
GitHub、GitLab 和 Bitbucket 等版本控制系统是软件供应链的重要组成部分。作为存储、版本和管理对所有基础设施和应用程序代码的访问的中央存储库,很明显,如果不良行为者未经授权访问它们会发生什么。 好消息是这些供应商提供了限制访问的机制。VCS 安全最佳实践包括强制双重身份验证和配置单点登录 (SSO)。自动扫描您的 VCS 组织设置以确保它们符合 VCS 安全最佳实践是在任何设置发生更改时获得持续保护的好方法。
宽松的代码集成策略
您的下一道 VCS 防御位于存储库级别。如果一个不良行为者——无论是内部的还是外部的——能够访问存储库并可能尝试注入恶意代码,那么执行有关如何以及谁可以合并代码的策略至关重要。 执行此操作的最佳方式是通过分支保护规则。分支保护规则使您能够严格控制谁可以删除或强制推送到分支,它们还可以用于要求在合并之前推送满足某些条件。为确保恶意代码不会进入您的构建管道或生产环境,最好的做法也是要求多个审批者进行代码审查并强制执行签名提交。要求多个批准者使不良行为者更难合并他们自己的代码,并确保多人知道正在合并的内容。可以使用 GPG 密钥和使用分支保护规则来验证提交是否来自受信任的来源而不是模拟身份。
特权过高的 CI/CD 访问
为了强化 CI/CD 管道,重要的是尽量减少过度特权访问,因为流氓行为者或放错地方的凭据可能会导致错误的人访问您的管道。要在 CI/CD 管道中强制执行最小权限原则,您不仅需要将访问权限限制在正确的用户,而且还需要只在正确的时间允许访问。这是一个普遍的行业挑战,需要在安全性与快速推送代码的操作简便性之间取得平衡。 为访问 CI/CD 主机环境的个人审核您的 IAM 策略以获取未使用的权限,这是从正确调整大小开始的好地方。还有几种方法可以限制特定个人何时可以使用 CI 提供者策略或策略即代码解决方案访问和部署到环境。无论您如何应对这一挑战,自动化都是将风险降至最低的唯一方法,同时允许 CI/CD 主机环境访问需要它的人。也就是说,通常最好的做法是防止个人直接部署,而是使用 CD 系统以编程方式验证和部署安全代码,而无需人工干预。
缺少针对代码注入和中毒的保护
CI 管道防御的下一道防线是防止恶意代码或命令注入。恶意代码或命令注入的发生方式有多种,管道越复杂,不良行为者获得创意的机会就越多。 以下是一些可能导致恶意注入的常见弱点:
- 允许不安全的命令
- 允许对第三方控制的变量进行有风险的引用
- 允许使用已弃用的命令/测试版功能
- 允许网络调用命令
为了防止这些可疑行为,首先配置您的 CI 配置文件以防止它们。为了持续确保您的配置文件确实具有这些保护,请确保启用针对 CI/CD 策略的自动扫描。
容易被接管的测试环境
自动化测试是 CI/CD 管道的核心用例之一。通过添加功能和安全测试检查作为构建步骤,您可以验证您的代码以确保它符合您的标准并准备好部署。对于许多类型的测试,您可能需要启动测试环境或 pod,如果没有适当的控制,它们可能会被劫持用于恶意目的。此外,使用任意和易受攻击的图像来执行构建和测试会使它们容易中毒和攻击。 即使攻击者要访问与容器隔离的构建系统,也有可能通过网络接管或上游工作来破坏 repo 中的代码。为了防止这些类型的接管,您应该将测试环境与主机隔离,并确保用于测试的 pod 没有特权。
凭据暴露和泄露
最后,最常见的 CI/CD 弱点之一是泄露机密。正如 Unit 42 的云威胁报告所发现的那样,拥有硬编码凭证会导致横向移动和 CI/CD 管道中毒。在管道中允许特定的命令与秘密组合允许不良行为者将这些秘密泄露到他们拥有的域中。阻止对诸如此类命令的可疑使用curl将防止这种渗漏。 同样,可以利用 IP 地址建立与外部计算机或服务器的连接,然后将其用作后门。使用 IP 地址阻止可疑netcat是阻止该连接以进行数据泄露的好方法。
目前,利用 VCS 和 CI/CD 管道已成为行业标准。它们帮助工程团队快速构建、更新和修复模块化应用程序组件。但是,它们的默认配置并未考虑到安全性。再加上它们处于软件供应链的中心,这使得它们很容易成为黑客的目标。为了保护他们的软件供应链,组织应该采取预防性的、纵深防御的方法来遵循 VCS 和 CI/CD 安全最佳实践,并利用策略即代码来随着时间的推移执行最佳实践。