有关这项研究的完整详细信息,请参阅 X-Force Red 白皮书“控制源代码:滥用源代码管理系统”。该材料也将在Black Hat USA 2022上展示。

源代码管理 (SCM) 系统在组织中发挥着至关重要的作用,与 Active Directory 等其他关键企业系统相比,它在防御方面一直是事后考虑的。大多数组织都使用 SCM 系统来管理源代码并与企业内的其他系统集成,作为 DevOps 管道的一部分,例如 Jenkins 等 CI/CD 系统。这些 SCM 系统为攻击者提供了软件供应链攻击的机会,并且可以促进整个组织的横向移动和权限升级。

这篇博文将回顾 SCM 系统的背景,并详细介绍滥用一些最流行的 SCM 系统(包括 GitHub Enterprise、GitLab Enterprise 和 Bitbucket)来执行各种攻击场景的方法。这些攻击场景包括侦察、用户角色操纵、存储库接管、转向其他 DevOps 系统、用户模拟和维护持久访问。X-Force Red 的源代码管理攻击工具包 ( SCMKit ) 也将展示执行和促进这些攻击。此外,还将概述保护这些 SCM 系统的防御性指南。

背景

有许多方法可以与源代码以及已编译的源代码资产进行交互和跟踪。此过程中使用的一些常用术语是源代码控制、版本控制和源代码管理。术语“源代码控制”和“版本控制”通常可以互换使用。但是,这两个术语之间存在差异。源代码控制专门用于跟踪源代码的更改,而版本控制还包括跟踪二进制文件和其他文件类型的更改。这方面的一个例子是版本控制跟踪对已编译可执行文件的更改,而源代码控制将跟踪对编译到该可执行文件中的底层 C# 或 C++ 源文件的更改。Git 是流行的源代码控制工具,Subversion 是流行的版本控制工具。

为了以实用的方式使用源代码控制作为开发过程的一部分,使用了源代码管理 (SCM) 系统。这些系统允许跟踪对源代码存储库的更改,并允许开发人员在同时合并来自多个人的代码提交时解决冲突。其中一些 SCM 系统比其他系统更受欢迎,并已被企业采用,因为它们以更可靠的方式集成到开发过程中。一些流行的 SCM 系统包括GitHub EnterpriseGitLab Enterprise 和Bitbucket。由于这些 SCM 系统的作用和重要性,它们可能被滥用以促进软件供应链攻击和组织内的横向移动。

SCM 系统和 DevOps 管道

SCM 系统在 DevOps 管道中项目的“构建”阶段被大量使用,如下图所示。所有其他阶段都取决于在 SCM 系统中开发和维护的源代码。一旦源代码项目准备好编译和构建,它将被推送到持续集成 (CI) 服务器。之后,将对其进行测试、扫描和部署以用于生产。

DevOps 流水线

软件供应链攻击

最近流行的一种攻击是软件供应链攻击。在这种攻击中,攻击者在其中一个阶段将自己注入到开发过程中,以将恶意代码部署到生产中。这通常在“构建”阶段执行。对于向其他组织提供软件的组织,这可能会导致多个组织的妥协。最著名的软件供应链攻击之一是SolarWinds 漏洞,它影响了私营和公共部门的许多组织。

下图显示了攻击者在开发过程中实施软件供应链攻击的机会。这项研究侧重于“B”和“C”的突出领域,因为它与 SCM 系统的妥协有关。但是,这些 SCM 系统的入侵也可能导致其他情况,例如“D”,攻击者可以使用 SCM 系统破坏构建平台系统。

软件供应链攻击机会

横向移动到其他 DevOps 系统

SCM 系统可用作其他 DevOps 系统的初始访问点,这些系统在 DevOps 生命周期的不同阶段使用。能够转向构建系统以破坏 CI/CD 平台或转向包存储库系统以破坏分发平台是攻击者可以执行软件供应链攻击的其他场景。白皮书中显示了这方面的两个详细示例。

攻击场景

以下攻击场景对于攻击者尝试攻击 GitHub Enterprise、GitLab Enterprise 和 Bitbucket 是值得注意的。这些作为 X-Force Red 对抗模拟活动的一部分非常有用。这并不是可在这些 SCM 系统上执行的每条攻击路径的详尽列表。下表列出了白皮书中详述的攻击场景。其中一些场景将在后续章节中展示。

单片机攻击场景表

存储库接管

使用管理权限(特别是站点管理员角色),攻击者可以授予自己对 GitHub Enterprise 内任何存储库的写入权限。在下面的示例中,我们尝试在 GitHub Enterprise 中查看我们的受感染管理用户 ( adumbledore) 无权访问的存储库。

查看锁定的存储库

使用站点管理员角色,您可以选择通过如下所示的“解锁”按钮解锁存储库。默认情况下,这将为用户解锁存储库两个小时。

