来分析学习一下之前很火的bash漏洞。

先来个简单的测试

1
env x='() { :;}; echo vulnerable' bash -c "echo this is a test "

如果输出Vulnerable this is a test说明存在漏洞。

bash的环境变量

定义一个环境变量

1
2
3
$ var="hello"
$ echo $var
hello

bash的函数

定义一个函数

1
2
3
$ fuc(){ echo "hello"; }
$ fuc
hello

bash的漏洞

bash的变量和函数用了一模一样的机制,用env命令会看到上面定义的变量和函数

1
2
3
4
$ env
var="hello"
fuc=() { echo "hello"
}

事实上,bash判断一个环境变量是不是一个函数,就看它的值是否以”()“开始!

如果定义了这样的环境变量

1
$ export X='() { echo "inside X"; }; echo "outside X";'

当我们在当前的bash shell进程下产生一个bash的子进程时,新的子进程会读取父进程的所有export的环境变量,并复制到自己的进程空间中,很明显,上面的X变量的函数的后面还注入了一条命令:echo “outside X”

1
2
3
$ export X='() { echo "inside X"; }; echo "outside X";'
$ bash
outside X

于是就触发了bash的bug——函数体外面的代码被默认地执行了。