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

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

在 Node 中,我使用了一个模块 (GM),并注意到它使用 child_process 模块中的 spawn 将参数传递给 GraphicMagick 的 convert 可执行文件。

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

最佳答案

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

如果 gm 使用 child_process.exec,则注入(inject)的可能性会更大。这是因为 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 将是 execve 的第一个参数。这意味着用户不能使用管道和其他命令行技巧在 shell 中运行子命令,因为在我们的示例中/bin/ls 不知道如何处理反引号或管道或 ;。/bin/bash 将解释这些命令。如果您熟悉的话,这类似于使用参数化与基于字符串的 SQL 查询。

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

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

  • 避免使用 child_process.exec,如果命令包含根据用户输入更改的任何输入,则切勿使用它。
  • 尽可能避免让用户将选项传递给命令。使用 spawn 或 execfile 时,通常值是可以的,但通过用户控制的字符串选择选项是个坏主意。
  • 如果您必须允许用户控制的选项,请仔细查看命令的选项,确定哪些选项是安全的,然后仅将这些选项列入白名单。

关于node.js - node.js 安全/转义中的 child_process 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697639/

相关文章:

javascript - 如何在没有 session 的情况下将事件添加到谷歌日历API

node.js - 使用 Node 客户端向本地主机发出请求?

php - 生成一个 N 位随机数

php - file_get_contents() 和 Curl

.net - 已签名的 .net 程序集在加载时是否经过全面验证,以检查它们是否未被修改?

node.js - 调用 git Shortlog -sn 时, Node child_process spawn 挂起

javascript - 如何使用对象方法作为回调来修改JavaScript中的对象属性

javascript - 正则表达式查找并用 gulp/node 替换并在替换中使用查找字符串的一部分?

linux - Rust:如何生成在父级收到SIGINT/SIGTERM之后仍继续存在的子进程

javascript - Node.js - 如何防止中断的子进程继续存在?