GitHub 官方安全文档指出,自托管 Runner 不保证每次任务都运行在干净、临时的虚拟机中。查看自托管 Runner 的安全说明。因此,GitHub Actions 自托管 Mac Runner 密钥泄露一旦疑似发生,先暂停可疑工作流并隔离主机,再撤销或轮换可能暴露的凭据、检查日志与权限;完成环境清理和可信代码复测前,不要让 Runner 接收新任务。
这篇指南适合用自托管 Mac Runner 构建公开或私有仓库的独立开发者,以及需要厘清客户仓库访问责任的自由职业者。
如果你所在的小型远程团队收到了异常工作流或拉取请求告警,可以按下方时间线统一止损、复核和恢复。
先辨认信号:告警不等于已确认泄露
处理时把事件分成三种状态:一般告警、疑似暴露、已确认泄露。一条告警本身不能证明凭据已经被读取或滥用;同样,日志里没有明文,也不能证明凭据安全。先保留工作流运行记录、相关提交与触发事件信息,再判断下一步影响范围。
- 一般告警:发现陌生拉取请求、工作流权限变化或异常运行,但暂时没有证据显示凭据进入不可信代码或外部系统。先暂停可疑任务,核对触发器、提交来源和权限。
- 疑似暴露:日志或构建产物出现凭据片段,或者不可信代码曾在可访问凭据的 Runner 上运行。按可能已暴露处置,先限制凭据使用,再调查。
- 已确认泄露:凭据出现在公开日志、工件或未经授权的访问记录中,或凭据所有者确认遭到滥用。立即撤销对应凭据,并按组织的安全事件流程升级处理。
日志遮蔽只能降低凭据原样出现在日志中的可能,不能当作安全证明。GitHub 说明,自动遮蔽依赖日志中出现与秘密值匹配的内容,结构化数据等情况可能导致遮蔽失败。GitHub Secrets 文档提醒你不要依赖日志遮蔽代替凭据撤销。
第一阶段:暂停派发并保留必要证据
先让可疑代码停止接触 Runner 和新凭据。取消或暂停相关工作流,停止 Runner 服务,或按组织策略暂时限制自托管 Runner 的使用;具体操作取决于你是否有仓库、组织和主机管理权限。GitHub 文档也区分了“暂时停止 Runner 接单”和“永久移除 Runner”:停止主机或 Runner 应用会让它离线,但不会自动清除主机状态。移除自托管 Runner 的说明
在查看日志和事件记录时,避免把疑似凭据复制到聊天、工单或新的工作流输出中。至少记录事件涉及的仓库、Runner 名称、工作流文件、运行记录、触发方式、提交来源,以及你暂停任务和撤销凭据的时间。工作流日志可以在运行页面中查看或下载;若一次运行经过部分重跑,下载的日志可能只包含重跑过的任务,因此需要一并核对先前尝试的记录。GitHub 工作流日志操作说明
第二阶段:判断拉取请求代码是否接触到 Runner 和密钥
你要核对的是工作流实际执行了什么,而不是只看仓库设置中的“是否允许 fork”。检查事件触发器、审批策略、工作流文件来自哪个分支、检出的代码来源,以及运行任务时可用的 Token 权限。尤其要确认有没有在高信任事件中检出并执行拉取请求分支的代码。
GitHub 对 pull_request 与 pull_request_target 的信任边界有明确说明:来自 fork 的 pull_request 工作流默认受到凭据和 Token 权限限制;而 pull_request_target 会使用基础仓库一侧的工作流,并可能获得仓库秘密和高权限 GITHUB_TOKEN。如果工作流随后检出并执行拉取请求中的不可信代码,风险就会改变。安全使用 pull_request_target 的官方说明
因此,逐项检查:
- 哪些工作流会响应 fork 的拉取请求,审批策略是否允许其运行。
- 是否存在
pull_request_target工作流,以及后续步骤是否检出或执行了拉取请求中的代码。 - 是否有工作流把仓库密钥、环境密钥或
GITHUB_TOKEN传给第三方 Action、脚本或构建命令。 permissions是否只开放当前任务必需的权限;未明确设置的权限会受工作流或仓库配置影响,不能仅凭代码里没写secrets.GITHUB_TOKEN就认定 Action 无法访问 Token。工作流权限说明
不要为省事绕过审批,也不要把高权限事件改成执行不可信代码的捷径。 如果团队无法确认工作流是否安全,先保持 Runner 停用,再由仓库负责人和主机责任方共同复核。
拉取请求触发时,哪些线索会改变判断?
| 检查线索 | 需要确认的边界 | 处置判断 |
|---|---|---|
pull_request 与 fork |
谁提交了代码、审批策略是否允许任务运行、工作流实际检出了什么 | 若不可信代码进入自托管 Runner,按主机可能受影响处理 |
pull_request_target |
工作流是否使用基础分支版本;后续步骤有没有检出并执行拉取请求代码 | 发现不可信代码被执行且 Runner 可访问凭据时,按疑似暴露处置 |
| Token 与秘密 | 相关任务能访问哪些仓库秘密、环境秘密及 Token 权限 | 对可被任务读取的凭据扩大核查范围,不只查日志中出现的值 |
表格中的判断依据来自 GitHub 对拉取请求事件、Runner 风险和工作流权限的说明;它用于定位风险,不替代对实际运行记录的调查。
第三阶段:按暴露范围撤销或轮换凭据
先列清单,再按类型处理,避免只轮换日志中看见的那一项。你可能需要核对仓库级和环境级 secrets、组织级 secrets、个人访问令牌、部署密钥、签名证书、包管理器凭据,以及可能可写入仓库的 GITHUB_TOKEN 权限。对客户项目,先和客户确认由谁撤销、重新签发并验证新凭据,避免你无权操作或遗漏对方系统。
GITHUB_TOKEN 是按工作流任务生成的,任务完成后会过期;它不等同于长期存在的个人访问令牌。对它的应急处置重点通常是检查任务权限、事件类型和可能的滥用记录,而不是把它当成普通仓库密钥手工“轮换”。GitHub 对 GITHUB_TOKEN 的说明
若需要盘点密钥配置,GitHub 文档列出仓库 secrets 和环境 secrets 的数量上限均为 100 个,单个 secret 的大小上限为 48 KB。这些是平台限制,不表示你应该存满;事件响应时,按名称和可访问范围清点,再确认每个凭据的签发方、用途、撤销方式和新凭据的最小权限。前文链接的 GitHub Secrets 文档说明了密钥的使用边界;平台文档不能替代外部服务方的撤销记录,因此要在凭据签发方确认旧值已失效。
凭据类型与核查范围
| 凭据类型 | 主要复核点 | 轮换或验证方式 |
|---|---|---|
| 仓库、组织或环境 secrets | 哪些工作流、环境和 Action 可以读取;是否曾输出到日志或工件 | 在凭据所属服务撤销旧值并生成新值,确认旧值拒绝认证 |
GITHUB_TOKEN |
触发事件、任务权限、是否能写仓库或访问相关资源 | 检查运行记录及权限配置;不要把它与长期凭据混为一谈 |
| 外部服务凭据 | 凭据服务方、关联账户、授权范围和近期使用记录 | 在服务方撤销旧凭据,核对审计记录,再用新凭据完成受控验证 |
| 主机上的证书或本地授权 | 是否保存在 Runner、构建目录、登录钥匙串或脚本配置中 | 由主机责任方检查并按资产流程重新签发或清理 |
第四阶段:Runner 执行过不可信代码,就不能只靠重新注册
如果不可信代码已经在 Runner 上执行,不能因为从 GitHub 移除了 Runner、重新注册,或换了注册令牌,就推断主机恢复可信。自托管 Runner 不保证每次工作流都在干净、隔离的临时环境中;不可信工作流代码可能留下持续影响。GitHub 自托管 Runner 安全建议
先由有权限的主机责任方隔离并检查受影响设备。若无法证明其完整性,应按照组织事件流程决定清理或重建环境,再移除旧 Runner 并重新注册。GitHub 的移除操作可以解除 Runner 与 GitHub 的注册关系,但解除注册不等于清理主机上的其他状态。这是根据移除说明与 Runner 安全警告得出的处置边界;具体清理范围应由主机责任方确认,不能把重新注册当作修复证明。
第五阶段:恢复前用可信代码验收
只有在凭据已按暴露范围处理、权限配置复核完成、主机完成责任方要求的清理或重建后,才进入验收。先用不含生产凭据的受控工作流检查 Runner 状态和基本构建结果,再按需逐步恢复必要权限;如果任务仍需访问敏感凭据,确认其仅对预期任务可用,并记录谁批准恢复。
你可以用这份验收清单逐项签字:
- ✅ 可疑工作流已停止,相关运行、提交和触发方式已留档。
- ✅ 暴露范围已明确;已撤销或轮换相关凭据,并在凭据所属服务核实旧值失效。
- ✅ Runner 主机由责任方检查、清理或重建;仅重新注册不算完成。
- ✅ fork 拉取请求、
pull_request_target、审批策略和GITHUB_TOKEN权限已复核。 - ✅ 可信代码测试通过;测试没有重新引入未经确认的生产密钥。
- ✅ 团队记录了恢复决定、责任人和后续监控方式。
如果你的 Runner 由外部托管,恢复前还要核对主机隔离责任、凭据保管与事件协作边界。macminirent 的数据保护说明可作为你检查服务数据处理信息的入口,但不能替代针对具体主机和事件的书面确认。需要规划远程 macOS 环境验收时,也可查看 macminirent 的相关使用指南;不要从平台功能推断出未经核实的托管安全承诺。
结束止损后,再比较当前主机与 Mac 托管方案
如果你的 Runner 直接放在随身设备或团队自管主机上,旅行网络中断、设备遗失或损坏、主机状态长期复用,以及凭据和系统更新责任,都会增加恢复时需要核查的环节。把构建环境迁到远程 Mac,可能让你不必随身携带构建主机;但它不会自动解决工作流权限、凭据轮换或隔离责任问题,也不适合所有需要特定物理接口或长期固定硬件的任务。
如果你正考虑由 macminirent 提供远程 Mac 环境,应先核对当前服务说明中的访问权限、主机隔离责任和凭据管理方式,再决定是否迁移;需要自行核验服务范围时,可从macminirent 服务说明开始。对正在处置泄露的项目,先完成本指南的隔离、轮换和复测,再做迁移决策,避免把更换主机误当成安全事件已经结案。
密钥泄露后,换一台独享 Mac 重建 Runner 环境
通过 macminirent 租用独享物理 Mac mini,为受影响的持续集成任务重新建立隔离、可控的运行环境。
