agent-security-hardening
AFaffaan-m/ECC278k4,046 new stars in the last 7 days
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 到云环境的穿越路径
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 文件在解释器启动时自动执行AFaffaan-m/ECC278k4,046 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
GAgarrytan/gstack136k883 new stars in the last 7 days
Harden code against the OWASP Top 10: input handling, authentication, sessions and dependencies.
ADaddyosmani/agent-skills106k3,628 new stars in the last 7 days