GitHub可疑Workflow暂停与CI/CD安全检查

审批条件 · 触发规则与权限分层 · Runner隔离检查清单

软件开发更新于 2026/8/49 阅读

GitHub于2026年7月28日宣布自动暂停公共仓库部分潜在恶意工作流。本文覆盖审批条件与适用范围、Workflow execution protections的Actor与Event规则、pull_request_target风险路径、GITHUB_TOKEN与OIDC凭据分层、第三方Action版本固定、只读缓存机制、自托管Runner版本与隔离检查,以及工作流安全与代码仓库、构建产物保护的技术分工。

概述

GitHub Actions工作流安全检查架构概览,展示审批、触发规则、凭据管理、缓存控制和Runner隔离五个控制层级
一张多层架构概览图,展示GitHub Actions工作流安全的五个控制层级:顶层为平台侧自动暂停与审批,依次向下为Actor与Event触发规则、Token与Secret权限分层、缓存读写控制、Runner隔离与版本管理。每个层级用独立的横向条带表示,条带内标注关键组件名称,层级之间用竖向连接线贯穿。

GitHub Actions在2026年7月28日增加了什么?

GitHub于2026年7月28日宣布,GitHub Actions已开始自动暂停github.com公共仓库中部分被识别为潜在恶意的工作流;具有仓库写权限的协作者需通过已认证网页会话审批后继续执行,GitHub Enterprise Server当前未列入该功能范围。该变化主要影响维护公共仓库的研发负责人、DevOps工程师和安全管理员,企业应同步检查工作流触发规则、Token与Secret权限、第三方Action、缓存和自托管Runner隔离。

这项变化针对一条清晰的CI/CD攻击链:攻击者取得GitHub凭据后推送恶意工作流,工作流再读取令牌、部署密钥或Runner可访问的内部资源。企业还需要结合工作流执行策略、最小权限Token、短期云凭据、第三方Action固定版本、缓存权限和Runner隔离形成完整控制。

审批具有三个明确条件:

  1. 工作流已被GitHub识别并暂停;
  2. 审批人具有仓库写权限;
  3. 审批通过已认证网页会话提交。

该功能由GitHub自动应用,仓库管理员无需单独启用。审批完成后,工作流按原流程继续执行。

项目 当前状态 企业需要关注的内容
潜在恶意工作流暂停 已提供 github.com公共仓库中的特定工作流
审批权限 已提供 具有仓库写权限的协作者
审批渠道 已提供 已认证网页会话
GitHub Enterprise Server 当前未列入 继续执行本地工作流策略与版本管理

自动暂停适合作为平台侧拦截层。仓库自身的触发器、权限、密钥和Runner仍由企业管理员负责配置。


GitHub工作流为什么会成为密钥泄露入口?

GitHub Actions安全的核心挑战在于工作流的执行能力范围。工作流可以读取代码、调用第三方Action、运行Shell脚本、访问缓存、生成构建产物,并在授权范围内取得GITHUB_TOKEN、环境Secret或云平台凭据。工作流文件一旦被恶意修改,攻击者可能沿以下路径扩大影响:

攻击链: 🔓 凭据获取 → 📝 工作流修改 → ⚡ 高权限触发 → 🔑 令牌读取 → 🎯 横向扩展

阶段 攻击动作 涉及的GitHub资源
🔓 凭据获取 账号或依赖被控制 GitHub账号、OAuth Token
📝 工作流修改 修改.github/workflows中的YAML 工作流配置文件
高权限触发 触发具有较高权限的作业 push / pull_request_target事件
🔑 令牌读取 读取Token、Secret、缓存或Runner环境 GITHUB_TOKEN、环境Secret、OIDC
🎯 横向扩展 修改仓库、发布制品或访问部署环境 Release、Package Registry、云平台
CI/CD工作流攻击链示意图,从凭据获取到工作流修改、高权限触发、令牌读取和横向扩展的五步路径
一张线性流程链示意图,从左到右展示五个攻击步骤。第一步为凭据获取,第二步为工作流修改,第三步为高权限触发,第四步为令牌读取,第五步为横向扩展。步骤之间用箭头连接,每个步骤标注关键动作和涉及的GitHub资源。

