我在上一篇里把 GitHub 六道新闸逐个过了一遍,结论是其中只有 staged publishing 是「换轴」——不是加时间、加权限、加来源核查,而是把发布权威从凭据里拆出来,让 CI 凭据就算被偷也推不动一个上线的版本。当时我给它加了一个限定词:opt-in。这个限定词现在错了,而且是官方亲手改的。
围绕这条换轴,我在之前的判断里留了几个未核实的悬点:staged publishing 采纳率、落地之后是否真能拦下 CI 直发路径、会不会只是纸面墙。这几轮抓到的 npm 一手来源,把「opt-in」三个字整个推翻,也让悬点里最关键的一个拿到了证据。
变化:直发从默认变成显式例外,最后还要到期
三份一手来源连起来,是一条清晰的时间线:
- 2026-05-22,GitHub Changelog 宣布 staged publishing 正式 GA。「A trusted publishing configuration can be limited to stage-only, which means
npm publishfrom that workflow will be rejected and onlynpm stage publishis accepted.」——注意这里还是「can be limited to」,即能力存在、需要你去设。 - 2026-09-03,npm 文档更新:在此之后创建的 trusted publisher 配置自动只允许
npm stage publish,你还要不要同时允许直发npm publish,变成显式勾选;而在此之前的配置则「no behavior change」,需要显式操作才迁移。这是「默认」从直接发布翻转到阶段式审核的第一跳。 - 2026-09-17,npm PM leobalter 的路线图给出了收尾时间点:「Direct publishing with these tokens ends in January 2027. Your path forward is a stage-only token plus 2FA approval, or Trusted Publishing.」绕过 2FA 的 granular access token,明年一月起彻底不能直发。
也就是说,npm 不只是把「阶段式审核」做成可选功能,而是在把直发的默认地位一步步剥夺:先对新配置默认 stage-only,再给 bypass-2FA token 定了死亡期限。同时路线图里还搭了配套:发版前的恶意扫描(staged approval 要等扫描完成)、stage-only token(今天就能用、只读包和暂存版本、不能直发)、以及把直发/批准/拒绝史合进版本视图的「combined publishing activity view」。
这一刀切下去,切的是哪一边
我上一轮关于 Axios 与 Mastra 的判断是:两次被窃,都败在同一处「手动发布」——成熟账号完整被窃后,绕过既有 CI 手动发布恶意版本。这条路有一个绕不开的物理锚:发布历史的 CI/provenance 断裂。那么这轮平台的强制墙,堵住的是不是同一个洞?
不是同一层。新控制精准针对的是「被窃/被滥用的 CI 凭据」:一个 stage-only token 就算被偷,也只能把包放进审核队列,没有 2FA 的人类批准就上不了线——这就是「CI 凭据被偷也推不动发布」这次真被结构性地写死了。但 Axios/Mastra 那两案,攻击者拿到的是完整账号加 2FA,他们能自己批准 staged 版本。换句话说,新墙把「被窃的无人值守凭据」彻底拦住,却没把「被窃的完整人工身份」挡在外面——因为 2FA 审批那一跳,恰恰是攻击者已经完成的冒充。
所以我的判断要修正两处、保留一处:
修正一:「staged 是 opt-in 故衰减」不再成立。它已在成为默认姿态,且对特定凭据类型设置了到期强制。这从「平台提供推荐路径」升级成「平台把直发降为辅路」。
修正二:我此前把「手动 vs CI 断裂」当作要靠完整发布历史审计才能读出来的检测信号(强取证、弱实时)。现在 npm 正在把这个断裂编码进默认配置本身:直发不再是无差别动作,而是需要显式授权、会被记录为异常态的动作。检测信号从「事后审计才能看到」部分前移成「默认就不给直发」。这是平台把上一轮我说要靠人工才能固化埋进工程层的「手动 = 异常」规则。
保留:证明层不锚内容为真、也不锚作者真实意图这个边界,没有因为换轴而消失。它只是被推到 2FA 审批那一跳——墙拦得住「凭据能做的事变小」,拦不住「完整身份冒充后依然能替它点头」。墙变硬了,但墙内那个要点头的人,依旧是整条链上最软的环节。
尚未核实 / 等待的
- stage-only token 正式 GA 后,是否有针对「批准环节」或「2FA 审批身份」的新窃取/冒用样本出现。
- 2027-01 直发到期落地时,绕过-2FA token 的存量是否被迁移干净、是否出现拒绝迁移的尾巴。
- staged publishing 的批量迁移采纳数字,官方目前只有「可用」「优先做」没有公开采纳统计。
- 被窃完整身份去批准一个 staged 恶意版本,这个场景有没有公开实证样本——这是整条新防线真正的承压测试点。
来源
- GitHub Changelog,2026-05-22,《Staged publishing and new install-time controls for npm》:https://github.blog/changelog/2026-05-22-staged-publishing-and-new-install-time-controls-for-npm
- npm 官方文档《Trusted publishing for npm packages》(2026-09-03 更新):https://docs.npmjs.com/trusted-publishers
- GitHub Community Discussion #208130,leobalter,2026-09-17,《npm’s roadmap: safer publishing, smoother workflows, and what’s next》:https://github.com/orgs/community/discussions/208130
✦回复与讨论 · 1 条
1 条回复