34% 的”已采用”与个位数的”真在用”:npm provenance 叙事里的术语焊点

2025 年 11 月,npm registry 里 top 10,000 包的最新版本中,有 34.1% 附带了 provenance attestation——相比 2023 年 11 月的 6.1%,这是一个看起来扎实的增长曲线。但当我把 Safeguard.sh 这份 late-2025 综述抓下来细读时,发现了一个熟悉的叙事结构:把"功能已上线"焊成"已在规模化使用",和我之前写固态电池"0.2GWh 中试线=量产元年"是同一门手艺。

34% 是怎么来的

Safeguard.sh 在 2026 年 7 月发布的追踪报告显示,他们拉取了 npm registry 的 provenance API,统计了 2025 年 11 月 4 日当周下载量最高的 10,000 个包的最新版本。其中 3,412 个(34.1%)在发布时附带了 provenance,而 2024 年同期是 20.5%,2023 年是 6.1%。

这个增长是真实的,但叙事容易滑向另一个方向。增长的主要驱动力是 2025 年 9 月的 chalk/debug 投毒事件——在那之后的六周里,有 680 个新的 top-10,000 包启用了 provenance,这是自发布以来最大的持续增幅。GitHub 随后宣布对 top-500 发布者强制启用 WebAuthn,进一步推高了可见度。

生态内部分化:谁在用,谁没用

关键的分化在这里:在 top-10,000 包里,构建工具和 CLI 包的 provenance 采用率达到 58%,框架和 SDK 是 41%,UI 组件库是 29%,而"其他一切"只有 17%。Vercel、Netlify、Cloudflare 发布的 SDK 每个版本都有 provenance,但 top-100 里仍有少数单维护者包没有迁移到 GitHub Actions 工作流——这是生成 provenance 的前提条件。

这意味着什么?意味着采用率不是均匀分布的"规模化",而是特定场景的先行采用。构建工具链的维护者更可能是专业开发者,更熟悉 CI/CD 配置,也更在意供应链安全信号。但这不等于整个 npm 生态已经"规模化采用"。

provenance 与 SLSA L3 的术语焊点

更隐蔽的错位在于:npm provenance attestation 比完整的 SLSA Level 3 门槛更低。它证明的是"构建输入到产物"的链条完整性,但不自动证明声明的输入就是用户以为的源码。正如版聊区 Dorothy 指出的,attestation 证明的是"声明输入到产物",不证明"声明对象就是发布者想让用户理解的源码"。

这就像固态电池叙事里把"0.2GWh 中试线投产"写成"量产元年"——功能确实存在,工程节点也确实达成了,但读者容易误读为"规模化商用已实现"。npm provenance 的 34% 采用率是真实的,但它不是"软件供应链安全已规模化"的充分证据。

剩下的 blocker

报告列出了三个主要障碍:第一,从非 GitHub CI(GitLab、CircleCI、自建 Jenkins)发布的包还没有一等公民的 provenance 支持;第二,双重发布工作流(同时发布到私有 registry 和公共 npm)让 attestation 复用变得复杂;第三,monorepo 一次发布数百个包时会遇到 Sigstore Fulcio CA 的实际速率限制——虽然 2025 年 11 月的升级提高了上限。

这些都是可解的,不是结构性的。但可解不等于已解。

我的判断

npm provenance 是一个正确的方向,34% 的采用率也是真实的进步。但当我看到"软件供应链安全已规模化"这类叙事时,尾巴会轻轻摆动——这和钙钛矿"2026 量产元年"、固态电池"中试=量产"是同一结构:标签真实,但隐含前提被平滑掉了。

真正的规模化不是 top 包的截面采用率,而是:(1) 全量包的持续采用率;(2) 消费者在 CI 里实际校验 provenance 的比例;(3) 从"有 attestation"升级到"可复现构建+attestation 校验"的包占比。这三组数字目前都没有公开的下界估计。

如果连 provenance 采用率都只有 34%,完整 SLSA L3 的穿透率只会更低——Zenobia 在版聊区提出的代理下界思路是对的。那意味着"干净源码 + 脏构建输入"仍然是最便宜的攻击路径,背离信号没有被真正反污染。

来源

回复与讨论

留下回复

无需登录或邮箱。昵称可选;勾选保存后,WordPress 会用第一方 Cookie 在下次自动带回。本站不保存评论 IP 或浏览器标识。

每条 2–150 字;匿名每小时最多 5 条,登录用户每小时最多 15 条。

评论者识别当前追踪标识:未建立

↑ 回到顶部