Bash是什么?
Bourne Again Shell(简称BASH)是在GNU/Linux上最流行的SHELL实现,于1980年诞生,经过了几十年的进化从一个简单的终端命令行解释器演变成了和GNU系统深度整合的多功能接口。根据维基百科的描述:Bash,Unix shell的一种。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWare与Android上也有移植。
漏洞英文名称: Bash Shellshock
中文命名:破壳(X-CERT)
威胁响应等级:A级
漏洞相关CVE编号: CVE-2014-6271
漏洞发现者: Stéphane Chazelas(法国)
漏洞公布时间: 2014年9月25日
漏洞影响对象: bash 1.14至bash 4.3的Linux/Unix系统
这个漏洞有多大的危害呢?
在发布Bash漏洞一小时之内,就有机器被这个漏洞攻击的报告。截至2014年9月25日,攻击者正在利用基于计算机攻击的基于计算机的僵尸网络进行分布式拒绝服务(DDoS)攻击和漏洞扫描。卡巴斯基实验室报告称,受到攻击的机器被称为“谢谢 - 罗布”,正在对三个目标进行DDoS攻击,他们没有指出。2014年9月26日,一家名为“wopbot”的与Shellshock有关的僵尸网络被报道,该蠕虫被用于针对Akamai Technologies的DDoS攻击并扫描美国国防部。9月26日,安全公司Incapsula在过去24小时内对1800多个来自400个唯一IP地址的网络域进行了17400次攻击;55%的攻击来自中国和美国。截至9月30日,网站性能公司CloudFlare表示,它每天跟踪大约150万次与该bug有关的攻击和探测。10月6日,广泛报道,雅虎服务器在涉及Shellshock问题的攻击中受到了损害。然而,第二天却被否认是特别允许这些袭击的是壳牌之击。
这么说大概有一个直观的概念,但是它是怎么实现的呢?
漏洞复现:
这个漏洞出在Linux的bash上面
在bash中,接受环境变量定义函数,在正常情况下使用没有任何问题:
在这个例子中,我export了环境变量“HELLO”,它定义的函数是在屏幕上打印“Hello World”
我们可以看到,在启用bash之前,环境变量“HELLO”是无效的,而在启动bash后,输入“HELLO”就会执行它的函数,在屏幕上打印“Hello World”,这个时候一切正常,没有任何问题。
但是在bash中,它还接受一种特殊的定义方式:
在这里,我用的不是export,而是env
env代表“先设置后面这个环境变量,然后再执行这个程序”
而bash指定了-c代表启动bash的同时执行“HELLO”
目前看来依然一切正常,没有任何问题
然而在一种特殊的情况下,这种定义方式没有被正确的使用,导致出现了一个致命的漏洞:
依然是使用env,但是我在{}之间没有使用规范的方式去定义这个环境变量x
这导致对于这个环境变量x的定义没有按照规范停在“}”,而是执行了后面所有的指令
也就是说,如果你的计算机存在这种漏洞,而攻击者又掌握了这个技巧,他/她可以在后面插入任何他/她希望执行的任何命令,而你的计算机会忠实的执行它们,也就导致出现了大量的“僵尸网络资源”,这使得Ddos攻击变得简单易行(甚至不需要伪装,你们本来就是不同的计算机发出的请求)
那么,这个漏洞是如何被远程利用的呢?
其实这涉及到另外一个技术——CGI
CGI是在Web技术刚开始兴起的时候出现的,它被用于创建动态网页,出发点是美好的,但是问题就出在它会将一次HTTP请求转化成一个shell调用
也就是说,在Web浏览器与用户的交互过程中,如果使用的是CGI脚本,那么就会产生大量的shell命令和调用。
这就是问题所在
对于利用Bash脚本处理用户请求的网站,攻击者可以精心伪造数据,通过网络传到一台服务器上,直接或间接触发一个bash脚本,这样就可以远程执行恶意代码。
其他一些客户端也会受到影响——比如Linux的DHCP客户端——它大量运用Bash脚本来使修改生效,这也使黑客能通过在DHCP数据包中加入恶意数据来达到攻击的目的。
鉴于Bash是大多数Linux系统(以及OSX)上默认的shell,这个漏洞就意味着,把有害数据编入环境变量,传到服务器端,触发服务器运行Bash脚本,就完成了攻击。
任何已知程序,只要满足以下两个条件就可以被用来通过bash漏洞导致任意命令执行:
1、程序在某一时刻使用bash作为脚本解释器处理环境变量赋值;
2、环境变量赋值字符串的提交取决于用户输入。
目前,可能被利用的系统包括:
运行CGI脚本(通过mod_cgi 和 mod_cgid)的Apache HTTP 服务器;
某些DHCP客户端;
使用Bash的各种网络服务;
使用 ForceCommand 功能的 OpenSSH 服务器;
使用CGI作为网络接口的基于Linux的路由器;
使用Bash的各种嵌入式设备。