我正在使用Node.js来创建Web服务。在实现中,我使用了许多通过npm安装的第三方模块。如果消耗的模块中存在恶意* .js脚本,则存在安全问题。例如,恶意代码可能会删除我的所有磁盘文件,或者无声地收集秘密数据。
我对此有几个问题。
如果您可以分享任何构建node.js服务的经验,我将非常感激。
谢谢, 杰弗里
答案 0 :(得分:4)
您未提出的一个问题是模块可能会尝试与您的数据库本身或内部网络上的其他服务建立直接连接。这可以通过设置模块无法轻易找到的密码来防止。
<强> 1。限制磁盘访问
该项目于去年在NodeConf上发布。它试图在您描述的情况下限制文件系统访问。
https://github.com/yahoo/fs-lock
“此模块的目标是在您加载第三方模块时提供帮助,并且您需要限制其访问权限。”
这听起来很像杰弗里在柏拉图回答的评论中提出的建议。
(如果你想进一步研究挂钩操作系统调用,这个hookit project可能会提出一些想法。虽然它目前的形式只包含回调函数,但它可能提供了什么挂钩的灵感,以及如何这是an example使用它。)
<强> 2。分析敏感数据流
如果您只担心数据窃取(不是文件系统或数据库访问),那么您可以关注您的问题:
您应该最关心那些传递敏感数据的软件包。据推测,您的网络服务中的一些数据无论如何都会向公众展示!
大多数软件包都无法访问应用程序的完整堆栈,只能访问传递它们的数据。如果一个包只传递少量敏感数据,并且从未传递其余数据,那么它可能无法对收到的数据做任何恶意攻击。 (例如,如果您将所有用户名传递给一个软件包进行处理,将所有地址传递给另一个软件包,那么这个问题要比通过所有软件包时小得多。 用户名,地址和信用卡号到同一个套餐!)
识别应用中的敏感数据,并记下传递给哪些模块的功能。
第3。执行有效的代码审核
您可能不需要去Github阅读代码。绝大多数软件包在node_modules
内的安装文件夹中提供了所有源代码。 (但是有一些软件包提供二进制文件;这些软件包自然难以验证。)
如果您确实希望自己检查代码,可以采用减少相关工作量的方法:
要保护自己的应用,您无需阅读项目中所有包的整个源代码。您只需要查看实际调用的那些函数。
您可以通过阅读,或借助a text-based debugger或GUI debugger来跟踪代码。 (当然你应该注意分支,其中不同的输入可能会导致模块的不同部分被调用。)
当您调用不信任的模块时设置断点,这样您就可以单步执行调用的代码并查看它的作用。您可以得出结论,只使用了模块的一小部分,因此只需要验证该代码。
虽然跟踪流程应涵盖运行时对敏感数据的关注,检查文件访问或数据库访问,但我们还应查看所需的每个模块的初始化代码,以及从那里开始的所有电话(包括require
)。
<强> 4。其他措施
在package.json
中锁定每个软件包的版本号可能是明智的,这样在您决定需要之前不会意外安装新版本的软件包。
您可以使用社交因素来建立对包裹的信心。检查作者的尊重程度。他是谁,他为谁工作?作者和他的雇主是否有声誉?同样,谁使用他的项目?如果该软件包非常受欢迎,并被行业巨头使用,那么其他人可能已经审查过这些代码。
您可能希望通过“观察”存储库来访问github并为您正在使用的所有顶级模块启用通知。这将告知您将来是否在程序包中报告任何漏洞。
答案 1 :(得分:0)
大多数(所有?)模块都有可用于Github的源代码,您可以通读源代码并查找安全问题,或聘请安全专业人员来完成这项工作。
我只是冒险 - 尽管我倾向于使用包含数百个提交,活动维护和问题列表的流行软件包。