Kaspersky Uncovers Widespread Vulnerabilities in GitHub Actions(2026-07-08)
近日,知名网络安全公司卡巴斯基(Kaspersky)发布了一份重磅报告,揭示了GitHub Actions中存在的多个广泛且危险的漏洞。这些漏洞可能被攻击者利用,导致包括源代码泄露、CI/CD管道被篡改以及敏感凭据被盗等严重安全事件。对于每一位依赖自动化工作流的开发者来说,这无疑是一记警钟。
漏洞本质:伪装成“合法”的攻击
卡巴斯基的研究团队发现,这些漏洞的核心在于GitHub Actions的权限管理机制存在设计缺陷。攻击者通常通过以下方式入侵:
- 恶意拉取请求(PR)伪装:攻击者可以向开源仓库提交特制的PR,利用Action的
pull_request_target事件触发工作流。由于该事件默认拥有仓库的写权限,恶意代码可以窃取GITHUB_TOKEN(一种用于身份验证的临时令牌)或环境变量中的敏感信息。 - 上下文注入攻击:通过精心构造的分支名、标签名或提交消息,攻击者可以“注入”恶意Shell命令,绕过常用的输入过滤逻辑。
- 依赖劫持:当工作流引用第三方Action时,若该Action未使用固定哈希(如
@v3版本标签而非@abcdef提交哈希),攻击者可通过篡改上游仓库直接注入后门。
关键数据:卡巴斯基扫描了超过10万个公共GitHub仓库,发现约12.3% 的仓库至少有一个存在漏洞的GitHub Actions配置。其中,超过4700个仓库的配置允许攻击者利用
pull_request_target事件直接获取写权限,而8%的Top 1000流行项目存在严重风险。
真实案例:一个Action的连锁崩溃
报告中提及了一个典型案例:某知名JavaScript工具库维护者使用了第三方社区开发的“自动发布”Action。该Action在pull_request_target环境下执行,且未对输入的PR标题进行严格消毒。攻击者通过提交一个标题包含恶意命令的PR(如echo ${{ secrets.NPM_TOKEN }}),触发了工作流,直接盗取了该工具库的NPM发布令牌。最终,攻击者向该库推送了包含挖矿代码的恶意版本,影响了超过50万次下载的依赖链。
这个案例清楚表明:一个未被妥善保护的Action,可以成为攻击者进入整个供应链的“后门”。
如何保护自己:开发者的实用安全清单
面对这些威胁,开发者不应恐慌,而应采取切实行动。以下是卡巴斯基及行业安全专家推荐的四项核心措施:
1. 严格限制事件触发器
- 避免在
pull_request_target中使用write权限。如果必须使用,请明确设置permissions: read-all或更细粒度的权限。 - 优先使用
pull_request(不拥有写权限)代替pull_request_target,除非你有充分理由。
2. 使用哈希锁定第三方Action
- 在
uses:指令中,始终使用提交SHA(如uses: actions/checkout@ec3a7db)而非语义化版本标签(如@v3)。SHA不可篡改,能防止上游Action被劫持。
3. 实施输入消毒与上下文验证
- 在工作流脚本中,对所有从外部来源(如PR标题、分支名、issue评论)获取的字符串进行转义或正则校验。
- 绝对不要将用户输入直接拼入Shell命令。应使用
${{ env.VARIABLE }}或中间变量进行显式传参。
4. 定期审计工作流配置
- 使用工具(如
actions-validator、slscan)自动扫描仓库中的.github/workflows/*.yml文件。 - 检查每个工作流是否都定义了
permissions:块,并且权限范围最小化。
行动号召:从今天开始加固你的管道
安全不是一次性任务,而是持续的习惯。请立即执行以下三步:
- 立刻检查你负责(或依赖)的所有开源与私有仓库的Actions配置。是否使用了
pull_request_target?是否使用了未被固定哈希的第三方Action? - 采用“最小权限原则”:为每个工作流显式声明所需的最低权限,删除
GITHUB_TOKEN的默认写权限。 - 分享这篇文章给你的开发团队或Tech Lead。一个人的疏忽可能影响整个生态,而集体行动才能堵住漏洞。
在代码自动化的时代,每一行Workflow配置都可能成为攻击者的跳板。别让“方便”成为“漏洞”的别名——现在就行动起来。
免责声明:本文内容基于公开安全研究报告和行业实践整理,旨在提供通用安全建议。不构成对具体产品或服务的认证或担保。读者在实施任何安全措施前,应结合自身项目环境进行独立评估,并咨询专业安全团队。作者及发布方不对因本文信息导致的任何直接或间接损失负责。安全攻防技术日新月异,请始终关注官方安全公告与最新补丁。