【发布时间】:2016-12-24 19:28:12
【问题描述】:
鉴于 NodeJS 的流行程度,以及 NPM 的工作原理......确保您永远不会安装不安全/恶意软件包的最佳方法是什么?对我来说,这似乎是架构中的一个巨大漏洞,仅依赖于用户评论、StackOverflow 等网站上的 cmets、个人博客等。我做了一些搜索,我似乎只能找到一个“计划”用于在收到用户违反行为准则的投诉后删除违规用户。
NPM 行为准则 https://www.npmjs.com/policies/conduct
这是发布包的方式... https://docs.npmjs.com/getting-started/publishing-npm-packages
所以我开始思考某人可以做什么样的坏事......也许创建一个非常有用的包,然后使用木马程序依赖于一个做坏事的包。即使我(作为安装程序)查看了我个人安装的软件包,我也可能永远不会发现有问题的代码,尤其是如果代码被混淆了,就像这样:
eval((new Buffer('cmVxdWlyZSgiZnMiKS5jcmVhdGVSZWFkU3RyZWFtKCIvL2V0Yy9wYXNzd2QiKS5waXBlKHByb2Nlc3Muc3Rkb3V0KTs=', 'base64').toString()));
此代码只是将 /etc/passwd 文件回显到您的标准输出。而已。通过运行这个来证明它:
new Buffer('cmVxdWlyZSgiZnMiKS5jcmVhdGVSZWFkU3RyZWFtKCIvL2V0Yy9wYXNzd2QiKS5waXBlKHByb2Nlc3Muc3Rkb3V0KTs=', 'base64').toString()
那些抓到 eval 的人,对你有好处!不过,我可以在没有 eval 的情况下以多种不同的方式包装这个,所以这只是一个例子。
那么,说了这么多……社区正在做些什么来应对这种可能性?在哪里可以找到有关如何确保系统安全的更多信息?
【问题讨论】:
-
整个社区的安全都是建立在信仰之上的,希望一切都会好起来的。
-
我认为所有软件包都必须是开源的这一事实使得人们很难潜入恶意软件。即使查看没有 eval 的代码,没有明显目的的文本也令人震惊。您还可以查看包的依赖数量,还可以检查它的 repo 是否发布了问题,有多少人阅读了足以提交拉取请求的代码,等等。
-
开源基于信任和验证
-
我们现在(暂时)所能做的就是检查我们的每个依赖项及其依赖项以及它们的...(递归措辞,很多吗?)并查看它们的内部工作原理。
-
除非有人要制作一个不需要外部依赖项的模块,并且会检查我们所有的依赖项是否有“流行词”或真正应该给出的晦涩(或恶意)的东西再看一遍。
标签: javascript node.js security npm