0–5 分钟:证明 provenance
选择 latest release,追踪 source revision、build job、digest、signer、metadata 与 promotion decision。
成功标准一个 release 可端到端重建,无需猜测。
桌面更新发布安全检查表 · 更新 2026-07-05
面向 Tauri、Electron、Pake 式 wrappers 与其他通过 macOS/Windows 分发 signed installers 和 automatic updates 的 desktop apps 发布安全检查表。
Desktop auto-update 会把 release pipeline 变成 privileged remote-code delivery system。即使应用本身安全,只要 signing keys 泄漏、update metadata 可随意修改、release automation 权限过宽、没有 staged rollout,或团队无法 halt/rollback bad update,就可能发生灾难性故障。
这份 checklist 把 packaging、code signing、macOS notarization、Windows signing/time stamping、update metadata、artifact hosting、release promotion、telemetry、staged rollout、emergency halt、rollback 与 compromised-release recovery 当作一条完整 control chain。目标是让每个 trusted release 都可复现、可归因、可停止、可恢复。
RepoDaily 判断
在团队能用证据回答五个问题前,不要启用 unattended desktop updates:谁能签名、哪个 source revision 产生 artifact、client 如何验证 metadata/artifact、如何在扩大影响前暂停 rollout、bad/compromised release 后用户如何恢复。Signing 本身不是完整 release-security strategy;完整链路还需要 protected identities、provenance、verification、staged promotion、monitoring、halt controls、rollback policy 与 incident recovery。
| 发布表面 | 基线规则 | 失败信号 | 保留证据 |
|---|---|---|---|
| Source revision | 从 immutable reviewed revision 发布 | Manual local build 或 moving branch ref | Commit/tag、review、build run identity |
| Build environment | 受控 reproducible release workers | Developer laptop 产出 public artifacts | Runner identity、toolchain versions、build logs |
| Signing identity | Signer access 最小且可审计 | Certificate 导出后广泛共享或 CI secret scope 过宽 | Signer owner、access policy、signing event log |
| macOS distribution | 正确 identity 签名并完成 notarization | Unsigned/ad hoc/unnotarized public artifact | Signature verification 与 notarization result |
| Windows distribution | 可信 code signing,并按策略 time stamp | Unsigned installer 或证书过期后无法验证 | Signature verification 与 timestamp evidence |
| Update metadata | 验证 version、URLs、hash/signature、platform、rollout data | Mutable feed 可把 client 指向 arbitrary binary | Metadata snapshot 与 verification test |
| Artifact hosting | Immutable release objects + restricted write access | Approved file 可原地替换 | Object/version identifier、digest、access log |
| Promotion | Build 与 production promotion 分离 | 一个 job build 后立即触达全部 clients | Approval record 与 promoted digest |
| Rollout | Internal/canary 起步并设置 health gates | Publish 即 100% rollout | Cohort size、metrics、promotion decision |
| Emergency halt | 有 tested stop-new-adoption 控制 | 只能删文件或手工热改 production | Halt runbook 与 exercise result |
| Rollback | 明确 downgrade 或 forward-fix policy | Migrated data 无法被旧 binary 读取且没有 recovery | Compatibility matrix 与 recovery test |
| Incident recovery | 准备 signer rotation/revocation 与 trusted recovery release | Compromised signer 后无 alternate trust path | Rotation owner、revocation steps、recovery channel |
Broad automatic rollout 前给 updater pipeline 打分。
| 控制项 | 0 分 | 1 分 | 2 分 | Owner 问题 |
|---|---|---|---|---|
| Release provenance | Unknown/manual | 记录 build job | Reviewed immutable revision + auditable build identity + digest | 能否证明哪个 source 产生这个 binary? |
| Signer protection | Shared/exported broadly | Broad CI secret | Narrow protected signer + audited use + rotation plan | 谁能产生 trusted binary? |
| Platform trust | Unsigned | Signed only | Signed + platform verification + notarization/timestamp policy | 以后 OS 和用户仍能验证 release 吗? |
| Metadata integrity | Mutable unauthenticated feed | HTTPS only | Updater crypto verification + immutable digest/provenance | Feed compromise 能否投递 arbitrary code? |
| Rollout control | 立即全部用户 | Manual partial | Cohorts + gates + metrics + pause/promotion controls | Bad release 第一批最多影响多少用户? |
| Halt control | Delete/hot-edit | Manual pause | Tested emergency halt + owner + evidence | 多快能阻止更多 client 更新? |
| Rollback/recovery | Reinstall | Manual downgrade | Tested rollback/forward-fix + data recovery | Schema-changing bad release 后怎么办? |
| Compromise response | No plan | Manual key rotation | Revocation/rotation + alternate channel + recovery drill | Trust anchor compromise 后如何恢复? |
启用 broad automatic updates 前的快速 release gate exercise。
选择 latest release,追踪 source revision、build job、digest、signer、metadata 与 promotion decision。
成功标准一个 release 可端到端重建,无需猜测。
修改 artifact 或 metadata fixture,并验证 updater 按 runtime trust model 拒绝。
成功标准Tampering fail closed 且 diagnostics 可用。
列出可以 sign 或 publish stable metadata 的 identities/jobs。
成功标准Signer 与 stable-channel permissions narrow、owned、auditable。
把 harmless test release promotion 到 small cohort,观察 health 后暂停扩散。
成功标准无需删 evidence 或 ad hoc 修改 production 就能 halt rollout。
使用代表性 local data/config 测试 downgrade 或 forward-fix。
成功标准用户能回到 supported state 且无 silent data loss。
Walk through freeze、evidence preservation、restriction、rotation/revocation、notification 与 recovery release。
成功标准Incident 有 owner、alternate trust path 与具体 first actions。
| 场景 | 必需控制 | 停止条件 |
|---|---|---|
| Small Tauri desktop app | Updater signing key protection、signed updater artifacts、staged channel、rollback test | Updater key 与 broad build credentials 共用或 rollback 未测试 |
| Electron app using autoUpdater | Signed app/installers、controlled feed、platform-specific testing、staged release | Feed 可无审批重定向全部 clients |
| macOS direct distribution | Developer ID signing、notarization、verification、immutable download | Public artifact unsigned、unnotarized 或可原地替换 |
| Windows direct download | Trusted signing、verification、timestamp policy、protected signer | Unsigned installer 或 signing cert uncontrolled export |
| Pake-style internal wrapper | Pinned build source、signed installer、controlled target URL policy、managed update channel | Wrapper update 和 remote target 都可无 review 改变 |
| Desktop app with local DB migration | Compatibility plan、backup/restore test、staged rollout | Schema migration 使 rollback impossible 且 recovery 未测试 |
| Security hotfix | Fast lane 仍保留 signer protection、provenance、verification、canary、halt | Emergency process 绕过 trust chain |
| Suspected signing compromise | Freeze、preserve evidence、restrict signer、rotate/revoke、alternate recovery channel | 继续通过 suspected trust path 发布 |
被盗 signing identity 可让恶意 artifacts 看起来可信。Signing authority 应比普通 CI credentials 受到更强保护。
审批后仍可替换同 URL binary 会破坏 provenance,也让 incident reconstruction 变困难。
没有独立 verification 的 update feed 可以把 clients 指向任意 URL,会成为高价值 control plane。
Publish 后直接触达全部 clients,会失去提前发现 crashes、migration failures、update loops 与 platform regressions 的机会。
当新版本不可逆修改 local DB、config、plugins 或 caches 时,binary rollback 没有意义。
Security hotfix 在压力下跳过 signing controls、provenance、verification 或 canary rollout,往往带来第二次事故。
弱 certificate lifecycle 与 timestamp practices 会让合法历史 release 难以继续验证。
Updater channel compromise 后,如果 notification 与 recovery artifacts 也依赖同一 trust anchor,恢复会更困难。
Platform artifact 只创建一次,以 digest 标识,并把同一字节依次 promotion 到 internal、canary、stable。
普通 CI build/test,较窄 protected step/service 在 policy checks 后签名。
记录 source revision、artifact digest、version、platform、signer、build identity、metadata revision、rollout cohort 与 rollback target。
只有 install success、launch success、crash rate、update completion 与关键 workflow checks 达标才 promotion。
通过 channel/promotion control 暂停 new adoption,不删除调查所需 release artifacts。
每个 local data/config migration 在 release 前标记 reversible、backward-compatible、backup-required 或 forward-fix-only。
事故前演练 restriction、revocation/rotation、alternate signing path、trusted notification 与 recovery release。
面向运营 desktop update channels 团队的简短回答。
不够。还需要 protected signing authority、release provenance、authenticated metadata、immutable artifacts、staged rollout、halt controls、rollback policy 与 compromise recovery。
Desktop release 会因 OS version、architecture、installer path、local DB state、antivirus interaction 与 runtime behavior 失败;canary cohort 可限制 blast radius 并产生真实 health evidence。
应避免。发布新 immutable artifact 与 versioned metadata,保证 review、rollback 与 incident reconstruction 可信。
Local DB、config migrations、plugins、caches、credentials、local services 与 protocol compatibility 都可能决定 rollback 是否真正安全。
使用加速但仍受控的路径:immutable source、provenance、protected signing、verification、small canary、active monitoring、halt control 与 recovery plan。
假设 signing/update credential 被盗,并证明团队能 freeze promotion、preserve evidence、restrict trust、rotate/revoke、notify users 与发布 trusted recovery release。
Feedback
匿名反馈只用于判断内容是否真正有用。