child_process在node.js安全/转义中生成

时间:2014-05-16 14:19:48

标签: node.js security spawn child-process code-injection

在Node中,我使用了一个模块(GM)并发现它使用spawn模块中的child_process将参数传递给GraphicMagick' s {{ 1}}可执行文件

我将用户提交的信息传递给GM​​。是否存在安全问题,用户可以使用管道(或其他命令行欺骗)进行某种注入攻击?或convert是否可以防范?如果没有,在这种情况下是否存在转义用户提交值的最佳做法?

1 个答案:

答案 0 :(得分:10)

我们最近发布了一篇关于避免node.js中的命令注入漏洞的博客文章。它解释了一下spawn如何阻止这种情况。

如果gm正在使用child_process.exec,那么注射的可能性会更大。这是因为child_process.exec在子shell下而不是直接执行命令,让shell元字符像反引号,$(),;,&&,||恶意使用等。

对于可能需要用户输入的简单ls -l,生成的系统调用与.exec()类似。

  

[pid 25170] execve(“/ bin / sh”,[“/ bin / sh”,“ - c”,“ls -l user input”],   [/ * 16 vars * /]

由于gm使用spawn,因此生成的系统调用看起来像这样。

  

[pid 25565] execve(“/ bin / ls”,[“/ bin / ls”,“ - l”,“。”],[/ * 16 vars * /]

因为gm将是第一个执行的论据。这意味着用户无法使用管道和其他命令行技巧在shell中运行子命令,因为在我们的示例中/ bin / ls不知道如何处理反引号或管道或;这是/ bin / bash将要解释这些命令。如果你熟悉它,它类似于使用参数化和基于字符串的SQL查询。

然而,这有一个警告:使用spawn并不总是一件安全的事情。用户提供的参数可能仍然可能有不好的结果,可能不是命令注入,而是其他东西。检查gm的行为以及您在用户提供的输入中传递的参数,并考虑用户如何能够滥用该参数。

因此,这是从node.js运行系统命令的通用集合指南:

  • 避免使用child_process.exec,如果命令包含任何基于用户输入而更改的输入,则永远不要使用它。
  • 尽量避免让用户将选项传递给命令。通常,使用spawn或execfile时值是可以的,但通过用户控制的字符串选择选项是个坏主意。
  • 如果您必须允许用户控制的选项,请广泛查看该命令的选项,确定哪些选项是安全的,并将这些选项列入白名单。