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

我对此有两个问题。

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

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

    谢谢,
    杰弗里

    最佳答案

    您没有引起关注的一个问题是,模块可能会尝试直接连接到数据库本身或内部网络上的其他服务。可以通过设置模块无法轻易找到的密码来防止这种情况。

    1.限制磁盘访问

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

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

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

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

    (如果您想进一步研究 Hook OS调用,此hookit project可能会提出一些想法。尽管在当前形式下,它仅包装了回调函数,但它可能提供了 Hook 内容以及如何 Hook 的灵感。这是an example的意思。用过的。)

    2.分析敏感数据的流

    如果您仅担心数据窃取(而不是文件系统或数据库访问),则可以着重解决以下问题:

  • 您应该最关心正在传递敏感数据的那些软件包。大概您的Web服务上的某些数据还是会公开显示!
  • 大多数软件包将无法访问应用程序的整个堆栈,只有它们传递的数据位才可以访问。如果仅向软件包传递少量敏感数据,而从未传递其余数据,则该软件包可能无法对收到的数据进行任何恶意处理。 (例如,如果将所有用户名传递给一个程序包进行处理,而将所有地址传递给不同的程序包,则比将所有用户名,地址和信用卡号传递给同一程序包要小得多!)
  • 标识应用程序中的敏感数据,并记下将它们传递到哪些功能的模块。

  • 3.执行有效的代码审查

    您可能不需要去Github来阅读代码。绝大多数软件包在node_modules的install文件夹中提供了所有源代码。 (但是,有一些提供二进制文件的软件包;这些软件包自然很难验证。)

    如果您确实想亲自检查代码,则可以使用一些方法来减少所涉及的工作量:
  • 要保护您自己的应用程序,您无需阅读项目中所有软件包的整个源代码。您只需要查看那些实际调用的功能。
  • 您可以通过阅读代码或在a text-based debuggerGUI debugger的帮助下跟踪代码。 (当然,您应该注意分支,其中不同的输入可能导致调用模块的不同部分。)
  • 在调用不信任的模块时设置断点,因此您可以单步执行所调用的代码并查看其作用。您也许可以得出结论,仅使用了模块的一小部分,因此仅需要验证代码。
  • 虽然跟踪流程应涵盖运行时有关敏感数据的问题,但要检查文件访问或数据库访问,我们还应查看所需的每个模块的初始化代码,以及进行的所有调用(包括require)从那里。

  • 4.其他措施

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

    您可以使用社会因素来建立对包装的信心。检查作者的受人尊敬。他是谁,他为谁工作?提交人及其雇主是否享有声誉?同样,谁在使用他的项目?如果该软件包非常流行,并且已被行业巨头使用,则其他人可能已经在审查该代码。

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

    10-08 19:38