防范 GitHub Actions 工作流注入攻击:检测与缓解指南
GitHub 2024 Octoverse 报告显示,工作流注入攻击是 GitHub 仓库最常见的安全漏洞之一。本指南详解技术原理、影响及有效缓解策略,助力安全团队构建防护体系。
防范 GitHub Actions 工作流注入攻击
根据 GitHub 2024 年《Octoverse 报告》,GitHub Actions 工作流注入攻击(Workflow Injection Attacks)已成为 GitHub 仓库中最普遍的安全漏洞之一。这类攻击利用工作流中的不受信任输入,使威胁行为者能够以工作流权限执行恶意命令。安全专业人员可通过 GitHub 内置工具、安全编码实践及自动化扫描等手段有效缓解此类风险。
工作流注入攻击的技术细节
GitHub Actions 工作流注入攻击发生于攻击者提交恶意输入(如议题标题或分支名称)后,该输入被工作流执行。漏洞根源在于 ${{}} 语法,该语法在预处理阶段展开不受信任的输入,可能改变工作流行为。例如:
- name: print title
run: echo "${{ github.event.issue.title }}"
攻击者可构造议题标题如 `touch pwned.txt`,当工作流运行时,该命令将被执行。由于工作流通常继承较高权限,这可能导致未经授权的访问或数据泄露。
主要攻击向量
- 不受信任输入展开:在
run命令中直接使用${{}}。 - 权限提升:工作流运行时权限过高(如
write访问或密钥泄露)。 pull_request_target触发器:绕过默认安全限制,允许分叉 PR 访问密钥及写入权限。
影响分析
成功的工作流注入攻击可能导致:
- 代码执行:恶意命令以工作流权限运行。
- 数据泄露:仓库密钥或敏感文件暴露。
- 仓库被入侵:代码或 CI/CD 流水线遭未授权修改。
风险不仅限于 main 分支——攻击者可针对任何公开可见且存在漏洞的分支发起攻击。
缓解策略
1. 使用环境变量处理不受信任输入
避免在 run 命令中直接展开不受信任的输入。改用环境变量传递数据:
- name: print title
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE"
此方法虽无法完全消除输入风险,但能通过限制命令注入减少攻击面。
2. 最小权限原则
通过 permissions 键限制 GITHUB_TOKEN 的权限:
permissions:
contents: read
issues: write
除非明确需要写入权限,否则默认设置为 只读 访问。
3. 避免使用 pull_request_target
使用 pull_request 替代 pull_request_target,以阻止分叉 PR 访问密钥或写入权限。若必须使用 pull_request_target,需审计工作流中的注入风险并限制权限。
4. 使用 CodeQL 扫描工作流
GitHub 的 CodeQL 现已支持自动扫描 GitHub Actions 工作流。启用方式:
- 默认设置:自动扫描受保护分支。
- 高级设置:在 CodeQL 配置中将
actions添加为目标语言。
CodeQL 的污点追踪(Taint Tracking)功能可识别不受信任的数据流,发现隐蔽的注入风险。
建议
- 扫描所有分支:即使
main分支安全,功能分支中的漏洞也可能被利用。 - 结合工具与人工审查:任何工具都无法做到 100% 有效,需保持安全优先的思维模式。
- 团队培训:分享 GitHub 的四部分安全系列以强化工作流安全。
后续步骤
在仓库中启用 CodeQL 代码扫描,主动检测工作流注入风险。对于高级配置,在 CodeQL 设置中将 actions 添加为目标语言。
更多详情,请参阅 GitHub 的工作流安全文档。