【问题标题】:What, if any, injection vulnerabilities are there in bash and how can I protect against them?bash 中存在哪些注入漏洞(如果有),我该如何防范它们?
【发布时间】:2011-06-03 00:25:04
【问题描述】:

我有一个通过 procmail 启动的 bash 脚本。 Procmail 将电子邮件中的 subjectfrom 字段作为参数传递给 bash 脚本。由于这些值没有以任何方式进行清理,我试图弄清楚 bash 中是否存在任何人可以利用的注入漏洞,如果是的话,我可以做些什么来防止这些漏洞。下面是一些示例代码来说明发生了什么:

#!/bin/bash
/usr/sbin/sendmail -t <<EOF
From: "myhost Administrator" <admin@myhost.example.com>
To: john_doe@gmail.com
Subject: An email subject

You've received a new email.
It has a subject of "$2"
It was sent from "$1".
EOF

这个 bash 脚本将由 procmail 使用 .procmailrc 脚本调用,如下所示:

:0
* ^From:\s*\/.*
{
 FROM = "$MATCH"
}

:0
* ^Subject:\s*\/.*
{
 SUBJECT = "$MATCH"
}

:0 c:
* ^To:.*@example.com
| /home/john_doe/examplescript.bash "$FROM" "$SUBJECT"

我想知道注入漏洞的两个方面是脚本的实例化:

/home/john_doe/examplescript.bash "$FROM" "$SUBJECT"

以及脚本中变量的使用。

/usr/sbin/sendmail -t <<EOF
From: "myhost Administrator" <admin@myhost.example.com>
To: john_doe@gmail.com
Subject: An email subject

You've received a new email.
It has a subject of "$2"
It was sent from "$1".
EOF

如果你好奇,here is the actual use case that brought this question to my mind

【问题讨论】:

    标签: linux security bash procmail


    【解决方案1】:

    为避免注入问题,您还可以通过脚本将所有消息通过管道传输到您关心的地址,该脚本从标准输入读取消息并本机解析出您感兴趣的标头。

    然后,您可以使用以您选择的脚本语言提供的库,将 SMTP 用于本地运行的邮件服务器。

    这样,没有命令执行,也无需担心未经处理的输入被用作程序的参数。

    【讨论】:

    • 这听起来像是一个很好的整体解决方案,可以解决所有可能的漏洞。这是更多的工作,但我认为你是对的,它将避免注射问题。谢谢!
    【解决方案2】:

    我不是安全专家,但任何未经处理的用户输入中都存在注入漏洞——尤其是当您将原始输入发送到可能具有特权访问权限的系统命令时。在执行此操作之前,请务必验证您的输入。

    在将它们发送到您的邮件系统之前,请检查 $1$2 以确保它们仅包含可打印字符并且长度合理,例如少于 1000 个字符。

    这并不难做到,而且它可以防止你被一些未知的漏洞攻击。

    我喜欢 Perl 的其中一个原因是 污点模式,除非你先清理数据,否则它会阻止你做这样的事情。

    【讨论】:

    • 好主意,将字符串剥离为可打印字符并设置最大长度。我可以在脚本中强制执行,但是在执行脚本时我不确定我是否能够清理 procmail 中的字符串。我会调查的。
    • @gene_wood 你既可以限制变量,也可以通过参数扩展将它们从本地剥离。例如:${1::10} 会将第一个输入参数的长度限制为 10 个字符。要删除所有不可打印的内容,您可以使用${1//[^[:print:]]/}。所以把它们放在一起:oneLen=${1::10};oneClean=${oneLen//[^[:print:]]/}。男人tr,如果您想要完整的字符类列表,可以使用,例如[:alnum:][:digit:] 等。
    【解决方案3】:

    shell 脚本本身非常安全。邮件最易受攻击的部分是标头,您不允许邮件发件人更改其中的任何内容。

    我在脚本中看到的唯一方法是有人可以在一行中传递一个点,这会提前结束邮件。并且可能会有这样使用uuencode嵌入附件的情况:

    Subject: subject
    From: sender@example.com
    To: receiver@example.com
    
    text line 1
    text line 2
    
    begin 644 file-containing-abc
    $86)C"G]_
    `
    end
    

    我担心.procmailrc 中的行,因为我不知道引用规则。这可能是攻击者可以注入代码的地方,因此您需要查看手册中的规则并对其进行测试以确定。您应该测试的一些字符是$"\、换行符。

    【讨论】:

    • 罗兰,好主意。我将对常见字符进行一些测试,这些字符可能会绕过引用并用我发现的内容返回此处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2023-01-26
    • 2017-03-10
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多