rapidfort/gh-action-security-audit
GitHub: rapidfort/gh-action-security-audit
针对 GitHub 组织的 Actions 工作流安全审计工具,可扫描 pull_request_target 滥用、权限配置不当等高风险模式并生成修复建议报告。
Stars: 2 | Forks: 0
# gh-actions-audit
一款针对整个 GitHub 组织的 GitHub Actions 工作流安全审计工具。
## 为什么开发此工具
2026 年 2 月,[hackerbot-claw](https://www.stepsecurity.io/blog/hacking-millions-of-repos-with-github-actions) 攻击活动演示了对配置错误的 GitHub Actions 工作流的大规模利用。该攻击利用了五个向量:
1. **Pwn requests** — 使用 `pull_request_target` 的工作流检出并执行 fork 代码,使攻击者能够利用目标仓库的 secrets 和写入 token 进行 RCE
2. **无防护的 `issue_comment` 触发器** — 任何 GitHub 用户都可以通过在公开仓库的 issue 下评论来调用的工作流
3. **Shell 注入** — 直接插入到 `run:` 块中的 `${{ github.event.* }}` 表达式(分支名称、PR 标题、提交消息)
4. **文件名注入** — 在 CI 的 bash 循环中处理的、文件名包含 base64 编码命令的文件
5. **AI 提示注入** — 在 `pull_request_target` 检出期间由 AI 编程代理执行的中毒配置文件(例如 `CLAUDE.md`)
此工具扫描组织的工作流以查找这些模式,并生成一份报告,重点标出需要审查的内容。
## 检查内容
### 按仓库
- 工作流是否有显式的 `permissions:` 块(没有该块的工作流会继承组织默认设置,可能是 `write`)
- `pull_request_target` 使用情况,按风险细分为:
- **仅 API** — 无检出,用于标记/自动合并(低风险)
- **检出,有防护** — 检出 fork 代码但限制了作者(例如 `dependabot[bot]`)
- **检出+执行,无防护** — 检出并运行 fork 代码且无限制(最高风险)
- `issue_comment` 触发器,注明是否存在 `author_association` 或 actor 检查
- 仓库级 secret 名称(而非值)
- Dependabot 误报标记 — 限制为 `dependabot[bot]` 的工作流会被标记,以便审查者跳过它们
### 组织级别
- 默认工作流 token 权限(`read` vs `write`)
- 工作流是否可以批准 pull request
- 允许的 actions 策略(所有、已验证的创建者或选定的)
- 所有带有可见性范围的组织 secrets,配置了访问权限的仓库,以及在其工作流文件中实际引用每个 secret 的仓库
- 对于范围过大的 secrets(`All repositories` 可见性):提供一个可直接运行的 `gh secret set` 命令,将其限制为仅实际使用它们的仓库
## 系统要求
- [GitHub CLI (`gh`)](https://cli.github.com/) 已通过目标组织的 **admin** 身份认证
- `bash` (4.0+)、`python3`(用于 JSON 解析)、标准 Unix 工具(`grep`、`find`、`sort` 等)
- 所需管理员权限范围:`admin:org`(用于组织设置和 secrets)、repo 管理员访问权限(用于仓库 secrets)
验证你的访问权限:
```
gh auth status
gh api orgs//actions/permissions
```
## 用法
```
./gh-actions-audit.sh [OPTIONS]
```
### 选项
| 标志 | 描述 |
|------|-------------|
| `--out FILE` | Markdown 报告输出路径。默认值:`./-actions-audit.md` |
| `--csv FILE` | CSV 报告输出路径。省略则跳过 CSV 生成。 |
| `--local DIR` | 重用先前下载的工作流文件,而非重新从 API 获取。接受顶层审计目录或其 `workflows/` 子目录。 |
| `--cleanup` | 运行完成后删除缓存的工作流文件。 |
| `-h, --help` | 显示内置帮助信息并退出。 |
### 示例
```
# 完整扫描 — 下载所有 workflows,写入 markdown 报告
./gh-actions-audit.sh my-org
# 同时输出 markdown 和 CSV
./gh-actions-audit.sh my-org --out audit.md --csv audit.csv
# 复用之前的下载(可节省大型 orgs 的时间)
./gh-actions-audit.sh my-org --local /tmp/gh-actions-audit-my-org-20260301
# 扫描并清理缓存的文件
./gh-actions-audit.sh my-org --cleanup
```
### 工作原理
1. **下载** — 枚举组织中所有未归档的仓库,通过 GitHub API 下载 `.github/workflows/*.yml` 文件(使用 `--local` 时跳过)
2. **分析** — 使用基于 grep 的启发式方法扫描每个工作流的 `pull_request_target`、`issue_comment`、`permissions:` 块和 secret 引用
3. **组织 secrets** — 列出所有组织级别的 secrets,将每个 secret 映射到在工作流中引用它的仓库,并为范围过大的访问权限生成修复命令
4. **组织设置** — 检查默认工作流权限、PR 批准策略和允许的 actions
5. **报告** — 生成 markdown 报告(以及可选的 CSV),包含按仓库分类的表格、组织级别的发现和审查指南
对于大型组织(数百个仓库),初始下载可能需要几分钟。`--local` 标志允许你重新运行分析而无需重新下载。
## 输出
Markdown 报告包括:
- **组织级别设置** 表格,包含当前值和建议
- **按仓库审计** 表格,包含权限、`pull_request_target` 分类、`issue_comment` 触发器和仓库 secrets 列
- **组织级别 Secrets** 表格,显示可见性、配置的访问权限、实际工作流使用情况以及 `gh secret set` 修复命令
- **审查指南** 部分,解释优先事项、fork 批准设置能防护和不能防护的内容,以及需要寻找的缓解措施
## 许可证
Apache-2.0
标签:CI/CD 安全, DevSecOps, GitHub Actions, GITHUB_TOKEN, pull_request_target, RCE 风险, Shell 注入, 上游代理, 工作流安全, 应用安全, 数据投毒防御, 文档安全, 权限审查, 自动笔记