什么,如果有的话,bash中存在注射漏洞,我该如何防范它们?

时间:2011-01-03 19:15:56

标签: linux security bash procmail

我有一个bash脚本,我通过procmail开始。 Procmail将电子邮件中的主题来自字段作为参数传递给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

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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中的这一行,因为我不知道引用规则。这可能是攻击者可以注入代码的一个点,因此您需要查看手册中的规则并对其进行测试以确定。您应该测试的一些字符是$"\,换行符。

答案 2 :(得分:0)

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

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

这样,就没有命令执行,也没有必要担心未使用的输入被用作程序的参数。