CVE-2016-0143漏洞分析

0x00 背景

4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC。该漏洞影响所有版本的Windows操作系统,攻击者利用成功后可获得权限提升,微软在4月补丁日修复了该漏洞。

0x01 漏洞分析

Nils Sommer并没有说明该漏洞为何种类型的漏洞,咋看崩溃场景会认为是NULL Pointer dereference或者UAF漏洞,粗略分析后,觉得是整数溢出漏洞,但是最后还是将其定义为特殊的NULL Pointer dereference漏洞。下面对漏洞成因进行简单分析。

In xxxRealDrawMenuItem

崩溃的地方是在win32k!xxxRealDrawMenuItem函数内,在windbg中查看崩溃时的内存状态:

崩溃上下文代码的IDA截图,将其命名为过程A(最后说明时会用到):

在crash之前,eax会和[ebp+arg_8]做有符号乘法,并将结果和ebx做比较,来确定是否执行crash的指令。

此时的eax为PoC中r.bottom和r.top运算后的结果,具体操作在win32k!xxxDrawMenuBarTemp内,算法为:eax= r.bottom-r.top-1;

[ebp+arg_8]为PoC中的info.bmiHeader.biSize;

PoC 给的值会让"imul eax,[ebp+arg_8]"产生溢出,走向crash流程。这里看起来是由于整数溢出造成的漏洞,其实正常流程都会走这个流程的,这并不是漏洞成因所在。

所操作的ecx从[ebp+var_28]获取,原始值为1,[ebp+var_28]本应该为DIBObject的地址,但是在为其分配内存的函数win32k!SURFMEM::bCreateDIB中,并没有为其分配内存空间,漏洞的关键在这里

下面分析创建DIBObject失败的原因。

In SURFMEM::bCreateDIB

SURFMEM::bCreateDIB的函数调用栈:

xxxDrawMenuBarTemp

à GreCreateDIBitmapReal

àSURFMEM::bCreateDIB

在SURFMEM::bCreateDIB函数内有这样一段代码,将其命名为过程B:

此时eax等于xxxRealDrawMenuItem函数中的edi,[ebp+arg_0]为PoC中的info.bmiHeader.biSize*4,按照PoC中设定的值,两者分别为0x7fffff69和0x274。

当两者进行乘法运算后,同样发生了溢出,但由于是无符号运算,所以edx!=0。调用函数ULongLongAdd后,[ebp+AllocationSize+4]=edx=139h!=0,因此便走向了失败的流程,不会为DIBObject分配内存,也导致GreCreateDIBitmapReal函数的返回值为0。

如果未发生溢出,并且两者的乘积(+0x154)小于7FFFFFFFh, SURFMEM::bCreateDIB函数就会根据这个乘积(+0x154)为DIBObject分配一块内存。分配内存的代码在IDA中的截图:

分配成功后,会将AllocateObject的返回值作为GreCreateDIBitmapReal函数返回值,并且赋值给xxxRealDrawMenuItem 函数中的[ebp+var_28]。

0x02 补丁对比

来看看微软是怎么来补这个漏洞的,补丁后的部分xxxRealDrawMenuItem函数代码在IDA中的截图:

可以看到,补丁后,xxxRealDrawMenuItem函数在调用GreCreateDIBitmapReal函数后,对返回值做了检查:如果返回值等于0,表示创建DIBObject失败,则不会再进入到操作DIBObject的流程,也就是过程A中了。

0x03 可能的利用

目前还没有人公开自己的利用代码,下面对该漏洞存在的可能利用方式做一个说明。

crash处是一个对ecx进行循环操作的代码段,循环次数为"imul eax,[ebp+arg_8]"的乘积。正常情况下是对申请的DIBObject进行操作。

这个循环操作中,存在一个可控的写入操作指令,在IDA中的截图:

红框中的指令就是所说的写入操作指令,edx虽然经历多条指令操作后才得到,但是参与操作的都是ecx相关内存值,因为ecx也就是零页地址的内容可控,所以edx也是可控的。

那么理论情况下,在win8之前的系统中,是可以将这条指令操作转变为:

mov [HalDispatchTable+4],shellcodeAddress

之后用户层再触发一下就完成了提权。

0x04 其他

