GitHub Actions 工作流安全审计
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/audit-github-actions-workflows-for-insecure-permissions-and-unpinned-actions
技能介绍
要解决的具体问题
GitHub Actions 让 CI/CD 流水线搭建变得简单,但也让 workflow 文件成了攻击者的目标。两个常见的「隐形漏洞」尤其危险:一是过度授权的权限范围——比如给 job 配置 permissions: write-all 或 contents: write,一旦触发 workflow 的环境被污染(比如 PR 事件里混入恶意提交),攻击者就能篡改仓库内容或窃取 secrets;二是未固定的 Action——用 actions/checkout@v4 或 some/action@main 这种 tag/分支引用时,上游一旦推送恶意更新,你的流水线会直接执行未知代码,这就是典型的供应链攻击(比如 2024 年多起针对开源 Actions 的投毒事件)。很多团队直到被入侵才发现,这些「方便」的写法其实是在给攻击者开后门。
技能如何工作
这个技能基于静态分析工具 zizmor 构建,把「手动检查 Actions 安全」的流程自动化。它支持两种扫描场景:
- 本地仓库:直接指向本地
.github/workflows目录,适合提交前本地检查; - 远程仓库:通过 GitHub Token 访问公开/私有仓库,适合在 PR 或 CI 阶段做强制审计。
检测规则覆盖两类核心问题:
- 不安全的权限范围:标记过度授权的
permissions块(比如不需要写权限却开了contents: write,或显式声明write-all); - 未固定的 Action 版本:识别所有用 tag/分支引用的 Action(如
actions/checkout@v4),推荐用 commit SHA(如actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675)替代——SHA 是不可变的,上游无法篡改。
技能还会捕捉不安全的工作流模式,比如用 pull_request_target 触发却处理来自 PR 的输入(容易让攻击者拿到写权限),或在未信任上下文中使用 secrets。扫描结果支持三种输出:
- 纯文本:适合终端快速查看;
- GitHub 原生 Findings:直接关联仓库 Security 面板,方便跟踪修复;
- SARIF:可接入 GitHub Advanced Security 或其他 SAST 工具,做后续自动化处理。
适用边界与注意点
- 扫描远程/私有仓库需要 GitHub Token(只读权限即可),确保令牌未过期且权限最小化;
zizmor是静态分析工具,无法覆盖运行时风险(比如 Action 本身逻辑有问题但语法合规);- 对于自定义复合 Action(比如自己写并发布到 marketplace 的),建议补充
zizmor规则或手动审查,因为静态规则可能无法覆盖复杂上下文; - 修复未固定 Action 时,建议先用
actions/checkout@<sha>替换 tag 引用,并在 PR 中验证 SHA 的合法性(比如检查对应 commit 是否属于官方仓库)。
使用场景
- 提交代码前,检查本地 .github/workflows 文件是否存在权限过度或版本未固定的问题
- 在 Code Review 阶段,快速识别 PR 中引入的不安全 Action 配置(如 write-all 权限或 tag 版本引用)
- 将安全检查集成到 CI 流水线,扫描远程仓库的 workflow 文件并输出 GitHub 原生 Findings 或 SARIF 格式
- 定期扫描团队仓库的 Actions 配置,重点检查所有 Action 是否使用 commit SHA 固定版本,防止供应链攻击
适合人员
- 需要编写和维护 GitHub Actions workflow 的开发工程师,希望在提交前发现权限配置或版本固定问题
- 负责 Code Review 的技术负责人或高级工程师,需要在合并前快速识别不安全的 Action 配置
- DevSecOps 或安全工程师,需要将安全扫描工具集成到 CI/CD 流水线并输出标准化结果
- 关注供应链安全的团队管理者或技术负责人,定期检查 GitHub Actions 的版本固定情况以降低第三方 Action 投毒风险