查看屏幕以解锁存储库

您必须提供解锁存储库的原因,并且该原因与请求一起记录。

添加解锁存储库的原因

现在您可以看到我们已经成功解锁了存储库,并且为adumbledore用户帐户解锁了两个小时。然后可以访问或修改此存储库中的代码。

显示存储库已解锁

用户模拟

如果攻击者拥有对 GitLab Enterprise 或 GitHub Enterprise 的管理访问权限并且想要冒充另一个用户,那么他们有两种选择。第一个选项是通过 Web 界面模拟用户登录,第二个选项是创建模拟令牌。这将在 GitLab Enterprise 中专门显示。

模拟用户登录

通过 GitLab Enterprise 的管理区域查看用户时,右上角有一个标记为“模拟”的按钮。

在 hpotter 配置文件中模拟用户按钮

单击“模拟”按钮后,您将以要模拟的用户身份登录。在本例中,我们模拟了 hpotter 用户帐户。

显示假冒 hpotter

模拟令牌

对 GitLab Enterprise 具有管理员访问权限的攻击者还可以通过创建模拟令牌来模拟另一个用户。这可以通过 Web 界面或用户 REST API执行。以管理员身份使用 Web 界面,您可以导航到要模拟的用户帐户的“模拟令牌”部分;添加令牌的详细信息,包括名称、到期日期和权限范围。

创建模拟令牌

创建模拟令牌后,将列出令牌值以供使用。被模拟的用户在以自己的身份访问 GitLab Enterprise 时看不到此模拟令牌;它仅对其他管理员用户可见。

显示创建的模拟令牌

攻击者还可以通过用户 REST API 创建模拟令牌,如下面的 curl 命令示例所示。

curl -k --request POST --header "PRIVATE-TOKEN: apiToken" --data "name=someName-impersonate" --data "expires_at=" --data "scopes[]=api" --data "scopes[]=read_user" --data "scopes[]=read_repository" --data "scopes[]=write_repository" --data "scopes[]=sudo" "https://gitlabHost/api/v4/users/userIDNumberToImpersonate/impersonation_tokens"

通过 API 创建模拟令牌后的输出

修改 CI/CD 管道

在 Bitbucket 中,有一个名为Bamboo的功能可以安装和配置以促进 CI/CD 管道。如果存储库正在使用带有 Bamboo 的 CI/CD 管道,它将在存储库的根目录中包含一个名为“bamboo-specs”的目录,以及一个 Bamboo 配置文件。此配置文件可以是YAML文件 (bamboo.yaml) 或Java规范文件 (pom.xml)。如果攻击者想通过 Bamboo 发现任何配置了 CI/CD 管道的存储库,他们可以在 Web 界面或 REST API 中搜索“bamboo-specs”。

通过 Bamboo 发现具有 CI/CD 集成的存储库

如果您对存储库具有写入权限或管理员权限,则可以修改 Bamboo 配置文件。在这种情况下,我们正在修改bamboo.yaml 文件以将我们的SSH 密钥添加到运行Bamboo 代理的服务器。这也可以通过 Git 命令行工具执行,以将更改提交到 Bamboo 配置文件。

修改 Bamboo yaml 文件

这将立即触发 CI/CD 管道运行,如下所示。

显示成功的作业状态

查看管道的输出时,我们可以看到添加了 SSH 密钥,并打印了添加 SSH 密钥的服务器的主机名。此时,我们将能够通过我们的 SSH 密钥向该服务器执行横向移动。

查看管道日志

保持持久访问

在维护对 SCM 系统的持久访问方面,攻击者有三个主要选择。这可以通过创建个人访问令牌、模拟令牌或添加公共 SSH 密钥来执行。白皮书中详细介绍了所有这些选项。

将显示的持久性选项是在 GitLab Enterprise 中创建个人访问令牌。这可以作为普通用户通过 Web 界面执行,也可以作为管理员通过用户 REST API执行。下面的屏幕截图显示了创建一个名为“persistence-token”的个人访问令牌。

为 hpotter 用户创建个人访问令牌

您可以在下面看到创建的个人访问令牌和令牌值。

显示创建的令牌值

攻击者还可以通过用户 REST API 创建个人访问令牌,如下面的 curl 命令示例所示。在 GitLab Enterprise 中,这需要管理员权限。

curl -k --request POST --header "PRIVATE-TOKEN: apiToken" --data "name=hgranger-persistence-token" --data "expires_at=" --data "scopes[]=api" --data "scopes[]=read_repository" --data "scopes[]=write_repository" "https://gitlabHost/api/v4/users/UserIDNumber/personal_access_tokens"

通过 API 创建访问令牌

单片机套件

背景

