gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:25:15 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com