2014年9月曝出的Bash ShellShock漏洞简析
昨天,Bash曝出在调用环境变量设置命令或者接口时,可以任意执行Bash命令语句,绕过用户权限的限制。基本原理是:
$ env x='() { :;}; echo vulnerable'
如上bash脚本,本来只是定义一个环境变量x,但是其后面的内容全部都会被当作语句来执行,这也就是当以函数的形式来对环境变量来进行赋值时,会导致函数后面的命令被执行。即,env命令在执行赋值语句时未检查函数的边界,导致函数之后的内容也被执行。运行如上代码,屏幕如果显示“vulnearable”,那么系统的bash就存在该问题。目前确知的是,4.3版本之前的bash都存在该问题。该漏洞的代码为:CVE-2014-6271。
这个本身好像并没有多可怕的,因为一般能拿到shell,那么就有了整个环境的操纵权限,也不需要去用命令注入的方式来攻击了。但是存在一些场景允许远程执行Bash命令,正好又会在命令中调用环境变量设置函数。如CGI、DHCP等。
下面以CGI为例,说明这一漏洞攻击的过程。
CGI相关的解析HTTP请求的过程如下:
1、Linux WEB Server一般可以提供CGI接口,允许远程执行Bash命令;
2、对于HTTP头部,CGI脚本解析器会将其当作环境变量,调用bash的env相关函数设置到临时环境变量中;
3、HTTP协议允许发送任意客户端自定义的HTTP头部;
4、这样就产生了一个完整的可供Bash命令注入的场景,客户端故意发送构造好的带攻击命令的HTTP头部到服务端,服务端调用设置环境变量的函数,直接执行了客户端指定的头部里面的命令。并且还会将结果一并返回给客户端。
整个远程注入命令执行攻击的过程为:
在漏洞曝出的第一时间各大有提供操作系统相关服务端平台都给出了修复通知,修正方法也很简单,升级bash版本即可。
相关的通知链接:
GNU官方的补丁地址:http://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052
阿里云:http://bbs.aliyun.com/read/176977.html,http://bbs.aliyun.com/read/177039.html?page=e
RedHat:https://access.redhat.com/security/cve/CVE-2014-6271
2 条评论
单独 env x='() { :;}; echo vulnerable’ 只是设置环境变量,并没有运行echo vulnerable,
类似这个命令:env x='() { :;}; echo vulnerable’ bash -c ‘echo hello’,才会触发 echo vulnerable。
情况应该是这样的吧。
我在环境上面测试的时候,在设置时也会执行,没有看具体的bug源码,按照酷壳的解释,起子进程促发复制环境变量才会执行,现在没有环境,不好验证具体的过程。