在 X-Force Red,我们希望利用参与期间最常见的 SCM 系统中可用的 REST API 功能,并在名为SCMKit的概念验证工具中添加最有用的功能。该工具的目标是提供对 SCM 系统滥用的认识,并鼓励检测针对 SCM 系统的攻击技术。SCMKit 将在Black Hat USA 2022 阿森纳展出。

SCMKit 允许用户指定要使用的 SCM 系统和攻击模块,以及指定相应 SCM 系统的有效凭据(用户名/密码或 API 密钥)。目前,SCMKit 支持的 SCM 系统有 GitHub Enterprise、GitLab Enterprise 和 Bitbucket Server。支持的攻击模块包括侦察、权限提升和持久性。非公开版本的 SCMKit 中可用的其他功能未包含在防御者的考虑范围内,例如用户模拟和内置凭证搜索。SCMKit 采用模块化方法构建,因此信息安全社区将来可以添加新的模块和 SCM 系统。X-Force Red GitHub 上提供了该工具和完整文档. 下一节将展示一些示例。

侦察

SCMKit 有多个模块可用于执行特定于各种 SCM 系统(如GitLab Runners )的存储库、文件、代码和其他资源的侦察。下面的例子展示了在 SCMKit 中使用“codesearch”模块。在这种情况下,我们在 Bitbucket Server 中搜索包含“API_KEY”的任何代码,以尝试在源代码中发现 API 密钥。

使用 SCMKit 的 API 密钥的代码搜索示例

还有其他几个仅适用于某些 SCM 系统的侦察模块。例如,有一个侦察模块可以发现您可以通过“runnerlist”模块访问的 GitLab Runners。

带有 SCMKit 的 GitLab Runner 侦察示例

权限提升

SCMKit 中的另一个可用功能是将另一个普通用户添加到管理员角色。下面的示例显示了通过“addadmin”模块将我们控制下的普通用户(在本例中为 hgranter)添加到 GitHub Enterprise 中的站点管理员角色。

通过 SCMKit 添加站点管理示例

通过 SCMKit 执行站点管理员添加后,您可以看到在 GitHub Enterprise 中生效的更改,因为 hgranter 用户现在是站点管理员组的成员。

显示 hgranter 添加为站点管理员

持久性

SCMKit 中有两个持久性模块,包括使用个人访问令牌或 SSH 密钥。这对于保持对 SCM 系统的访问很有用。下面的示例显示了通过“createsshkey”模块为 Bitbucket 中的 hgranter 用户帐户创建 SSH 密钥。

使用 SCMKit 创建 SSH 密钥示例

我们可以通过“listsshkey”模块列出给定用户的所有活动 SSH 密钥,如下所示。您将看到我们为 hgranter 用户添加的 SSH 密钥。

使用 SCMKit 列出 SSH 密钥示例

防御考虑

单片机套件

有多个静态签名可用于检测 SCMKit 的使用情况。这些可以在 SCMKit 存储库的 Yara 规则中找到。

尝试 SCMKit 中的每个模块时使用静态用户代理字符串。用户代理字符串是“SCMKIT-5dc493ada400c79dd318abbe770dac7c”。SCMKit 存储库中提供了 Snort 规则。

此外,使用 SCMKit 在 SCM 系统中创建的任何访问令牌或 SSH 密钥都将在名称中添加“SCMKit-”。这可以在相应的 SCM 系统中进行过滤,以指示访问令牌或 SSH 密钥是使用 SCMKit 创建的。

单片机系统

确保将以下日志发送到您的 SIEM。这还列出了每个 SCM 系统在服务器上的日志位置。

各种攻击类型的搜索查询表 – Bitbucket Server

此外,在配置这些 SCM 系统时,应考虑以下事项:

  • 禁用用户模拟
  • 不允许用户创建没有过期日期的个人访问令牌或 SSH 密钥
  • 为创建/添加的所有个人访问令牌和 SSH 密钥设置自动到期日期
  • 限制管理用户的数量。至少应该有两个,除非必要,否则不应更多
  • 在访问存储库方面执行最低权限策略
  • 需要通过 GPG 密钥或 S/MIME 证书进行签名提交
  • 启用多因素身份验证
  • 确保及时删除代码分支
  • 每个代码提交至少需要一个批准者
  • 在适用的情况下提高日志记录级别以检测侦察

结论

源代码管理系统包含组织中一些最敏感的信息,并且是 DevOps 生命周期中的关键组件。根据组织的角色,这些系统的入侵可能会导致其他组织的入侵。这些系统对攻击者来说具有很高的价值,并且需要信息安全社区的更多可见性,因为与 Active Directory 等其他系统相比,它们目前是事后才想到的。X-Force Red 的目标是,这项研究将引起更多关注并激发未来对保护这些关键企业系统的研究。