缺陷
上游同步流水线在同一个 job 里既执行不可信的上游代码,又持有仓库推送凭据。凭据被写进 .git/config 并在整个 job 期间存在。这条流水线每天 06:00 UTC 自动跑。
实读证据
.github/workflows/sync-upstream.yml:18-19 —— workflow 顶层 permissions: contents: write,且全文只有一个 job(sync,line 26)。不存在只读 candidate 信任域。
.github/workflows/sync-upstream.yml:44 —— token: ${{ secrets.SYNC_TOKEN || github.token }},且没有 persist-credentials: false。全仓只有 docs-locale-sync.yml:21 与 nix-hashes.yml:100 写了这一行,说明这个写法在本仓是已知的、只是这里没用。
.github/workflows/sync-upstream.yml:14-16 —— cron 每天 06:00 UTC,现役。
修法约束
拆成两个信任域:
- candidate 阶段 —— 只读、无推送凭据。跑不可信上游代码,产出不可变的 diff/digest 作为 artifact。
- 推送阶段 —— 独立特权 workflow,用短时 token,在全部 guard 与 smoke 通过之后才推。
actions/checkout 一律带 persist-credentials: false。
边界
.github/workflows/sync-upstream.yml;alpha-owned 路径守卫 .github/workflows/alpha-ci.yml 的 upstream-guard job(line 104-210)。
Out of scope
- 不扩大
upstream-guard 的变化类型覆盖(A/M/D/R 全覆盖是 alpha-code#227 的另一格,该票仍 OPEN)。
- 不改同步的频率或上游选取策略。
退出条件
PR 合并 + 一次真实同步跑通 + candidate job 的 token 权限经 gh api 核实为只读。
出处:2026-08-10 W0 存量普查第二轮,勘破 alpha-code#227 时发现。#227 保持 OPEN(它还有 A/M/D/R 覆盖那一格),本票只切分权这一格。
缺陷
上游同步流水线在同一个 job 里既执行不可信的上游代码,又持有仓库推送凭据。凭据被写进
.git/config并在整个 job 期间存在。这条流水线每天 06:00 UTC 自动跑。实读证据
.github/workflows/sync-upstream.yml:18-19—— workflow 顶层permissions: contents: write,且全文只有一个 job(sync,line 26)。不存在只读 candidate 信任域。.github/workflows/sync-upstream.yml:44——token: ${{ secrets.SYNC_TOKEN || github.token }},且没有persist-credentials: false。全仓只有docs-locale-sync.yml:21与nix-hashes.yml:100写了这一行,说明这个写法在本仓是已知的、只是这里没用。.github/workflows/sync-upstream.yml:14-16—— cron 每天 06:00 UTC,现役。修法约束
拆成两个信任域:
actions/checkout一律带persist-credentials: false。边界
.github/workflows/sync-upstream.yml;alpha-owned 路径守卫.github/workflows/alpha-ci.yml的upstream-guardjob(line 104-210)。Out of scope
upstream-guard的变化类型覆盖(A/M/D/R 全覆盖是alpha-code#227的另一格,该票仍 OPEN)。退出条件
PR 合并 + 一次真实同步跑通 + candidate job 的 token 权限经
gh api核实为只读。出处:2026-08-10 W0 存量普查第二轮,勘破
alpha-code#227时发现。#227保持 OPEN(它还有 A/M/D/R 覆盖那一格),本票只切分权这一格。