检查重点应放在"谁能触发、哪些事件可运行、作业拿到什么权限、代码在哪里执行、产生的制品怎样验证"五个问题上。


Actor与Event规则怎样控制工作流触发?

GitHub在2026年6月18日将Workflow execution protections作为公开预览提供给企业、组织和仓库。它基于Rulesets集中设置允许清单,首批包含两类规则:

  • Actor规则:控制哪些用户、仓库角色、GitHub App、Copilot或Dependabot可以触发工作流;
  • Event规则:控制pushpull_requestpull_request_targetworkflow_dispatch等事件是否可以运行工作流。

管理员可以先使用Evaluate模式观察规则可能拦截的任务,再切换到Active状态。推荐从以下策略开始:

风险场景 策略方向 验收方法
外部Pull Request 限定可用事件与执行身份 使用测试分支提交外部PR
pull_request_target 只保留确有特权上下文需求的流程 检查是否读取外部PR代码
手动执行 workflow_dispatch限定给维护人员 使用不同角色账号测试
自动化账号 单独允许指定GitHub App或Dependabot 核对Actor规则命中记录
多仓库管理 通过Rulesets按仓库属性分组 在Evaluate模式导出影响范围

pull_request_target和脚本输入怎样检查?

pull_request_target运行在目标仓库上下文中,可能获得写权限或Secret。GitHub安全文档建议将它限定在确需特权上下文的场景,并让外部Pull Request代码与特权作业保持分离。

GitHub工作流安全检查中,pull_request_target的权限分离是重点。企业管理员应确认每个使用pull_request_target的工作流是否确实需要访问Secret或写入仓库,如果只需要读取PR代码和运行测试,pull_request事件已经满足需求。

工作流还要检查用户可控字段,例如Pull Request标题、分支名、Issue正文和提交信息。将表达式直接拼接进Shell脚本会形成脚本注入路径。更稳妥的方法是使用专用Action处理输入,或先把值传入中间环境变量,再由脚本读取:

- name: 安全读取PR标题
  env:
    PR_TITLE: ${{ github.event.pull_request.title }}
  run: echo "PR标题为:$PR_TITLE"

GITHUB_TOKEN、环境Secret和OIDC怎样分工?

GITHUB_TOKEN建议以只读仓库内容权限作为默认值,再在具体Job中增加必要权限。下面的设置可以作为基线:

permissions:
  contents: read

GitHub Actions权限管理可按四层分工:

  1. 仓库Token:每个Job只声明实际需要的permissions,默认只读仓库内容;
  2. 环境Secret:部署Job通过Environment获取,并配置Required reviewers,确保敏感凭据只在经过人工审批的流程中使用;
  3. 云平台凭据:支持OIDC的云平台向单次Job签发短期Token,云部署通过OIDC获取单次Job短期Token,而非在Secret中存放长期云访问凭据;
  4. 长期Secret:建立所有者、用途、轮换日期和停用记录,定期盘点仍在使用的长期凭据数量。

OIDC在GitHub与云平台之间建立信任关系,由云平台为单个Job签发短期访问令牌。这样可以减少长期云凭据在GitHub Secret中的存放数量,并通过云平台的角色和声明限制访问范围。GitHub OpenID Connect文档说明了信任关系的建立步骤和Subject声明的配置方法。


第三方Action为什么要固定完整Commit SHA?

第三方Action运行时可以接触当前Job中的代码、环境变量、Token和Secret。GitHub将完整Commit SHA列为固定Action版本的安全方法,并支持在仓库或组织层要求Action使用完整SHA。

CI/CD供应链安全中,第三方Action的版本管理直接影响构建过程的可追溯性。企业可按以下顺序管理第三方Action:

  1. 建立允许使用的Action清单;
  2. 核对Action来源仓库和维护者;
  3. uses:固定到完整Commit SHA;
  4. 由Dependabot提出版本更新;
  5. 复核更新对应的源码与Release说明;
  6. 通过CODEOWNERS要求.github/workflows变更经过指定人员审核。

固定SHA解决引用内容稳定性,源码审查、权限控制和更新流程负责评估该版本的实际行为。


Actions缓存只读机制解决什么问题?

