在Node中,我使用了一个模块(GM)并发现它使用spawn
模块中的child_process
将参数传递给GraphicMagick' s {{ 1}}可执行文件
我将用户提交的信息传递给GM。是否存在安全问题,用户可以使用管道(或其他命令行欺骗)进行某种注入攻击?或convert
是否可以防范?如果没有,在这种情况下是否存在转义用户提交值的最佳做法?
答案 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运行系统命令的通用集合指南: