这一漏洞的描述如下:
Shellshock (CVE-2014-6271, CVE-2014-6277, CVE-2014-6278, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187) is a vulnerability in GNU‘s bash shell that gives attackers access to run remote commands on a vulnerable system. If your system has not updated bash in since Tue Sep 30 2014: 1:32PM EST (See patch history), you‘re most definitely vulnerable and have been since first boot. This security vulnerability affects versions 1.14 (released in 1994) to the most recent version 4.3 according to NVD.
这里还有一个测试这一漏洞的脚本:
至于原理,看了半天,大概有点明白了:
漏洞的关键在于bash会把定义的各种函数放到env里面去,大致的格式如下:
$ function foo { echo bar; } $ export -f foo $ env | grep -A1 foo foo=() { echo bar }
这样的话,是不是可以放一个假的函数进去呢?答案是,可以!而且,这里的关键在于,这里它执行函数的时候,不是检测完整的“{}”对,而是简单的执行“{”之后的所有bash代码!!!也包括你放进去的代码。。。所以,为什么不放点东西进去让它执行?
那么话说回来了,是不是不执行bash不就完事了?理论上是这样的。但是,事情总有意外,比如,你在编程的时候使用了systcall之类的,去运行了shell指令。你的程序继承了父程序的环境变量,你调用的systemcall空间继承了你程序的环境变量,然后,它就可能顺带的执行被注入到环境变量中的代码。
下面是360提供的简单测试sh的一个方案:
1. 服务器端有一个shell脚本,内容随意,可以如下:
#!/bin/bash echo "Content-type: text/html" echo "" echo ‘<html>‘ echo ‘<head>‘ echo ‘<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">‘ echo ‘<title>PoC</title>‘ echo ‘</head>‘ echo ‘<body>‘ echo ‘<pre>‘ /usr/bin/env echo ‘</pre>‘ echo ‘</body>‘ echo ‘</html>‘ exit 0
2. 此时,用户端是可以用浏览器,curl,wget,nc...等等工具去连接你的服务器,并触发这个脚本的。比如,curl,可以看到:
3. 注意,这是正常情况!!!正常情况就是该显示嘛,就显示嘛!!!但是,WEB服务器都是把http的header都先放到ENV里面去的。所以,有了下面的访问(nc和wget类似,给传header就行):
4.咳咳。。然后你就欢快的看到了下面的情形。