经过深入分析后,要触发漏洞,r.bottom、r.top和info.bmiHeader.biWidth满足一定的约束就行了,不一定需要和作者给出PoC的数值完全相同。r.bottom、r.top和info.bmiHeader.biWidth的值能满足下面两个条件就可以导致crash:

  1. 过程B分配DIBObject失败。
  2. 过程A走向crash流程。

过程B和过程A要满足这两个条件,具体情况如下。

过程B
1. 过程B未发生溢出,并且乘积后的值 < 0x7FFFFFFF,造成AllocateObject调用失败。

2. 过程B未发生溢出,并且乘积后的值 > 0x7FFFFFFF,不走调用AllocateObject的流程。

3. 过程B发生溢出,不走调用AllocateObject的流程。

过程A

1.未溢出。

2.溢出后的结果为负数,并且改变sf位为1(有符号数比较)。

根据上面分析给出的过程A和过程B会导致crash的情况,这里给出两种具体的组合,有兴趣的可以修改原PoC中对应的值尝试一下,都会crash的。

组合1

过程B情况1+过程A的情况1,两个地方都没有溢出,但是还是crash了,也说明了不是整数溢出漏洞。

组合2

过程B情况3+过程A情况2:

by:会飞的猫
转载请注明:http://www.cnblogs.com/flycat-2016

CVE-2016-0143 漏洞分析(2016.4)的更多相关文章

  1. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  2. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  3. SpringBoot SpEL表达式注入漏洞-分析与复现

    目录 0x00前言 0x01触发原因 0x02调试分析 0x03补丁分析 0x04参考文章 影响版本: 1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升至1.3.1或以上版本 ...

  4. struts2 s2-032漏洞分析

    0x01Brief Description 最近面试几家公司,很多都问到了s2漏洞的原理,之前调试分析过java反序列化的漏洞,觉得s2漏洞应该不会太难,今天就分析了一下,然后发现其实漏洞的原理不难, ...

  5. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  6. CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析

    漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...

  7. 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析

    PDF 版本下载:抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析 Author:知道创宇404实验室 Date:2017/03/19 一.漏洞背景 GoAhead作为世界上最 ...

  8. Vivotek 摄像头远程栈溢出漏洞分析及利用

    Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...

  9. Exchange ProxyLogon漏洞分析

    Exchange ProxyLogon漏洞分析 前言 续前文继续学习Exchange漏洞 Proxyshell 影响范围 Exchange Server 2019 < 15.02.0792.01 ...

随机推荐

  1. [修]开启MySQL远程访问权限 允许远程连接

    原文地址:http://www.cnblogs.com/XL-Liang/archive/2012/05/03/2481310.html 这个地址也许更有帮助:http://www.cppblog.c ...

  2. 为什么MD5不能解密

    MD5加密原理是散列算法,也称之为hash算法. 具体的算法很多种,我也不是很懂,写得太专业了,我们只能理解一些简单的.简单才能让人记得住. 举例说明,10除以3余数是1,4除以3的余数也是1,反过来 ...

  3. echarts 某省下钻某市地图

    因为最近工作需要,接触到了highcharts 与echarts ,对比了一下,目前公司系统用的是highcharts的图表插件,就不想再去用echarts的图标插件了,奈何highcharts地图对 ...

  4. hdu 1809 求SG函数

    A New Tetris Game(2) Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. 常用WebService一览表

    天气预报Web服务,数据来源于中国气象局 Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmx Disco     ...

  6. 应聘linux/ARM嵌入式开发岗位

    **************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...

  7. 2440裸机驱动之PWM开发

    原文http://blog.chinaunix.net/uid-14114479-id-3125685.html ARM驱动蜂鸣器的方式有两种:一种是PWM输出口直接驱动,另一种是利用IO定时翻转电平 ...

  8. ok6410 u-boot-2012.04.01移植二修改源码支持单板

    继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...

  9. 理解git分支-远程分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等. 你可以通过 git ls-remote (remote)来显式地获得远程引用的完整列表,或者通过 git remote show ( ...

  10. Mybatis原理图

    Mybatis原理图 MyBatis 是一个基于Java的持久层框架.它提供的持久层框架包括SQL Maps和Data Access Objects(DAO). MyBatis 是支持普通 SQL查询 ...