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. 由IEnumerable和IEnumerator的延伸

    相信大家在学习c#的时候,经常会看到IEnumerable.IEnumerator这样的接口或返回类型,在写代码时经常会对数组或List集合进行遍历.那IEnumerable和IEnumerator是 ...

  2. Jira 6.0.5环境搭建

    敏捷开发-Jira 6.0.5环境搭建[1] 我的环境 Win7 64位,MSSql2008 R2,已经安装tomcat了 拓展环境 jira  6.0.5     百度网盘下载           ...

  3. WCFRESTFul服务搭建及实现增删改查

    WCFRESTFul服务搭建及实现增删改查 RESTful Wcf是一种基于Http协议的服务架构风格,  RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力 ...

  4. 下载centos6.4

    下载centos6.4 (原创)LAMP教程3-下载centos6.4 今天我要给大家讲的是安装CentOS-6.4-x86_64,是的没有错,就是64位的,因为我的机子是4G的内存,安装64位的ce ...

  5. RILC

    RILC RIL层的作用大体上就是将上层的命令转换成相应的AT指令,控制modem工作.生产modem的厂家有很多:Qualcomm, STE, Infineon... 不同的厂家都有各自的特点,当然 ...

  6. sql编程 && 存储过程

    sql  结构化查询语言      是一种编程语言   用于管理数据库的编程语言      元素:     数据      数据类型         变量的数据类型  就是字段的数据类型      变 ...

  7. OpenRisc-34-ORPSoC跑eCos实验

    引言 ORPSoC目前支持好几种OS,除了前面一直介绍的linux,还支持eCos,eCos是RTOS,如果你的系统对时间的要求比较高,那eCos会是一个不错的选择. 本小节就简单介绍一下,在ORPS ...

  8. 真的了解js生成随机数吗

    由js生成一切随机数的基础都是Math.random()这个方法,这个方法比较特别,生成的随机数落在的区间是[0,1),进行一次操作的话,js只能生成一个类似于[n,m)这样,左闭右开的区间.所以当有 ...

  9. mac 切换php版本

    通过brew安装的php可以通过brew link和brew unlink来切换不同版本 #brew list #brew unlink php56 #brew link php55

  10. Git安装使用

    转载:http://www.open-open.com/lib/view/open1414396787325.html 1.window版地址 https://git-for-windows.gith ...