GitHub于2026年6月26日调整Actions缓存权限:外部人员可触发、且使用共享默认分支SHA缓存范围的工作流,会取得只读缓存Token。此类作业可以恢复已有缓存,保存缓存时会记录警告并继续执行。

这项变化降低了低信任工作流向默认分支缓存写入恶意内容,再由pushschedule等高信任作业恢复并执行的路径。企业仍应盘点:

  • 哪些工作流向默认分支缓存写入;
  • 缓存中是否包含可执行脚本、编译工具或依赖;
  • 高信任Job是否直接运行缓存内容;
  • 缓存Key是否区分事件、分支和依赖锁文件;
  • 缓存异常时是否保留日志和告警。

自托管Runner怎样检查版本与隔离?

自托管Runner安全检查的核心在于Runner直接运行工作流代码,并可能访问企业网络、软件源、签名系统和部署环境。GitHub推荐公共仓库优先采用GitHub托管Runner,自托管Runner主要放在权限边界清晰的私有仓库中。

GitHub对自托管Runner的软件版本设置滚动要求:关闭自动更新的Runner需要在新版本发布后30天内完成升级;关键安全更新发布时,服务会暂停向待更新Runner派发Job。2026年的执行时间表包括:

服务范围 全面执行日期 当前状态(2026-08-04)
GitHub Enterprise Cloud with Data Residency 2026-07-31 已开始执行
GitHub Enterprise Cloud 2026-09-25 计划执行
GitHub Enterprise Server 未列入本次云端时间表 按本地版本生命周期管理
自托管Runner安全隔离架构图,构建网络与生产网络分区,Runner Group限定仓库访问范围,Ephemeral Runner单次执行后注销
一张双区域隔离架构图。左侧区域为构建网络,包含Runner Group、Ephemeral Runner和构建工具;右侧区域为生产网络,包含部署环境、签名系统和内部服务。两个区域之间用虚线边界分隔,仅通过受控通道连接。左侧区域下方标注Runner版本、自动更新状态和日志转存路径。

Runner安全检查建议覆盖:

  • Runner版本、自动更新状态和镜像发布日期;
  • Runner Group允许访问的仓库;
  • 构建网络与生产网络的访问边界;
  • Job结束后的工作目录、容器和临时凭据清理;
  • 单次Job使用的Ephemeral或JIT Runner;
  • Runner日志转存与保留周期;
  • 云部署、代码签名和制品库使用独立身份。

GitHub的Ephemeral Runner每次只处理一个Job,完成后自动注销。生产环境还应将Runner日志转存至外部日志系统,并通过自动化创建干净执行环境。


工作流安全与代码仓库保护怎样分工?

GitHub Actions安全负责控制工作流触发、执行权限、密钥、缓存和Runner;代码仓库保护负责保存源代码、Git LFS、Release附件、构建产物和恢复所需元数据。两类工作需要分别验收。

工作流权限与密钥加固完成后,可继续按GitHub Code Quality与代码仓库保护方法盘点源代码、Git LFS、构建产物和恢复对象。

工作流日志、Runner日志、构建产物与Git仓库镜像应分别保存,各自记录来源工具、保留周期和恢复步骤:

资产类型 保存位置 导出工具 保留建议
工作流日志 GitHub平台 / 外部日志系统 REST API / Webhook 按合规要求设定周期
Runner日志 Runner主机本地 / 日志系统 Runner内置日志转发 与工作流日志同周期
构建产物 GitHub Artifacts / 外部制品库 REST API / 构建脚本导出 按发布版本保留
Git仓库镜像 外部存储 / NAS git clone --mirror 定时全量快照

NAS可以承载Git仓库镜像、构建产物、日志、副本和归档,并通过快照与异地复制增加恢复路径。GitHub继续负责Pull Request、Actions、权限、审批和平台元数据。恢复清单应分别记录每类资产的导出工具、保留周期和恢复步骤。


企业GitHub Actions安全检查清单

