
关于
发现 GitHub Actions 工作流中的可利用漏洞。每个发现必须包含具体的利用场景——如果无法构建攻击路径则不报告
name: gha-security-review description: "查找 GitHub Actions 工作流中的可利用漏洞。每个发现必须包含具体的利用场景 — 如果你无法构建攻击,就不要报告。" risk: safe source: community date_added: 2026-03-16
<!-- 攻击模式和真实案例来源于 StepSecurity(2025)的 HackerBot Claw 活动分析: https://www.stepsecurity.io/blog/hackerbot-claw-github-actions-exploitation -->GitHub Actions 安全审查
查找 GitHub Actions 工作流中的可利用漏洞。每个发现必须包含具体的利用场景 — 如果你无法构建攻击,就不要报告。
此技能编码了来自真实 GitHub Actions 漏洞利用的攻击模式 — 而非通用的 CI/CD 理论。
何时使用
- 你正在审查 GitHub Actions 工作流中的可利用安全问题。
- 任务需要从外部攻击者到工作流执行或密钥暴露追踪具体的攻击路径。
- 你需要对工作流文件、组合 action 或工作流相关脚本进行安全审查,且仅提供基于证据的发现。
范围
审查提供的工作流(文件、diff 或仓库)。在报告之前根据需要研究代码库以追踪完整的攻击路径。
需要审查的文件
.github/workflows/*.yml— 所有工作流定义action.yml/action.yaml— 仓库中的组合 action.github/actions/*/action.yml— 本地可复用 action- 工作流加载的配置文件:
CLAUDE.md、AGENTS.md、Makefile、.github/下的 shell 脚本
超出范围
- 其他仓库中的工作流(仅记录依赖关系)
- GitHub App 安装权限(如相关则记录)
威胁模型
仅报告外部攻击者可利用的漏洞 — 即没有仓库写入权限的人。攻击者可以从 fork 打开 PR、创建 issue 和发表评论。他们不能推送到分支、触发 workflow_dispatch 或触发手动工作流。
不要标记需要写入权限才能利用的漏洞:
workflow_dispatch输入注入 — 需要写入权限才能触发- 仅在受保护分支上的
push工作流中的表达式注入 - 所有调用者都是内部的
workflow_call输入注入 - 仅在
workflow_dispatch/schedule工作流中的密钥
置信度
仅报告高和中置信度的发现。不要报告理论性问题。
| 置信度 | 标准 | 操作 | |---|---|---| | 高 | 追踪了完整攻击路径,确认可利用 | 报告利用场景和修复方案 | | 中 | 攻击路径部分确认,存在不确定环节 | 报告为需要验证 | | 低 | 理论性的或已在其他地方缓解 | 不报告 |
对于每个高置信度发现,提供全部五个要素:
- 入口点 — 攻击者如何进入?(fork PR、issue 评论、分支名称等)
- 载荷 — 攻击者发送什么?(实际代码/YAML/输入)
- 执行机制 — 载荷如何运行?(表达式展开、checkout + 脚本等)
- 影响 — 攻击者获得什么?(token 窃取、代码执行、仓库写入权限)
- PoC 草案 — 攻击者将遵循的具体步骤
如果你无法构建全部五个要素,则报告为中置信度(需要验证)。
步骤 1:分类触发器并加载参考资料
对于每个工作流,识别触发器并加载相应的参考资料:
| 触发器/模式 | 加载参考资料 |
|---|---|
| pull_request_target | references/pwn-request.md |
| 带命令解析的 issue_comment | references/comment-triggered-commands.md |
| run: 块中的 ${{ }} | references/expression-injection.md |
| PAT / 部署密钥 / 提升的凭证 | references/credential-escalation.md |
| Checkout PR 代码 + 配置文件加载 | references/ai-prompt-injection-via-ci.md |
| 第三方 action(特别是未固定的) | references/supply-chain.md |
| permissions: 块或密钥使用 | references/permissions-and-secrets.md |
| 自托管 runner、缓存/artifact 使用 | references/runner-infrastructure.md |
| 任何已确认的发现 | references/real-world-attacks.md |
选择性加载参考资料 — 仅加载与发现的触发器相关的内容。
步骤 2:检查漏洞类别
检查 1:Pwn Request
工作流是否使用 pull_request_target 并且 checkout 了 fork 代码?
- 查找
actions/checkout,其ref:指向 PR head - 查找本地 action(
./.github/actions/),它们可能来自 fork - 检查是否有任何
run:步骤执行了来自 checkout 的 PR 代码
检查 2:表达式注入
在外部可触发的工作流中,run: 块内是否使用了 ${{ }} 表达式?
- 映射每个
run:步骤中的每个${{ }}表达式 - 确认该值是攻击者可控的(PR 标题、分支名称、评论正文 — 而非数字 ID、SHA 或仓库名称)
- 确认表达式在
run:块中,而非if:、with:或作业级别的表达式