`
wxl24life
  • 浏览: 293061 次
  • 性别: 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官方文档。

分享到:
评论

相关推荐

    bash-4.3.27 for solaris

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

    fontconfig-2.13.0-4.3.el7.x86_64.zip

    `fontconfig-2.13.0-4.3.el7.x86_64.zip`这个压缩包提供了在离线环境下的解决方案。 `fontconfig`库的主要功能包括: 1. **字体搜索**:根据应用程序的需求,`fontconfig`可以遍历系统中的所有字体目录,找到合适...

    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

    zip-3.0-1.el6.x86_64_依赖_zip_

    标题中的"zip-3.0-1.el6.x86_64_依赖_zip_"指出这是一个与zip压缩软件相关的版本,具体是3.0版本,适用于x86_64架构的Linux系统(通常指的是Red Hat Enterprise Linux 6或CentOS 6)。描述中的"x86_64系统"再次确认...

    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,恩,舒服多了。。。

    Linux操作系统之安全审计功能-Audit

    给定的文件中包含三个RPM包:audit-3.0-6.se.04.ky10.aarch64.rpm、audit-devel-3.0-6.se.04.ky10.aarch64.rpm和audit-libs-3.0-6.se.04.ky10.aarch64.rpm。它们分别是Audit的主要包、开发包和库包。安装步骤如下: ...

    修复bash漏洞的4.3.30源码包

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

    redis3.0-集群部署文档

    ### Redis 3.0 集群部署详细指南 #### 一、概述 Redis 3.0 是一个重要的里程碑版本,因为它引入了官方支持的集群功能。通过集群部署,可以实现数据分片、高可用性以及横向扩展能力,极大地提高了Redis在生产环境中...

    Python库 | cryptography-3.0-cp35-cp35m-win_amd64.whl

    **Python库 | cryptography-3.0-cp35-cp35m-win_amd64.whl** 在Python编程环境中,库是扩展功能的关键组成部分,它们提供了预编写的功能,使得开发者能够快速有效地实现各种任务。`cryptography`库是Python中一个...

    破壳漏洞(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 ...

    bash教程-命令语法

    Bash支持丰富的命令集,用于执行各种任务,如文件操作、进程管理等。下面列举了一些常用的Bash命令: - **基本命令**: - `ls` 列出目录内容。 - `cd` 改变当前工作目录。 - `pwd` 显示当前工作目录。 - `mkdir...

    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...

    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 ...

    live-build_3.0_a69-1_all.deb.zip

    "live-build_3.0_a69-1_all.deb.zip" 是一个压缩包文件,它包含了一个名为 "live-build_3.0_a69-1_all.deb" 的安装包。这个安装包是针对Linux系统的,特别是与“live-build”项目相关的。Live-build是一个高度可配置...

    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...

    sonar-scanner-cli-4.3.0.2102-linux.zip

    SonarQube是一个开源平台,专注于代码质量管理,提供静态代码分析、代码复杂度评估、漏洞检测、代码异味(code smell)识别等功能,旨在提升软件的可维护性和安全性。SonarScanner CLI作为SonarQube的前端工具,可以...

    Aptus-3.0-cp39-cp39-win32.whl.zip

    标题中的"Aptus-3.0-cp39-cp39-win32.whl.zip"是一个压缩包文件,它包含了一个Python的 Wheels (WHL) 文件。Wheels是Python的二进制分发格式,用于简化软件包的安装过程。这种格式允许用户无需编译源代码就能直接...

    Python库 | jutooy-4.3.tar.gz

    "jutooy-4.3.tar.gz"是一个tarball格式的压缩文件,它可以通过在命令行中使用`tar`命令进行解压: ```bash tar -zxvf jutooy-4.3.tar.gz ``` 解压后,通常会得到一个名为`jutooy-4.3`的目录,里面包含源代码和其他...

Global site tag (gtag.js) - Google Analytics