注:本文转自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 远程命令执行漏洞 1. 【漏洞编号】CVE-2014-6271, 2. 【漏洞简介】该漏洞源于你调用的bash shell之前创建的特殊的环境变量,这些变量可以包含代码,同时会被bash执行。 黑客可以远程执行命令,窃取服务器上的...
`fontconfig-2.13.0-4.3.el7.x86_64.zip`这个压缩包提供了在离线环境下的解决方案。 `fontconfig`库的主要功能包括: 1. **字体搜索**:根据应用程序的需求,`fontconfig`可以遍历系统中的所有字体目录,找到合适...
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版本,适用于x86_64架构的Linux系统(通常指的是Red Hat Enterprise Linux 6或CentOS 6)。描述中的"x86_64系统"再次确认...
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 ...
给定的文件中包含三个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的主要包、开发包和库包。安装步骤如下: ...
AIX默认使用的Ksh,没有自动补全功能。这对于像我这样用惯了Linux的Bash的人,简直受不了。赶紧换回bash,恩,舒服多了。。。
鉴于目前绝大部分服务器因为没有注册的yum或者因不通外网等问题导致无法使用yum update -y bash 命令进行漏洞修复,如采用RPM包升级修复漏洞又存在各服务器系统有的是32位有的是64位或者bash的版本不一样导致需要...
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测试命令....
### Redis 3.0 集群部署详细指南 #### 一、概述 Redis 3.0 是一个重要的里程碑版本,因为它引入了官方支持的集群功能。通过集群部署,可以实现数据分片、高可用性以及横向扩展能力,极大地提高了Redis在生产环境中...
**Python库 | cryptography-3.0-cp35-cp35m-win_amd64.whl** 在Python编程环境中,库是扩展功能的关键组成部分,它们提供了预编写的功能,使得开发者能够快速有效地实现各种任务。`cryptography`库是Python中一个...
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命令: - **基本命令**: - `ls` 列出目录内容。 - `cd` 改变当前工作目录。 - `pwd` 显示当前工作目录。 - `mkdir...
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.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" 的安装包。这个安装包是针对Linux系统的,特别是与“live-build”项目相关的。Live-build是一个高度可配置...
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...
SonarQube是一个开源平台,专注于代码质量管理,提供静态代码分析、代码复杂度评估、漏洞检测、代码异味(code smell)识别等功能,旨在提升软件的可维护性和安全性。SonarScanner CLI作为SonarQube的前端工具,可以...
标题中的"Aptus-3.0-cp39-cp39-win32.whl.zip"是一个压缩包文件,它包含了一个Python的 Wheels (WHL) 文件。Wheels是Python的二进制分发格式,用于简化软件包的安装过程。这种格式允许用户无需编译源代码就能直接...
"jutooy-4.3.tar.gz"是一个tarball格式的压缩文件,它可以通过在命令行中使用`tar`命令进行解压: ```bash tar -zxvf jutooy-4.3.tar.gz ``` 解压后,通常会得到一个名为`jutooy-4.3`的目录,里面包含源代码和其他...