如何防止在Node.js中执行恶意* .js脚本

我使用Node.js来创buildWeb服务。 在实现中,我消耗了许多通过npm安装的第三方模块。 如果在所使用的模块中存在恶意* .js脚本,则存在安全问题。 例如,恶意代码可能会删除我的所有磁盘文件,或者静默收集秘密数据。

我有几个关于这个问题。

  1. 如何检测模块中是否存在安全问题?
  2. 我应该怎么做才能防止在Node.js中执行恶意* .js脚本?

如果您可以分享任何经验来构buildnode.js服务,我将非常感激。

谢谢,杰弗里

你没有提出的一个问题是,一个模块可能试图直接连接到你的数据库本身,或者连接到你的内部networking上的其他服务。 这可以通过设置模块无法轻易find的密码来防止。

1.限制磁盘访问

这个项目去年在NodeConf展出。 它试图严格限制你描述的情况下的文件系统访问。

https://github.com/yahoo/fs-lock

“这个模块的目标是帮助您加载第三方模块,并且需要限制他们的访问。”

这听起来就像杰弗里在柏拉图的回答中提出的build议。

(如果你想进一步研究hook操作系统调用,这个hookit项目可能会提出一些想法,虽然目前的forms只包含了callback函数,但它可能会提供一些关于如何挂钩的灵感,以及如何实现。正在使用它。)

2.分析敏感数据的stream量

如果您只担心数据窃取(而不是文件系统或数据库访问),那么您可以关注您的担忧:

  • 您应该最关心那些正在传递敏感数据的软件包。 无论如何,你的networking服务中的一些数据可能是公开的!

  • 大多数软件包将无法访问您的应用程序的完整堆栈,只有通过它们的数据位。 如果一个软件包只传递了less量的敏感数据,并且没有传递其余的数据,那么它可能无法对收到的数据做任何恶意的事情。 (例如,如果您将所有用户名传递给一个包进行处理,并将所有地址传递给另一个包,那么与将所有用户名地址信用卡号传递给同一个包相比,这是一个小得多的问题!

  • 识别应用程序中的敏感数据,并注意传递给哪些模块的function。

3.执行有效的代码审查

你可能不需要去Github阅读代码。 绝大多数软件包在node_modules里面的install文件夹中提供了所有的源代码。 (有几个软件包提供了二进制文件,但这些软件自然难以validation。)

如果您确实想自己检查代码,可以采取以下方法减less所涉及的工作量:

  • 为了保护您自己的应用程序,您不需要阅读项目中所有软件包的完整源代码。 您只需要查看实际调用的那些函数。

  • 您可以通过阅读代码或借助基于文本的debugging器或GUIdebugging器来跟踪代码。 (当然,你应该注意分支,不同的input可能会导致模块的不同部分被调用。)

  • 当你调用一个你不信任的模块的时候设置断点,这样你就可以遍历被调用的代码,看看它做了什么。 您可能会得出结论,只有一小部分模块被使用,所以只有该代码需要validation。

  • 虽然跟踪stream程应该覆盖运行时对敏感数据的关注,为了检查文件访问或数据库访问,我们还应该查看每个需要的模块的初始化代码,以及从那里创build的所有调用(包括require )。

4.其他措施

package.jsonlocking每个软件包的版本号可能是明智的做法,这样你才不会意外地安装新版本的软件包,直到你决定需要为止。

你可以使用社会因素来build立一个包裹的信心。 检查作者的可敬性。 他是谁,他为谁工作? 作者和他的雇主是否有维护的声誉? 同样,谁使用他的项目? 如果这个软件包非常受欢迎,并被业界巨头使用,那么其他人可能已经对这些代码进行了审查。

您可能希望访问github并通过“监视”存储库为所有使用的顶级模块启用通知。 如果将来有任何漏洞报告在软件包中,将会通知您。

大多数(所有?)模块在Github上都有可用的源代码,您可以通过源代码读取并查找安全问题,或聘请安全专家来完成这项工作。

我只是冒险 – 虽然我倾向于使用数百个提交,主动维护和问题列表的stream行软件包。