GitHub Actions 新增 cache-mode:代理测试流水线审计方案
GitHub 于 2026 年 9 月 10 日宣布,Actions 现已支持在工作流和作业级设置 cache-mode。该功能面向所有 GitHub 套餐正式可用,可决定任务能否读取缓存、写入缓存、只写不读,或完全禁用缓存。

这是 GitHub 的功能,并非 98IP 新产品能力。它与代理测试有关,是因为全球 CI 常缓存浏览器、驱动、依赖包、编译客户端和测试夹具。如果低信任事件能够写入可复用缓存,后续可信任务可能恢复不应信任的构件。
公开来源说明:GitHub,《Control GitHub Actions cache access with cache-mode》,2026 年 9 月 10 日。
GitHub 更新了什么
| 模式 | 可恢复 | 可保存 | 常见用途 |
|---|---|---|---|
read | 是 | 否 | 需要获准依赖的低信任测试 |
write | 是 | 是 | 管理缓存生命周期的可信分支构建 |
write-only | 否 | 是 | 只能生产新构件、不能消费旧状态的任务 |
none | 否 | 否 | 高隔离敏感任务 |
GitHub 说明,pull_request_target 等低信任事件默认使用 read,push 等可信事件默认使用 write。作业级设置覆盖工作流级设置;权限也会传递到可复用工作流,被调用方不能获得高于调用方的缓存权限。
显式设置可以覆盖默认值。若低信任事件显式获得 write 或 write-only,GitHub 会给出警告,因为这会提高缓存污染风险。没有设置该字段的现有工作流继续沿用原有安全默认值。
代理测试为何需要缓存边界
获准的代理测试流水线可能缓存包管理器下载、浏览器与字体、网络测试客户端、已脱敏夹具、跨地区构建产物和性能基线。但绝不能缓存实时代理密码、Cookie、会话令牌、授权头、原始客户数据或住宅出口地址。缓存以复用为目标,不适合保存密钥和可变身份状态。
安全问题不仅是“谁能运行任务”,还包括“这个事件能否保存一个未来由更可信任务恢复的构件”。
先盘点事件信任级别
为每个触发器和可复用工作流记录工作流、事件、来源仓库与分支、权限、缓存模式、缓存键输入、恢复键范围、调用链、密钥与部署权限。
重点检查来自 fork 的拉取请求、pull_request_target、含用户输入的手动触发、使用宽泛恢复键的定时任务,以及跨信任域调用的可复用工作流。
不要因为分支名看起来正常就认定安全。判断应基于事件上下文、仓库关系、受保护环境和实际有效权限。
为不同代理 CI 作业选择模式
低信任贡献的依赖验证
需要使用已批准依赖但不得修改缓存时使用 read。禁止访问生产代理凭据,且缓存键不能通过宽泛前缀选中无关可信构件。
受保护默认分支构建
当代码已审查、分支受保护且凭据范围明确时,可使用 write。该任务只应管理窄命名空间下可复现的依赖或构建输出。
地区构件生产任务
需要生成全新基准包但不能消费历史状态时,可使用 write-only。构件需验证后才能被其他任务恢复。
实时网络或认证测试
认证、Cookie 边界、证书变更或一次性事故夹具测试应考虑 none,从干净环境启动且不写入可复用状态。
结合代理凭据轮换指南,避免长期缓存跨越认证变更。
缩小缓存键范围
最小权限模式不能修复危险的缓存键。键中应包含仓库、工作流、操作系统、架构、运行时版本、锁文件摘要和构件用途等影响兼容性与信任的维度。
不得把密钥写入缓存键,不使用代理用户名、密码、令牌、Cookie 或出口 IP 作为键材料,也要避免用宽泛恢复前缀回退到其他工作流的共享条目。
浏览器和代理客户端版本也是边界。旧客户端在 DNS、TLS、连接复用或 HTTP/2 多路复用上可能不同。curl 8.22 多路复用连接寿命审查说明了为何版本和连接行为需要进入验证证据。
区分夹具与运行时观测
经过审查的静态夹具可以缓存,实时观测通常不可以。公开测试页面的确定性快照、浏览器校验和清单、编译测试工具可作为缓存候选;实时响应、客户 URL、会话 Cookie、出口映射、临时白名单和事故抓包则应进入有保留策略和访问日志的证据系统。
需要关联时使用带密钥指纹,并删除不必要标识符。
审计可复用工作流
即使 GitHub 规定被调用方不能突破调用方权限上限,也应验证完整调用链:确定发起事件和仓库;记录调用方工作流级模式;记录每个作业覆盖项;跟踪所有可复用调用;确认每个作业的有效模式;证明低信任调用方不能保存;证明 none 任务既不能恢复也不能保存。
同时检查 Action 版本,按供应链政策固定第三方 Action,缩减令牌权限,并避免向不需要的任务暴露代理凭据。
建立安全回归测试
使用一次性仓库和无敏感合成构件:
- 可信任务以窄缓存键保存标记。
read低信任任务恢复标记。- 该任务尝试替换标记,保存必须失败。
write-only任务证明不能恢复旧标记,再写入独立新条目。none任务证明恢复和保存都不可用。- 可复用工作流证明有效权限不超过调用方。
- 后续可信任务确认获准条目未被低信任任务修改。
测试不得使用真实密钥或生产代理账号。即使所有测试构件公开,也不应造成风险。
上线与监控
先在最高风险工作流显式声明 cache-mode。监控缓存命中率、构建时间、下载量、保存失败、警告标注与测试一致性。隔离可能减少宽泛恢复并增加时间,应测量成本,不应在未经审查时弱化边界。
跨地区工作节点可按地区和地址族比较结果,但缓存信任与代理路由健康必须分开。缓存未命中不是代理故障。代理池隔离与恢复指南提供了独立的异常出口状态模型。
检查清单
- [ ] 每种触发事件都有明确信任分类。
- [ ] 低信任事件不能保存可复用缓存。
- [ ] 敏感网络测试按需要使用
none。 - [ ] 缓存键范围窄且不含密钥。
- [ ] 宽泛恢复前缀已删除或有充分理由。
- [ ] 可复用调用链保持调用方权限上限。
- [ ] 实时密码、Cookie 与响应从不进入缓存。
- [ ] Action 和运行时版本受控。
- [ ] 合成测试证明各模式有效行为。
- [ ] 上线后已测量构建性能变化。
常见问题
read 能让低信任任务完全安全吗?
不能。它阻止保存缓存,但不能替代密钥隔离、最小令牌权限、Action 固定、输入验证和受保护环境。
所有代理测试都应禁用缓存吗?
不需要。经审查依赖和确定性构件可安全受益。若复用状态与认证、隐私或事故隔离冲突,则使用 none。
cache-mode 能保护已经放进缓存的密钥吗?
它可以减少访问路径,但不能让缓存密钥变得合理。凭据、Cookie 和令牌不应进入缓存。
缓存未命中能证明代理失败吗?
不能。缓存服务、依赖下载、代理传输和目标行为属于不同阶段,需要分别记录。
合规说明
仅对获准资源和目标运行代理与数据采集测试。遵守仓库政策、软件许可、目标条款、隐私规则和速率限制。缓存与日志不得保存凭据,也不得使用代理路由规避访问决定。