4

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

我对此有几个问题。

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

如果您能分享构建 node.js 服务的任何经验,我将不胜感激。

谢谢,杰弗里

4

2 回答 2

4

您没有提出的一个问题是,一个模块可能会尝试直接连接到您的数据库本身或您内部网络上的其他服务。这可以通过设置模块不容易找到的密码来防止。

1.限制磁盘访问

这个项目是在去年的 NodeConf 上提出的。它试图在您描述的情况下限制文件系统访问。

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

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

这听起来很像杰弗里在柏拉图回答中的评论中提出的建议。

(如果您想进一步了解挂钩 OS 调用,这个hookit 项目可能会提出一些想法。虽然在当前形式下它只包装了回调函数,但它可能会提供关于挂钩什么以及如何挂钩的灵感。这是一个示例正在使用。)

2. 分析敏感数据流

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

  • 你应该最关心那些被传递敏感数据的包。大概您的网络服务上的一些数据无论如何都会向公众展示!

  • 大多数包将无法访问您的应用程序的完整堆栈,只能访问您传递给它们的数据位。如果一个包只传递了少量的敏感数据,而没有传递其余的数据,它可能无法对它接收到的数据做任何恶意的事情。(例如,如果您将所有用户名传递给一个包进行处理,并将所有地址传递给不同的包,这比将所有用户名地址信用卡号传递给同一个包要小得多!)

  • 识别应用程序中的敏感数据,并注意将它们传递到哪些模块中的哪些函数。

3. 执行有效的代码审查

你可能不需要去 Github 阅读代码。绝大多数软件包都在其安装文件夹中提供了所有源代码node_modules。(但是有一些包提供二进制文件;这些自然更难验证。)

如果您确实想自己检查代码,可能有一些方法可以减少所涉及的工作量:

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

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

  • 当你调用一个你不信任的模块时设置断点,这样你就可以单步调试被调用的代码,看看它做了什么。您可能会得出结论,只使用了模块的一小部分,因此只需要验证该代码。

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

四、其他措施

锁定每个软件包的版本号可能是明智之举,package.json这样在您决定需要之前不会意外安装软件包的新版本。

您可以使用社会因素来建立对包裹的信心。检查作者的体面。他是谁,他为谁工作?作者和他的雇主有维护声誉吗?同样,谁使用他的项目?如果这个包很受欢迎,并且被行业巨头使用,很可能其他人已经审查过代码。

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

于 2014-01-08T20:04:16.123 回答
0

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

我只是冒险——尽管我倾向于使用具有数百个提交、积极维护和问题列表的流行包。

于 2013-08-02T14:38:05.813 回答