`
wxl24life
  • 浏览: 290660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转:Bash 3.0-4.3命令执行漏洞分析

阅读更多

注:本文转自http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-analysis/

版权所有&原作者:知道创宇lu4nx

 

- - - - - - 

 

该漏洞相关报道:

 

http://www.freebuf.com/news/44805.html

http://www.csoonline.com/article/2687265/application-security/remote-exploit-in-bash-cve-2014-6271.html

测试

在Bash Shell下执行以下代码:

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

如果输出:

vulnerable

this is a test

表示存在漏洞。打了补丁会输出以下错误:

bash: 警告: x: ignoring function definition attempt

bash: `x' 函数定义导入错误

this is a test

 

原理分析

 

Shell里可以定义变量,POC中定义了一个命名为x的变量,内容是一个字符串:

() { :;}; echo vulnerable

而根据漏洞信息得知,这个漏洞产生于Shell在处理函数定义时,执行了函数体之后的命令。但这里x的值是个字符串,它是怎么转变成函数的呢。

 

实际这个和Bash实现有关,在Bash中定义一个函数,格式为:

function function_name() {

body;

}

当Bash在初始化环境变量时,语法解析器发现小括号和大括号的时候,就认为它是一个函数定义:

[lu4nx@lx-pc ~]$ say_hello='() { echo hello world; }'

[lu4nx@lx-pc ~]$ export say_hello

[lu4nx@lx-pc ~]$ bash -c 'say_hello'

hello world

上面代码在新的Bash进程中,say_hello成了新环境中的一个函数,它的演变过程如下:

 

1、新的bash在初始时,扫描到环境变量say_hello出现小括号和大括号,认定它是一个函数定义

 

2、bash把say_hello作为函数名,其值作为函数体

 

typeset命令可以列出当前环境中所有变量和函数定义,我们用typeset看看这个字符串怎么变成函数的。继续上面定义的say_hello函数:

[lu4nx@lx-pc ~]$ bash -c 'typeset' | fgrep -A 10 say_hello

say_hello ()

{

echo hello world

}

这里新启动了个Bash进程,然后执行了typeset,typeset会返回当前环境(新的环境)中所有定义,这里清楚看到say_hello被变成函数了。

 

漏洞产生原因

而这个漏洞在于,Bash把函数体解析完了之后,去执行了函数定义后面的语句,为啥会这样呢。

 

通过结合补丁,我对Bash的源码简单分析了下,Bash初始化时调用了builtins/evalstring.c里的parse_and_execute函数。是的,就等于Bash初始化环境时调用了类似其他高级语言中的eval函数,它负责解析字符串输入并执行。

 

继续看parse_and_execute的源码,关键点在这里:

218 else if (command = global_command)

