CVE-2016-0143 漏洞分析(2016.4)
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:
- 过程B分配DIBObject失败。
- 过程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)的更多相关文章
- 漏洞分析:CVE 2021-3156
漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...
- 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或以上版本 ...
- struts2 s2-032漏洞分析
0x01Brief Description 最近面试几家公司,很多都问到了s2漏洞的原理,之前调试分析过java反序列化的漏洞,觉得s2漏洞应该不会太难,今天就分析了一下,然后发现其实漏洞的原理不难, ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...
- 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析
PDF 版本下载:抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析 Author:知道创宇404实验室 Date:2017/03/19 一.漏洞背景 GoAhead作为世界上最 ...
- Vivotek 摄像头远程栈溢出漏洞分析及利用
Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...
- Exchange ProxyLogon漏洞分析
Exchange ProxyLogon漏洞分析 前言 续前文继续学习Exchange漏洞 Proxyshell 影响范围 Exchange Server 2019 < 15.02.0792.01 ...
随机推荐
- 由IEnumerable和IEnumerator的延伸
相信大家在学习c#的时候,经常会看到IEnumerable.IEnumerator这样的接口或返回类型,在写代码时经常会对数组或List集合进行遍历.那IEnumerable和IEnumerator是 ...
- Jira 6.0.5环境搭建
敏捷开发-Jira 6.0.5环境搭建[1] 我的环境 Win7 64位,MSSql2008 R2,已经安装tomcat了 拓展环境 jira 6.0.5 百度网盘下载 ...
- WCFRESTFul服务搭建及实现增删改查
WCFRESTFul服务搭建及实现增删改查 RESTful Wcf是一种基于Http协议的服务架构风格, RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力 ...
- 下载centos6.4
下载centos6.4 (原创)LAMP教程3-下载centos6.4 今天我要给大家讲的是安装CentOS-6.4-x86_64,是的没有错,就是64位的,因为我的机子是4G的内存,安装64位的ce ...
- RILC
RILC RIL层的作用大体上就是将上层的命令转换成相应的AT指令,控制modem工作.生产modem的厂家有很多:Qualcomm, STE, Infineon... 不同的厂家都有各自的特点,当然 ...
- sql编程 && 存储过程
sql 结构化查询语言 是一种编程语言 用于管理数据库的编程语言 元素: 数据 数据类型 变量的数据类型 就是字段的数据类型 变 ...
- OpenRisc-34-ORPSoC跑eCos实验
引言 ORPSoC目前支持好几种OS,除了前面一直介绍的linux,还支持eCos,eCos是RTOS,如果你的系统对时间的要求比较高,那eCos会是一个不错的选择. 本小节就简单介绍一下,在ORPS ...
- 真的了解js生成随机数吗
由js生成一切随机数的基础都是Math.random()这个方法,这个方法比较特别,生成的随机数落在的区间是[0,1),进行一次操作的话,js只能生成一个类似于[n,m)这样,左闭右开的区间.所以当有 ...
- mac 切换php版本
通过brew安装的php可以通过brew link和brew unlink来切换不同版本 #brew list #brew unlink php56 #brew link php55
- Git安装使用
转载:http://www.open-open.com/lib/view/open1414396787325.html 1.window版地址 https://git-for-windows.gith ...