$ cat zh/blog/secure-macos-updates

可验证的 macOS 更新是怎样工作的

更新提示只有在版本来源、下载资产和签名验证都能被检查时才值得信任。

桌面更新链路同时承担便利与信任。应用不能只看到一个更高版本号就执行下载;它需要固定的公开源、明确的版本资产和独立签名验证。

一个公开更新源

Agent Island 的 macOS 更新由 Sparkle appcast 描述,版本、发布时间、下载地址和签名都可从公开 Release 资产核对。官网按钮与应用内检查应最终指向同一发布事实。

签名是安装边界

Sparkle 在安装前验证 EdDSA 签名。HTTPS 保护传输过程,签名则用于确认下载资产与发布者生成的内容一致。两者解决不同问题,不能互相替代。

一次发布如何到达安装

  1. 构建并测试应用。
  2. 生成发布资产与更新签名。
  3. 在 GitHub Release 发布 DMG 和 appcast。
  4. 应用发现更高版本并展示真实版本号。
  5. 下载后验签,通过才进入安装。

手动检查仍然重要

后台检查应该安静,但用户主动检查时必须得到明确结果。若 feed 无法访问,应显示检查失败和 Releases 入口,不能把网络错误写成“已经是最新版”。空更新源的故障模式见为什么旧安装会被留在原地

版本号不是信任凭据

攻击者可以给任意文件改名并写上正确版本号,因此比较版本只决定“是否需要更新”,不能决定“能否安装”。真正的安装边界是对下载内容的签名验证,失败时必须停止并给出明确错误。

发布后验收

每次发布都应从一个已安装旧版本执行完整检查:发现新版本、展示说明、下载、验签、安装、重启并确认当前版本。还要测试 feed 为空、签名不匹配和下载中断,确保这些情况不会被显示成成功。