工具与漏洞利用严重

防范 GitHub Actions 工作流注入攻击:检测与缓解指南

1分钟阅读来源: GitHub Blog - Security
Bar chart showing OWASP Top 10 vulnerabilities detected by CodeQL in 2024, highlighting injection attacks as the most common risk

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 的工作流安全文档

分享

TwitterLinkedIn