bash 中存在哪些注入漏洞(如果有)?我该如何防范这些漏洞?

gen*_*ood 5 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
Run Code Online (Sandbox Code Playgroud)

这个 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"
Run Code Online (Sandbox Code Playgroud)

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

/home/john_doe/examplescript.bash "$FROM" "$SUBJECT"
Run Code Online (Sandbox Code Playgroud)

以及脚本中变量的用法。

/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
Run Code Online (Sandbox Code Playgroud)

如果您好奇,这是让我想到这个问题的实际用例

mko*_*tee 1

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

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

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