项目中 npm 依赖关系的社区公告
正如大多数人可能已经知道的那样,最近在项目中使用 npm 模块时发现了一个潜在的危险安全漏洞。总的来说,jQuery 基金会仍然认为这是一种安全且非常强大的做法,我们绝不建议您不再在 JavaScript 项目中使用 npm 进行包管理。我们想建议我们的 jQuery 插件开发者和基金会中许多在 npm 上分发包的项目的使用者在安装包及其依赖项时谨慎行事。
快速回顾
与其重新编写故事,不如直接查看 npm 博客上的完整回顾和总结。
问题所在
接下来发生的事情是导致我们发布此帖子的原因。Azer Koçulu 发布了几个 npm 包,其中一个就是 left-pad 包,这是一个简单的代码片段,许多其他包都依赖于它。在该包被取消发布后,许多流行项目开始出现构建失败,因为缺少该包。这本身就令人担忧,因为任何人都可以取消发布您依赖的包,或者取消发布您依赖项的依赖项的依赖项,从而给您或您的团队带来真正的麻烦。在 left-pad 被取消发布后不久,npm 团队决定将其重新发布,并由一位新所有者修复互联网上许多因缺少该包导致的构建失败。但更令人担忧的是,一旦一个包被取消发布,任何人都可以获取您依赖树中的那些包名称,并将新的、可能带有恶意代码的代码推送到您的项目中。通常情况下,这不会太糟糕,因为您的包可能依赖于已取消发布的版本,并且不会拉取新发布的版本。但是,许多人在安装依赖项时使用 npm i --save <package-name>
或 npm i --save-dev <package-name>
命令,这些命令默认情况下会安装当时发布的最新版本,并以 ^
开头,例如 ^1.0.0
,这会告诉 npm 在下次更新依赖项时安装任何通过次要版本更新的版本。这意味着如果您重新安装或更新项目,并且有人将恶意代码推送到修补程序 (1.0.1) 或次要 (1.1.0) 版本(以我们的示例为例),它将自动安装到您的项目中。
建议
我们的主要建议是小心谨慎。了解您要安装什么,以及您依赖的包以及它们的依赖项在树中安装了什么。您绝对应该立即查看您的项目,看看您依赖的任何模块是否已被取消发布,以及是否有任何模块在 此列表 中,并且最近发布了您可能要避免的版本,直到您验证它是否安全。虽然我们还没有直接与他们交谈,但我们确信 npm, inc. 的团队正在努力解决这些问题,但在那之前,请保持警惕,确保您的项目和插件安全。我们一直相信,JavaScript 已经并且将继续成为开发从个人博客到企业级应用程序的各种东西的最强选项之一。对于任何技术,我们都会遇到一些挫折,但只要我们从中吸取教训,并在前进的道路上保持这些知识,JavaScript 将会取得成功。
NPM 应该简单地为每个包要求作用域(命名空间)。您不应该能够执行以下操作
npm install somepackage
您应该被要求使用命名空间
npm install @someone/somepackage
这将解决所有命名冲突问题,以及安全问题,因为有人必须真正接管某人的作用域/命名空间/帐户才能将恶意代码推送到其中。
或者,我们可以直接切换到 github,在那里命名空间已经是结构化的。我已经在我的基于 jspm 的构建中覆盖了所有 npm 依赖项。
IMO,NPM 不应该只是根据专利(实际上应该是商标)声明将项目移交给任何随机律师。
如果 NPM 没有这样做,Azer 不会感到生气,并决定取消发布所有内容,因为他不再信任 NPM 作为带有信用的重新分发渠道,也不会导致之后的麻烦。
NPM 允许某人根据 C&D 信件接管项目,而无需帐户持有人的同意,这确实令人害怕。这意味着任何有律师帮助的人都可以接管随机项目并在其中植入恶意代码。
这是一个更大的问题。