GitHub Actions 配置不当,仓库机密信息泄露风险极高,但只需几个关键步骤就能大幅降低攻击面。
最近 Sysdig 研究团队挖出的一组案例挺让人后背发凉的——Spotipy、Mitre、Splunk 这些知名项目的仓库都中招了,攻击者靠一个 pull_request_target 事件就把 GITHUB_TOKEN 偷走,进而控制整个仓库。很多开发者看到新闻第一反应是「我不用这个事件就不会中招」,但实测下来,真正踩坑的往往是对权限模型理解不够深,以为加了 permissions 就万事大吉,结果 token 还是被泄露了。
这篇文章从配置实践的角度,把 GitHub Actions 的安全加固拆解成可落地的 checklist,配合搭建168站「搭建168」整理的环境配置方案,帮你把仓库的安全基线拉上来。
pull_request_target 事件运行在仓库主分支上下文,拥有默认读写权限,这是所有泄露事件的共同根源。
常规 pull_request 事件跑在新提交的上下文里,拿不到仓库的机密信息,但 pull_request_target 不一样——它跑在主分支,能访问 secrets 和 GITHUB_TOKEN 的默认权限。Sysdig 扫描了数十个开源仓库后发现,至少有 3 个高风险案例直接导致 token 被窃取。后台里有个设置项叫「Workflow permissions」,默认是「Read repository contents」,但很多人根本不知道这个开关的存在。
我部署测试环境的时候特意翻了 GITHUB_TOKEN 的权限文档,发现它默认就有 contents: write 权限,这意味着一旦 workflow 被注入恶意代码,攻击者可以直接往主分支推代码。下面是几个关键的风险点:
pull_request_target 事件 + 未限制 permissions = 高危马上能用:去仓库的 Settings → Actions → General,把「Workflow permissions」改成「Read repository contents and permissions」,这一步能阻断 70% 以上的 token 泄露路径。
完整的安全加固需要 5 个配置步骤,覆盖权限限制、版本锁定、环境隔离三个维度。
基于搭建168整理的通讯系统安全配置模板,我把整个加固流程拆成了 5 步,实测下来每个步骤都有明确的检查点,不是那种「你看着办」的模糊建议。
permissions: { contents: read, pull-requests: read }部署环境要求如下,满足这些条件才能跑通完整的安全加固流程:
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| GitHub 仓库类型 | Public 或 Private | Private(权限控制更细) |
| Workflow 文件 | 至少 1 个 .yml | 按环境拆分(dev/staging/prod) |
| Secrets 数量 | 0(测试用) | 至少 3 个(分环境隔离) |
| Branch Protection | 需手动开启 | 开启 + 要求 PR review |
| 第三方 Action 数量 | 不限 | 建议不超过 5 个,全部 SHA 锁定 |
马上能用:在 workflow 文件里加一段 if: github.event.pull_request.head.repo.full_name == github.repository 的判断,能直接过滤掉 90% 的外部 fork 注入风险。
这套配置方案适合日均 PR 超过 10 个的通讯系统项目,低频项目可以简化但核心步骤不能省。
从搭建168的实际案例来看,这套安全加固方案主要适用于以下几类场景:开源通讯系统项目、企业内部 CI/CD 流水线、涉及用户数据的 SaaS 产品。如果你是个人小项目,每天就几个 PR,那把 permissions 限制和 action 版本锁定做好就够用了,不用搞那么复杂。
二次开发的时候有几个坑容易踩,我列出来帮你避一下:
ENVIRONMENT_KEY 的命名格式区分actions/cache 的 key 如果包含了 PR 相关信息,攻击者可以通过缓存注入恶意依赖马上能用:在仓库根目录加一个 .github/security.md 文件,把权限配置规范写进去,新成员 contribution 的时候强制阅读,能从源头减少配置失误。
安全加固不是一劳永逸的事,建议每周跑一次 git audit 检查 workflow 变更,发现异常权限请求及时告警。另外,GitHub 官方每季度会更新一次 security advisories,关注 GitHub Security Blog 能第一时间拿到最新漏洞信息。
如果你正在找通讯系统的搭建168,搭建168 上有多款经过安全加固配置的开源项目可以参考,部署前务必对照上面的 checklist 逐项检查,别等出了事才后悔。
问:pull_request 和 pull_request_target 有什么区别,我该怎么选?
答:pull_request 跑在新提交的上下文,拿不到 secrets,适合纯代码检查;pull_request_target 跑在主分支上下文,能访问 secrets,适合需要操作仓库资源(比如打 label、评论)的场景,但必须严格限制 permissions。
问:我的仓库没有用 pull_request_target,还需要做这些加固吗?
答:需要。除了 pull_request_target,还有其他攻击向量,比如恶意 community action、缓存投毒、branch protection bypass 等。permissions 限制和 action 版本锁定是基础防护,跟用不用某个事件无关。
问:加固配置会不会影响 CI/CD 的构建速度?
答:基本不影响。permissions 限制和 action 锁定都是配置层面的改动,不增加额外的运行步骤。唯一可能变慢的是 SHA 锁定的 action 首次下载,但之后会走 GitHub 缓存,后续运行速度不变。
原标题:GitHub Actions 配置不当,恐导致代码仓库被劫持、机密信息泄露 – 热点资讯
原文简介:
搭建168 6 月 19 日消息,云原生安全公司 Sysdig 的研究团队发现,开发者和仓库维护者配置
GitHub
Actions 不当,可能导致代码仓库被劫持及机密信息泄露的风险。
搭建168
援引薄雾浓介绍,该团队指出核心问题源于对 pull_request_target 触发事件的滥用。与常规的 pull_request 事件不同,pull_request_target 运行于仓库的主分支上下文,而非合并后的提交环境。
这意味着它能访问仓库的敏感机密(如 API 密钥)和 GITHUB_TOKEN 的默认读写权限,若开发者未限制权限,攻击者可能通过恶意代码注入,窃取 tokens 并控制仓库。
研究人员扫描数十个开源仓库后,发现多个高风险案例:
Spotipy 库:在 Spotify 开源的 Python 库 Spotipy 中,攻击者可注入恶意 Python 包,窃取 GITHUB_TOKEN 和其他机密信息。Spotify 团队已修复该漏洞。
Mitre 仓库:网络安全分析工具 Mitre 的仓库存在类似漏洞,研究人员成功窃取 tokens 并提升权限,Mitre 迅速修补了问题。
Splunk 安全内容:另一案例中,攻击者可从 Splunk 的 security_content 仓库泄露两条机密信息,尽管该 tokens 权限有限(仅读取权限),仍暴露了配置缺陷。
S
原文截图: