Bash 3处本地拒绝服务0day分析

最近在我们在bash fuzz项目中,发现诸多问题,现在公布其中的3处本地拒绝服务漏洞的分析。该漏洞已经报告给bash的发开者,并且在最新版中得到了修复。

漏洞描述:

bash-4.3libreadlinesavestring.c ( 或者bash-1.14.7libreadlinereadline.c )文件的savestring()函数存在NULL指针引用,对该漏洞的成功利用会造成本地拒绝服务。

危害等级:

低危-本地拒绝服务

漏洞验证:

bash-c ‘>$(ss=111 declare -i ss )’

或者

bash -c ‘vvv=1 unset vvv >>`declare -i vvv`’

修复方法:

---savestring.c   2010-08-0314:08:04.000000000 +0800

+++ savestring.c.new     2014-12-03 19:38:11.459000532 +0800

@@ -35,7 +35,7 @@

{

char *ret;

-  ret = (char *)xmalloc(strlen (s) + 1);

+  ret = (char *)xmalloc (NULL == s ? 1 : strlen (s) + 1);

strcpy (ret, s);

return ret;

}

详细分析

对该漏洞的理解分为三部分,如下:

1.神奇的NULL指针

根据调试信息,我们在declare_internal()中找到最终传入NULL指针的代码,如图1。

在NULL传输之前,我们需要构造诸多变量的值,如var,offset等。我们暂时把注意力放在NULL指针的传递上。NULL指针分别流经 bind_variable()函数(图2),bind_tempenv_variable()函数(图3),最后到savestring()由于 strlen(NULL)引发崩溃(图4)。在bind_tempenv_variable()函数(图3)中,我们注意到在进入 savestring()之前,在temporary_env中查询了是否存在name变量(对应poc中的变量ss),代码如下:

var = temporary_env ? hash_lookup (name, temporary_env) :(SHELL_VAR *)NULL;

结果是找到了相关的值。于是在进入savestring()之后,作者显然未加验证,bash不出意料地发生崩溃。

现在我们已经了解是NULL导致程序崩溃,回想整个过程,我们猜想作者传入NULL的逻辑是有更大漏洞,下文将证明,这一推断是正确的。

图1

图2

图3

图4

2.为什么传NULL指针

现在让我们来寻找作者传入NULL的逻辑,在declare_internal()(见图1)中我们看到关键变量有两个,第一个是

if (offset)

offset的取值代码见图5,取决于assignment(),见图6,可以看出,类似”ss=111”这种形式,offset即为0。

接着我们看第二个关键变量,

var = mkglobal ? find_global_variable (name) : find_variable (name);

if (var == 0)

mkglobal的值一般为0,name值对应poc中的ss,为什么find_variable(“ss”)值会为空呢?我们知道在第一步分析中,在崩溃之前,bind_tempenv_variable()使用了如下查询的代码,并且返回非空。

var = temporary_env ? hash_lookup (name, temporary_env) :(SHELL_VAR *)NULL;

为什么之前找不到的ss变量,之后就找到了呢?

带着这个疑问,让我们看find_variable()函数(见图7)。可以看到,我们需要使find_variable_internal()返回0;如图8,我们发现find_variable_internal()的返回值可以由两种方式得到,分别是

var = hash_lookup (name, temporary_env);

var = var_lookup (name, vc);

即可以查询两张不同的表产生结果,分别是temporary_env和vc表!还记得bind_tempenv_variable()只能查询 temporary_env吗?因此,显而易见的,poc代码之所以能造成崩溃,是因为前后查询不通的变量表,完整走出一条崩溃之路。

现在让我们看看这一条“崩溃之路“是如何实现的。

更进一步地查看find_variable()(图7)和find_variable_internal()(图8)代码,我们发现这里的逻辑存在微妙的错误,可以注意到find_variable_internal()的第二个参数的产生式为:

expanding_redir == 0 && (assigning_in_environment|| executing_builtin)

而选择查询哪张表的的关键参数search_tempenv的赋值式为:

search_tempenv = force_tempenv || (expanding_redir == 0&& subshell_environment);

可以注意到两个产生式都包含expanding_redir。如果expanding_redir == 1,其实就走人错误的查询表的方式!见图9,事实确实是expanding_redir的值为1。现在,我们确认bash作者在处理重定向的变量表查询逻 辑时存在错误!但是,故事仍未结束。

图5

图6

图7

图8

图9

3.后续彩蛋

现在我们已经可以控制bash的运行逻辑,那我们继续深挖相关漏洞。我们暂时发现两处。

第一处:与本文原理相同但是攻击路径不同

bash-4.3/builtins/setattr.def

var = bind_variable (name, (char*)NULL, 0);

第二处:与本文原理相同但是攻击点不同

bash-4.3/builtins/declare.def

staticint declare_internal (list, local_var)