219 {

220 struct fd_bitmap *bitmap;

它判断命令是否是一个定义成全局的,新的bash进程启动后,say_hello不仅被解析成函数了,还变成全局的了:

[lu4nx@lx-pc data]$ bash -c 'typeset -f'

say_hello ()

{

echo hello world

}

declare -fx say_hello

declare命令是Bash内置的,用来限定变量的属性,-f表示say_hello是一个函数,-x参数表示say_hello被export成一个环境变量,所以这句话的意思是让say_hello成了全局有效的函数。

 

其实Bash本身其实是想在启动时初始环境变量以及定义一些函数,而初始的方式就是去把 变量名=值 这样的赋值语句用eval去执行一次,如果出现了函数定义,就把它转变成函数,除此之外就不想让它干其他的了,可偏偏它在扫描到函数定义时,把它转变成函数的过程中不小心执行了后面的命令,这其实不是eval的错,这是做语法解析时没考虑严格,所以补丁加了这么一句话来判断函数体合法性:

 

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

补充

另外,很多人疑惑POC里{ :; }这句中的冒号和分号,分号作为结束符,而冒号的意思是什么也不做,类似Python里的pass,具体看Bash官方文档。

分享到:
评论

相关推荐

    linux bash远程执行代码漏洞的补丁

    redhat bash漏洞补丁包含文件:bash-4.1.2-15.el6_5.2.i686.rpmbash-4.1.2-...bash-3.0-27.el4.i386.rpm bash-3.0-27.el4.x86_64.rpm bash-3.2-33.el5_11.4.i386.rpm bash-3.2-33.el5_11.4.x86_64.rpm bash补丁命令.txt

    bash-4.3.27 for solaris

    bash 远程命令执行漏洞 1. 【漏洞编号】CVE-2014-6271, 2. 【漏洞简介】该漏洞源于你调用的bash shell之前创建的特殊的环境变量,这些变量可以包含代码,同时会被bash执行。 黑客可以远程执行命令,窃取服务器上的...

    bash-3.0-27.el4.i386.rpm

    rpm -Uvh bash-3.0-27.0.1.el4.i386.rpm [root@eis ~]# env x='() { :;}; echo vulnerable' bash -c "echo this is a test" this is a test (已修复成功) [root@localhost ~]# env x='() { :;}; echo ...

    bash-3.0-1.aix5.1.ppc.rpm

    AIX默认使用的Ksh,没有自动补全功能。这对于像我这样用惯了Linux的Bash的人,简直受不了。赶紧换回bash,恩,舒服多了。。。

    rehl4.X,5.X,6.X bash升级包 针对漏洞CEV-2014-6271

    bash-3.0-27.el4.i386.rpm bash-3.0-27.el4.x86_64.rpm bash-3.2-33.el5_11.4.i386.rpm bash-3.2-33.el5_11.4.x86_64.rpm bash-4.1.2-15.el6_5.2.i686.rpm bash-4.1.2-15.el6_5.2.x86_64.rpm CVE-2014-6271测试命令....

    bash-completion-2.1-8.el7.noarch (1).rpm

    离线安装包,测试可用

    破壳漏洞(shellshock)红帽4 X86(32位)补丁 29日更新

    bash-3.0-27.0.3.el4.i386.rpm bash-debuginfo-3.0-27.el4.4.i386.rpm ------------------------------------------- 验证命令: env x='() { :;}; echo vulnerable' bash -c "echo this is a test"若出现this is a ...

    shellshock补丁

    bash-3.0-27.0.3.el4.i386.rpm bash-debuginfo-3.0-27.el4.4.i386.rpm ------------------------------------------- 验证命令: env x='() { :;}; echo vulnerable' bash -c "echo this is a test"若出现this is a ...

    Bash补丁.rpm redhat v5.0&6.0

    RedHat5 X86:bash-3.2-33.el5_11.4.i386.rpm RedHat5 X86_64:bash-3.2-33.el5_11.4.x86_64.rpm bash-debuginfo-3.2-33.el5_11.4.x86_64.rpm RedHat6 X86:bash-4.1.2-15.el6_5.2.i686.rpm RedHat6 X86_64:bash-4.1.2...

    bash补丁包.zip

    bash-3.0-27.0.3.el4.i386.rpm bash-debuginfo-3.0-27.el4.4.i386.rpm 2、rhel 4.x 64位 bash-3.0-27.el4.x86_64.rpm bash-debuginfo-3.0-27.el4.4.x86_64.rpm 3、centos5.x_32 bash-3.2-33.el5.1.i386.rpm bash-3.2...

    Mendel Cooper:Advanced Bash-Scripting Guide——An In-Depth Explora

    Mendel Cooper:Advanced Bash-Scripting Guide——An In-Depth Exploration of the Art of Shell Scripting@2012 (文档版本 6.6)

    bash漏洞 v4/v5/v6补丁包

    bash-3.0-27.0.3.el4.i386.rpm bash-debuginfo-3.0-27.el4.4.i386.rpm 2、rhel 4.x 64位 bash-3.0-27.el4.x86_64.rpm bash-debuginfo-3.0-27.el4.4.x86_64.rpm 3、centos5.x_32 bash-3.2-33.el5.1.i386.rpm bash-3.2...

    bash-3.0-27.4.ppc.rpm

    此patch包是bladecenter刀片服务器ppc平台的redhat enterprise AS4.4及4.8版本bash破壳漏洞的rpm,已经经过测试,需要的可以下载看看,但是一定要注意哦,升级失败的话,赶紧卸载啊~

    bash3.0 bash3.2 under aix 5.1 5.2

    bash-3.0-1.aix5.1.ppc.rpm bash-3.2-1.aix5.2.ppc.rpm rpm.rte 其中rpm.rte 为aix下支持rpm的程序包 大家也可以到这里去下载 http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/download.html

    python-django-bash-completion-1.8.14-1.el7.noarch.rpm

    官方离线安装包,亲测可用

    修复bash漏洞的4.3.30源码包

    鉴于目前绝大部分服务器因为没有注册的yum或者因不通外网等问题导致无法使用yum update -y bash 命令进行漏洞修复,如采用RPM包升级修复漏洞又存在各服务器系统有的是32位有的是64位或者bash的版本不一样导致需要...

    破壳漏洞(ShellShock)红帽最新补丁(29日上午更新)

    RedHat6 X86_64:bash-4.1.2-15.el6_5.2.x86_64.rpm bash-debuginfo-4.1.2-15.el6_5.2.x86_64.rpm bash-doc-4.1.2-15.el6_5.2.x86_64.rpm ----------------------------------------------------------- 验证命令: ...

    破壳漏洞(shellshock)RHEL 4(32位)补丁

    [root@localhost ~]# rpm -Uvh --force bash-3.0-27.0.2.el4.i386.rpm warning: bash-3.0-27.0.2.el4.i386.rpm: V3 DSA signature: NOKEY, key ID b38a8516 Preparing... ########################################...

    修复bash漏洞的bash-4.4.tar.gz源码包

    linux 服务器GNU Bash小于版本4.3有操作系统命令注入漏洞,需要对bash升级,下载解压 #tar zxvf bash-4.4.tar.gz #cd bash-4.4 #./configure (如果centos7编译失败,请先安装#yum install gcc) #make #make ...

    bash-completion-2.1-6.el7.noarch.rpm

    在centos6或rhel6 操作系统安装bash-completion-2.1-6.el7.noarch.rpm后,重启即生效

Global site tag (gtag.js) - Google Analytics