skills/cloud/cicd-pipeline-attack/SKILL.md
CI/CD 流水线与供应链攻击方法论。当发现目标使用 GitHub Actions/Jenkins/GitLab CI/CircleCI/Terraform Cloud/Atlantis 等 CI/CD 系统、需要测试流水线安全性、或发现 .github/workflows/Jenkinsfile/.gitlab-ci.yml 等配置文件时使用。覆盖 PPE(Poisoned Pipeline Execution)三种攻击模式(D-PPE/I-PPE/3PE)、VCS 代码仓库攻击面(代码泄露/Webhook 滥用/分支保护绕过)、Pipeline Secrets 窃取与横向移动、以及从 CI/CD 到云环境的穿越路径
npx skillsauth add wgpsec/AboutSecurity cicd-pipeline-attackInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
CI/CD 系统是现代软件工程的核心基础设施——它们拥有代码仓库的读写权限、持有云平台的部署凭据、能够直接修改生产环境。一旦攻陷流水线,攻击者可以同时获得代码控制权、Secrets 访问权和云环境穿透能力,其影响范围远超单台服务器的沦陷。
本技能以决策树形式组织 CI/CD 攻击方法论。各平台的详细技术手法请参阅对应的参考文档。
识别到具体平台后,加载对应参考文档获取完整攻击技术细节:
在目标代码仓库或基础设施中发现以下标识文件时,可确定对应的 CI/CD 平台:
| 标识文件/特征 | CI/CD 平台 | 下一步 |
|---|---|---|
| .github/workflows/*.yml | GitHub Actions | → Phase 2 PPE + 参考 github-actions-abuse.md |
| Jenkinsfile 或 /script 控制台 | Jenkins | → Phase 4 Jenkins 专项 + 参考 platform-specific.md |
| .gitlab-ci.yml | GitLab CI | → Phase 2 PPE + 参考 platform-specific.md |
| .circleci/config.yml | CircleCI | → Phase 2 PPE + 参考 platform-specific.md |
| azure-pipelines.yml | Azure DevOps | → Phase 2 PPE + 服务连接 Secret 提取 |
| .drone.yml | Drone CI | → Phase 2 PPE + Self-hosted Runner 检查 |
| .buildkite/*.yml | Buildkite | → Phase 2 PPE + Agent 云/K8s 权限检查 |
| atlantis.yaml + Webhook | Atlantis | → Phase 4 Atlantis 专项 |
| *.tf + Terraform Cloud | Terraform Cloud | → Phase 4 Terraform 专项 |
| serverless.yml | Serverless Framework | → 参考 platform-specific.md |
| docker-compose.yml + CI 触发 | Docker Build | → 检查构建上下文泄露 |
| Airflow DAGs / Concourse pipeline | Airflow / Concourse | → 参考 platform-specific.md |
快速识别技巧:
Jenkinsfile、.github/workflows、.gitlab-ci.yml、.circleci、atlantis.yaml在进入流水线攻击之前,VCS(版本控制系统)本身就是重要的攻击面。
代码仓库中常见的敏感信息来源:
git log -p 搜索所有分支)password、secret、token、AWS_)分支保护是防止恶意代码合入的关键防线,但存在多种绕过方式:
| 绕过场景 | 条件 | 攻击方法 |
|---|---|---|
| 审批不足 | 控制多个账户 | 使用其他账户审批自己的 PR |
| GITHUB_TOKEN 自审批 | Actions 有写权限 | 通过 Actions 中的 GITHUB_TOKEN 审批 PR |
| 推送后审批未失效 | 未启用 "dismiss on push" | 先提交合法代码获得审批,再推送恶意代码 |
| CODEOWNERS 配置错误 | 文件格式有误 | GitHub 不报错但 CODEOWNERS 保护失效 |
| 新分支无保护 | 使用通配符 * 但有延迟 | 创建新分支时分支保护尚未生效,第一次 push 可触发 Actions |
| 管理员豁免 | 管理员未纳入规则 | 管理员可直接绕过所有分支保护 |
| PR 劫持 | 可修改他人 PR | 在他人的 PR 中注入恶意代码后自行审批合并 |
PPE 是 CI/CD 攻击的核心框架。攻击者通过修改 CI 配置文件或其依赖文件来"毒化"流水线,使其执行恶意命令。
是否能写入/修改 CI 配置文件(workflow yml / Jenkinsfile / .gitlab-ci.yml)?
├── 是 → D-PPE(直接毒化)
│ ├── 能直接推送到触发分支 → 最简单路径
│ └── 需要 PR → 检查 PR 是否触发流水线
│
├── 否,但能修改 CI 配置依赖的文件?
│ ├── Makefile / build.sh / package.json / requirements.txt → I-PPE(间接毒化)
│ ├── Terraform .tf 文件 → I-PPE via external data source
│ └── Dockerfile → I-PPE via build context
│
└── 否,且无仓库写权限?
└── 3PE(第三方毒化)
├── 能否提交外部 PR? → pull_request 触发器
├── PR 标题/描述是否被注入到 shell 命令? → Context Script Injection
└── 能否通过 issue/comment 触发? → issue_comment 触发器
攻击者直接修改 CI 配置文件。这是最直接的攻击路径:
.github/workflows/*.yml、Jenkinsfile、.gitlab-ci.yml、.circleci/config.ymlpull_request 触发器)会使用 PR 提交者的 workflow 版本——这意味着攻击者的修改会被执行攻击者不修改 CI 配置文件本身,而是修改 CI 配置所依赖的文件:
Makefile、build.sh、package.json 的 scripts 字段requirements.txt、package-lock.json(供应链注入).tf 文件中的 external data source 或 local-exec provisionerI-PPE 的局限性在于攻击者只能访问流水线原本就加载的 Secrets,无法通过配置声明新的 Secret 引用。
无仓库写权限的外部攻击者通过以下方式触发流水线:
Context Script Injection(最常见):
当 CI 配置使用 ${{ github.event.pull_request.title }} 等用户可控表达式在 run: 步骤中拼接 shell 命令时,攻击者可通过 PR 标题注入命令。GitHub Actions 在执行前先渲染表达式,所以 shell 引号转义无法防御。
危险触发器对比:
| 触发器 | Secrets 访问 | 写权限 | 使用的代码版本 | 风险 |
|---|---|---|---|---|
| pull_request | 无(GITHUB_TOKEN 只读) | 无 | PR 分支 | 低(但可上传恶意 Artifact) |
| pull_request_target | 有 | 有 | 基础分支(默认安全) | 高(若 checkout PR 代码则极危险) |
| workflow_run | 有 | 有 | 取决于配置 | 高(常被链式利用) |
| issue_comment | 有 | 有 | 基础分支 | 高(结合 checkout PR ref 可 RCE) |
pull_request_target 的致命误用:
虽然 pull_request_target 在基础分支上下文运行(看似安全),但如果 workflow 中显式 checkout 了 PR 的代码(ref: ${{ github.event.pull_request.head.sha }}),则攻击者的代码会在拥有 Secrets 和写权限的环境中执行。
成功毒化流水线后,核心目标是窃取 Secrets 并向外扩展。
环境变量:
env | base64 导出所有环境变量(base64 编码可绕过 GitHub 的日志掩码)echo '${{ toJson(secrets) }}' | base64 -w0 | base64 -w0文件系统:
/home/runner/work/_temp/*(GitHub Actions 存储渲染后的脚本)gcore 或 /proc/<pid>/mem 读取 Runner.Worker/Runner.Listener 进程中的明文 Secrets无法直接外传时:
CI/CD Runner 通常拥有云平台凭据用于部署。这些凭据是从 CI/CD 穿越到云环境的桥梁:
| 凭据来源 | 位置 | 利用方式 |
|---|---|---|
| OIDC Token(GitHub → AWS/GCP/Azure) | id-token: write 权限 | 请求 OIDC Token → AssumeRoleWithWebIdentity |
| AWS 静态 AK/SK | 环境变量或 Secrets | 参考 cloud-aksk-exploit 技能 |
| GCP Service Account JSON | 文件或环境变量 | 参考 gcp-pentesting 技能 |
| Azure Service Principal | 环境变量 | 参考 aws-pentesting 技能中的 Azure 相关内容 |
| Terraform Cloud Runner 凭据 | tfc-aws-*/tfc-gcp-* 文件 | 直接使用 CLI 操作云资源 |
| Kubernetes kubeconfig | ~/.kube/config 或挂载的 SA Token | 集群接管 |
| Docker Registry Token | ~/.docker/config.json | 推送恶意镜像 |
Self-hosted Runner 额外攻击面:
如果流水线直接负责生产部署:
GitHub Actions 是最广泛使用的 CI/CD 平台之一,攻击面丰富:
→ 读 references/github-actions-abuse.md
Jenkins 的高权限特性使其成为高价值目标:
/script)→ 直接 RCEmaster.key + hudson.util.Secret → 离线解密所有凭据 → 伪造 remember-me Cookie→ 读 references/platform-specific.md
IaC 工具的攻击核心在于代码即执行:
external data source 或恶意 Provider 在 plan 阶段即可执行代码local-exec provisioner 在 apply 阶段执行.tf 文件触发 atlantis plan → 在 Atlantis 服务器上 RCEallow_custom_workflows=true 时,atlantis.yaml 可定义任意执行步骤→ 读 references/platform-specific.md
| 平台 | 关键攻击路径 | 详情 |
|---|---|---|
| GitLab CI | Runner Token 窃取、共享 Runner 逃逸、CI 变量注入 | → platform-specific.md |
| CircleCI | Context Secrets 窃取、SSH Rerun、项目变量导入 | → platform-specific.md |
| Azure DevOps | Service Connection Secret、变量/参数注入、Runner hijack | → platform-specific.md |
| Drone CI | .drone.yml commands 注入、Self-hosted Runner 云/K8s 权限 | → platform-specific.md |
| Buildkite | .buildkite/*.yml command 注入、Agent 所在云/K8s 权限 | → platform-specific.md |
| Serverless Framework | IAM Role 提权(默认 AdministratorAccess)、Plugin 投毒 | → platform-specific.md |
| CloudFlare | Workers 滥用、Zero Trust 绕过 | → platform-specific.md |
| Concourse / Airflow | 参考 platform-specific.md 快速参照表 | → platform-specific.md |
操作安全:
Secrets 保护绕过:
供应链攻击升级:
preinstall/postinstall hook 在安装时自动执行.pth 文件在解释器启动时自动执行testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能