var = mkglobal ?bind_global_variable (name, (char *)NULL, 0) : bind_variable (name, (char*)NULL, 0);

/bash-4.3/variables.c文件中的

char *make_variable_value (var, value, flags)函数

else if (*value)会导致读0

时间: 2024-10-16 08:51:13

Bash 3处本地拒绝服务0day分析的相关文章

WindowsXP SP3 AFD.sys 本地拒绝服务漏洞的挖掘过程

标 题: WindowsXP SP3 AFD.sys 本地拒绝服务漏洞的挖掘过程 时 间: 2013-03-17,15:22:33 这是本人第一次做漏洞挖掘,2月的时候开始研究漏洞挖掘技术,2月24号那天在进行Fuzz测试的时候偶然的发现了一个afd.sys未处理的异常,然后就对这个异常如获至宝的分析起来了,因为在上班,所以都是利用周末时间来进行,前前后后到加起来差不多5天时间.现在这个漏洞的原因以及低层次的利用已经全部完成,所以拿出来跟大家分享一下,虽然挖到现在只挖出了本地拒绝服务的用处,在如

安卓拒绝服务漏洞分析及漏洞检测

"超级拒绝服务漏洞"是一个安卓通用型拒绝服务漏洞,恶意攻击者可能利用此漏洞让手机中的任意应用崩溃无法正常工作,几乎影响目前市面上所有的安卓APP应用. 漏洞分析: 0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,恶意应用可以通过传

Activity组件暴露导致本地拒绝服务

这几天团队打算一起学习Android App漏洞挖掘方面的知识,于是乎拿了一个app当测试例子,争取在上面找到漏洞.在学习过程中发现Android四大组件的安全性还是占有较大的比重,另外比较关心的是数据的安全性.数据泄漏.明文存储等和数据相关都是比较重要的.但是今天找到的一个漏洞是关于Activity组件的,本地拒绝服务漏洞. 同时学习了drozer的使用方法,利用drozer帮忙找漏洞. 下面总结一些常用的drozer命令: run app.package.info -f xxx xxx是包名

如何在本地配置php分析工具xhprof

测试环境: linuxMint + nginx1.4.6+mysql5.5+php5.5 什么是xhprof? XHProf是一个分层PHP性能分析工具.它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况.一个函数的开销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序. 一,如何安装? 1,下载最新的xhprof包 官网地址:https://pecl.php.net/package/xhpr

Android文件上传-本地+服务器一条龙分析

本地: 先看下项目结构 MainActivity.java package com.huxq.uploadexample; import java.io.File; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Environment; import

本地缓冲区溢出分析

在黑客圈子中,基于内存攻击技术的攻击手段在随着时代的变化而不断发展着,内存攻击是指通过利用软件的安全漏洞,构造恶意的输入,从而使正常程序造成拒绝服务或者是远程获得控制权,内存攻击技术中最先登上历史舞台的就是缓冲区溢出漏洞,时至今日能够被广泛利用的 60% 以上的高危漏洞(CVE)都属于缓冲区溢出,而在各大CTF比赛中缓冲区溢出漏洞的重视程度始终居高不下,接下来我将总结缓冲区溢出的相关知识点并带领小白学会挖掘简单的漏洞. 缓冲区溢出: 缓冲区溢出(Buffer Overflow),分为栈溢出与堆溢

Android APP通用型拒绝服务、漏洞分析报告

点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞(目前腾讯金刚审计系统已经可检测此类漏洞),移动安全团队发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧. 0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,

Cognos 助力业务用户自由分析本地个人数据

说到企业数据分析人员日常打交道最多的数据处理工具,Excel(国内也有很多用户使用WPS)无疑会排在第一的位置.Excel相比于专业的BI报表平台虽无法实现高级的数据分析功能(透视表功能相对来说还是比较复杂),但满足日常的数据统计和图形加上易于传播的特点,使得企业的分析用户都习惯于使用Excel这类的工具来处理一些非海量数据的本地展现和分析工作.很多企业虽然上线了BI平台,仍然有很多用户习惯将大量的报表数据导出为Excel文件(或CSV等文本格式)后进行本地的二次分析和调整. 那么问题来了,这些

谢烟客---------Linux之Bash基础特性变量(3)

变量 程序 = 指令(只读) + 数据(数据存储的位置变量.列表.数组) 指令可通过位置变量调用,向脚本传递的数据 变量名 可引用的"命名的内存空间":取了名字的内存空间,用名字即可调用事先划分的内存空间 变量类型 变量内部存储的数据的类型 变量类型的作用 限定了存储空间 限定了存储格式 限定了参与的运算 变量的类型 字符型 数值型 整型 浮点型 变量的类型 强类型 定义变量时,必须指定变量的类型,参与的运算必须符合要求 调用未申明的变量,会报错 弱类型 定义变量时,不用指定变量的类型