如何防止恶意*.js脚本在Node.js中执行
我正在使用Node.js创建web服务。在实现中,我使用了许多通过npm安装的第三方模块。如果使用的模块中存在恶意的*.js脚本,则存在安全问题。例如,恶意代码可能会删除我的所有磁盘文件,或在静默中收集机密数据 关于这一点,我有几个问题如何防止恶意*.js脚本在Node.js中执行,node.js,security,module,Node.js,Security,Module,我正在使用Node.js创建web服务。在实现中,我使用了许多通过npm安装的第三方模块。如果使用的模块中存在恶意的*.js脚本,则存在安全问题。例如,恶意代码可能会删除我的所有磁盘文件,或在静默中收集机密数据 关于这一点,我有几个问题 如何检测模块中是否存在安全问题 如何防止恶意的*.js脚本在Node.js中执行 如果您能分享构建node.js服务的经验,我将不胜感激 谢谢, Jeffrey大多数(所有?)模块的源代码都可以在Github上获得,您可以通读源代码并查找安全问题,或者雇佣安全专
尽管我倾向于使用具有数百个提交、活动维护和问题列表的流行软件包,但我还是冒了这个风险。您没有提出的一个问题是,模块可能会尝试直接连接到您的数据库本身,或您的内部网络上的其他服务。这可以通过设置模块无法轻松找到的密码来防止 1。限制磁盘访问 这个项目是在去年的NodeConf上提出的。它试图在您描述的情况下限制文件系统访问 “此模块的目标是在您加载第三方模块并且需要限制其访问时提供帮助。” 这听起来很像杰弗里在柏拉图回答中的评论中提出的建议 (如果您想进一步研究挂接操作系统调用,这可能会提供一些想法。尽管它目前的形式只是包装回调函数,但它可能会提供挂接什么以及如何挂接的灵感。下面是它的使用示例。) 2。分析敏感数据流 如果您只担心数据窃取(而不是文件系统或数据库访问),那么您可以关注以下问题:
- 您应该最关心传递敏感数据的包。想必您的web服务上的一些数据无论如何都会呈现给公众
- 大多数软件包无法访问应用程序的整个堆栈,只能访问您传递给它们的数据位。如果一个包只传递了少量敏感数据,而从未传递过其余数据,那么它可能无法对接收到的数据进行任何恶意操作。(例如,如果您将所有用户名传递给一个包进行处理,将所有地址传递给另一个包,这比将所有用户名、地址和信用卡号码传递给同一个包要小得多!)
- 识别应用程序中的敏感数据,并注意将这些数据传递到哪些模块中的哪些函数
node\u模块
内的安装文件夹中提供所有源代码。(不过,有一些软件包提供二进制文件;这些软件包自然更难验证。)
如果您确实希望自己检查代码,可以通过以下方法减少所涉及的工作量:
- 要保护您自己的应用程序,您不需要阅读项目中所有包的源代码。您只需要查看那些实际调用的函数
- 您可以通过读取代码来跟踪代码,也可以借助或使用。(当然,您应该注意分支,不同的输入可能会导致调用模块的不同部分。)
- 在调用不信任的模块时设置断点,这样您就可以逐步检查调用的代码并查看它的功能。您可能会得出结论,只使用了模块的一小部分,因此只需要验证代码
- 虽然跟踪流程应涵盖运行时对敏感数据的关注,但为了检查文件访问或数据库访问,我们还应查看所需每个模块的初始化代码,以及从中进行的所有调用(包括
s)require
package.json
中锁定每个软件包的版本号可能是明智的,这样您就不会意外地安装软件包的新版本,直到您决定需要安装
你可以利用社会因素来建立对一个方案的信心。检查作者的可敬程度。他是谁?他为谁工作?作者及其雇主是否有值得维护的声誉?同样,谁使用他的项目?如果该软件包非常流行,并且被行业巨头使用,那么很可能其他人已经审阅了该代码
您可能希望通过“监视”存储库来访问github并为您正在使用的所有顶级模块启用通知。这将通知您将来包中是否报告了任何漏洞。感谢您分享您的经验。在使用新模块或更新现有模块时,检查每个模块的源代码工作量巨大。我正在考虑重写require函数。这样我就可以拦截风险模块(如子进程、文件系统、进程、操作系统、虚拟机)的加载请求。一个想法是:你可以在一台机器上安装主应用程序,在第二台机器上安装第二个应用程序。第二个应用程序将处理所有
require
语句,因此在发生漏洞攻击的情况下,它(可能)只能影响第二台机器。第一个应用程序将与第二个应用程序进行通信,但不会直接要求任何东西(除了该社区所需的东西)