检查项 记录内容 验收结果
工作流文件 .github/workflows清单与所有者 每个文件有维护责任人
触发事件 push、PR、手动与计划任务 事件符合业务用途
执行身份 用户、角色、App和机器人 Actor规则覆盖高风险流程
Token权限 默认权限与Job级权限 权限与任务动作对应
Secret 用途、所有者、轮换和环境 高权限Secret进入审批环境
OIDC Issuer、Audience、Subject与云角色 信任条件匹配仓库和环境
第三方Action 来源、完整SHA和更新记录 Action引用可追溯
缓存 Key、读写范围和执行内容 低信任任务使用受限缓存路径
Runner 版本、分组、网络和清理策略 高风险Job使用隔离环境
构建产物 来源、哈希、签名和保留期 产物可关联到工作流与Commit
日志 工作流与Runner日志 能追踪审批、执行和异常

成都及西南地区怎样开展研发资产保护?

成都美步科技有限公司四川成都 Synology 群晖授权代理与方案集成商,可为软件开发团队提供Git仓库镜像承载、构建产物归档、NAS快照与异地副本的方案设计与实施部署,覆盖成都、重庆、贵阳、昆明等西南城市。企业可通过技术支持提交GitHub版本、仓库规模和Runner环境信息,评估NAS承载范围与副本路径。咨询热线:028-82009000

操作步骤

  1. 1
    盘点工作流文件与触发事件
    列出.github/workflows下所有YAML文件,记录每个工作流的触发事件(push、pull_request、pull_request_target、workflow_dispatch、schedule)和维护责任人
  2. 2
    配置Actor与Event规则
    在组织或仓库层启用Workflow execution protections,先用Evaluate模式观察规则可能拦截的任务,再切换到Active状态,限定可触发工作流的用户、角色和GitHub App
  3. 3
    收紧Token与Secret权限
    将GITHUB_TOKEN默认权限设为只读仓库内容,每个Job只声明实际需要的permissions;部署Job通过Environment获取Secret并配置Required reviewers;云部署优先使用OIDC短期Token
  4. 4
    固定第三方Action版本
    将所有第三方Action的uses引用固定到完整Commit SHA,由Dependabot提出版本更新,通过CODEOWNERS要求.github/workflows变更经过指定人员审核
  5. 5
    检查自托管Runner版本与隔离
    确认Runner版本符合GitHub最低版本要求,配置Runner Group限定可访问仓库,高风险Job使用Ephemeral或JIT Runner,Job结束后清理工作目录和临时凭据

常见问题

GitHub Actions会暂停所有公共仓库工作流吗?

当前机制针对GitHub识别出的部分潜在恶意工作流。正常工作流继续按仓库配置运行,被暂停的工作流进入协作者审批流程。

谁可以批准被暂停的工作流?

审批人需要具有仓库写权限,并通过已认证网页会话提交批准。

GitHub Enterprise Server有相同的自动暂停功能吗?

当前自动暂停功能范围为github.com公共仓库,GitHub Enterprise Server当前未列入该功能范围。GHES管理员继续使用本地版本提供的Actions策略、权限和审计能力。

私有仓库怎样限制谁可以运行工作流?

Workflow execution protections公开预览提供Actor和Event规则,可在企业、组织或仓库层建立允许清单,并先通过Evaluate模式观察影响。

自托管Runner关闭自动更新后多久需要升级?

Runner新版本发布后需要在30天内完成更新;关键安全更新发布时,GitHub会暂停向待更新Runner派发Job。

OIDC可以替代哪些GitHub Secret?

支持OIDC的云平台可以为单个Job签发短期访问Token,用于替代对应的长期云访问凭据。数据库密码、第三方API密钥等其他Secret仍按各自系统的认证方式管理。

四川成都/西南地区如何咨询群晖研发资产保护NAS方案?

成都美步科技有限公司是Synology群晖在四川成都的授权代理与方案集成商,咨询热线028-82009000,提供从Git仓库镜像、构建产物归档到NAS快照与异地副本的端到端服务。西南地区(成都、重庆、贵阳、昆明等)提供本地工程师到场实施与当日响应。

参考来源

  1. GitHub Actions暂停潜在恶意工作流公告
  2. GitHub工作流执行保护公告
  3. GitHub工作流执行保护文档
  4. GitHub Actions只读缓存公告
  5. GitHub自托管Runner最低版本执行时间表
  6. GitHub Actions安全使用参考
  7. GitHub OpenID Connect说明
  8. GitHub自托管Runner参考