当前位置:首页 > 文章列表 > 科技周边 > 业界新闻 > npm 发布时恶意软件扫描怎么适配:contentPolicy、DISCLOSURE 与延迟验收

npm 发布时恶意软件扫描怎么适配:contentPolicy、DISCLOSURE 与延迟验收

来源:17golang原创 2026-08-16 17:34:29 0浏览 收藏

之前搭建 npm 发布流水线,很多团队都默认“命令返回成功”就等于“下游马上可以安装”。这个判断从 2026 年 7 月开始不再稳妥:npm 会在新包对外可安装前做自动恶意软件扫描,包可能正常可用,也可能暂存人工复核或被拦截;即使发布接口已经返回,安装验收仍要多等一个状态确认。

要点速览
  • 普通包发布后通常会有几分钟的可用性延迟,高峰或包体较大时可能更久。
  • 双用途安全能力要在 package.json 声明 contentPolicy,并在根目录放纯文本 DISCLOSURE。
  • 双用途包必须通过可信发布、交互式双因素认证或 staged publishing 等强制 2FA 的路径发布。
  • CI 要把“发布成功”和“可安装成功”拆成两个检查点,不能用固定秒数代替状态判断。

npm 这次变化到底改了哪一个时间点

变化不在 npm publish 的基本语法,而在“版本何时可以被安装”。官方说明新版本会先进入扫描流程,根据结果走正常发布、人工复核或拦截三条路径。常见延迟约为 5 分钟,繁忙时可能达到 15 分钟以上;这只是当前行为,不是服务承诺。

因此,流水线里至少要区分下面三个结果:

检查点能说明什么不能说明什么
发布命令返回凭证和发布请求被接受新版本已经可安装
dist-tag 可查看版本标签已经登记tarball 已能被所有安装请求取到
干净环境安装下游目前可以解析并取得版本以后每次发布都不会进入复核

npm 发布扫描链路:发布命令进入扫描后分流到可安装、人工复核或拦截状态

CI 不要把发布成功当成安装成功

最小改造是把发布任务和可用性验收拆开。发布任务保存版本号与 dist-tag,验收任务在短暂退避后,从一个没有 npm 缓存的环境读取该版本。读不到时先记录为“扫描中”,不要立刻把整条发布标为失败。

npm publish --provenance
printf 'published=%s\n' "$npm_package_name@$npm_package_version"

# 在独立验收任务中执行,避免复用构建机缓存
npm view "$npm_package_name@$npm_package_version" version --registry=https://registry.npmjs.org
npm pack "$npm_package_name@$npm_package_version" --dry-run --registry=https://registry.npmjs.org

这里的关键不是多加一个命令,而是让重试有边界:例如第 1、3、7、15 分钟各检查一次,超过窗口就转人工复核。若脚本把一次“暂不可安装”当成永久失败,就会误触发重复发布;同一个版本也不应该靠改 tag 来绕过扫描。

带安全能力的包要准备 contentPolicy 和 DISCLOSURE

有些合法工具具备网络诊断、凭证处理、系统观察或自动化控制能力,自动扫描可能把它们视作双用途内容。npm 新增的声明路径是:在 package.json 放入 contentPolicy 字段,并在包根目录提供名为 DISCLOSURE 的纯文本文件。

{
  "name": "team-audit-kit",
  "version": "2.4.0",
  "contentPolicy": "dual-use"
}

DISCLOSURE 不应写成宣传文案,而要说明两件事:这项能力具体做什么,以及维护者准备在哪种合法场景中使用它。声明不会自动保证放行,平台仍可能继续扫描并由 Trust & Safety 团队逐案判断。

npm 双用途包的声明关系:contentPolicy、DISCLOSURE 与强制 2FA 发布共同进入复核链路

双用途包的发布通道和后续版本有两个硬边界

第一,发布必须走强制双因素认证的方式,例如 trusted publishing(OIDC)、带双因素认证的交互式会话,或 staged publishing。仅凭一个可绕过 2FA 的细粒度令牌直接发布,不符合这项要求。

第二,声明是持续性的。某个版本带有 contentPolicyDISCLOSURE 后,后续版本不能把它们删掉,否则发布会被拒绝。建议把这两个文件放进发布前的清单,和版本号、许可证、打包文件一起做差异检查。

  • 包内确认 package.json 的声明仍存在。
  • 确认 DISCLOSURE 在 tarball 根目录,而不是只存在于源码仓库。
  • 确认 CI 使用的发布身份真的启用了 2FA 强制策略。
  • 确认发布后等待窗口不会触发第二次相同版本发布。

把一次发布改成可复查的验收记录

每次发布至少保留包名、版本、dist-tag、发布时间、扫描等待开始时间、首次可安装时间和最终状态。若进入人工复核,还要保存平台通知和申诉材料,不要只在日志里留下一行“publish ok”。

这项更新对普通包的直接动作很小:给安装检查增加退避和超时;对双用途包则要把元数据、说明文件和强制 2FA 一并纳入版本流程。这样遇到延迟时,团队知道是在等待扫描,遇到拦截时,也能拿出一份完整而克制的用途说明。

常见问题

发布命令成功后可以立刻让用户安装吗?

不建议。先经过短暂等待,再从干净环境验证版本确实可取得;发布成功只代表请求被接受。

双用途声明能保证包一定上线吗?

不能。contentPolicy 和 DISCLOSURE 只提供必要的上下文,平台仍会自动扫描,必要时还会人工复核。

后续版本可以删除 DISCLOSURE 吗?

不可以。已经声明过双用途内容的包,后续版本应持续保留字段和根目录文件。

安全更新也要等待三天吗?

不要把 npm 发布扫描和 Dependabot 的版本更新冷却混为一谈。后者的默认冷却针对版本更新 PR,安全更新仍按安全规则及时打开。

最后的检查清单

把 npm 发布任务改成“两段式”:先记录发布请求,再等待并验证可安装状态。普通包关注延迟、重试和重复发布;双用途包再增加 contentPolicy、DISCLOSURE、强制 2FA 与持续声明四项检查。验收记录完整后,npm 的扫描流程就从一次不可控的等待,变成了发布系统里可观察、可回溯的一步。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Linux 服务超过 RuntimeMaxSec 怎么验收:运行时限、日志结果与重启边界Linux 服务超过 RuntimeMaxSec 怎么验收:运行时限、日志结果与重启边界
上一篇
Linux 服务超过 RuntimeMaxSec 怎么验收:运行时限、日志结果与重启边界
npm 新增发布前恶意软件扫描:CI 如何处理 contentPolicy、DISCLOSURE 与 2FA
下一篇
npm 新增发布前恶意软件扫描:CI 如何处理 contentPolicy、DISCLOSURE 与 2FA
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    4901次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    4476次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    4420次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    4657次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    4615次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码