从补丁到POC CVE-2015-0003

1. 简介

该漏洞是由于Windows的win32k.sys模块存在对用户层参数验证不完全,导致存在空指针解引用(Null Pointer Dereference)的问题。

实现对漏洞的有效利用,攻击者可以实现权限提升。

影响的系统包括(32bit & 64 bit):

Windows Server 2003

Windows Vista

Windows Server 2008

Windows 7

Windows 8 & Windows 8.1

Windows Server 2012

测试环境:

Win7 32bit

下面对通过补丁对比构造POC和漏洞成因做简单说明。

2. 补丁对比

2.1 初窥

使用IDA的BinDiff插件得到win32k.sys补丁前后的函数对比,部分如下:

结合微软对该漏洞的描述,可以得知与窗口处理函数有关。FindSystemTimer函数补丁前后差异较大,加上xxxDispatchMessage和FindSystemTimer之间的存在调用关系,所以有理由怀疑FindSystemTimer函数和漏洞相关。下面对这两个函数进行简单分析。

2.2 近一点

xxxDispatchMessage

利用BinDiff查看补丁前后此函数的差异,可以发现补丁后其在调用FindSystemTimer时多传递了一个参数。

FindSystemTimer

补丁前后FindSystemTimer函数变化较大。

补丁前,FindSystemTimer会遍历一个链表(_gtmrListHead),如果pTmr->flags,pMsg->lParam和pTmr->pfn通过验证,那么就会返回当前这个pTmr。否则就会返回NULL。

补丁后,FindSystemTimer需要两个参数,pMsg和pWnd。函数的功能看起来还是一样,都是遍历链表得到pTmr,但是需要验证更多的变量:pMsg->wParam和pTmr->ID,pWnd和pTmr->spwnd。

目前,我们可以知道函数FindSystemTimer的嫌疑很大,hWnd和wParam可能和漏洞有关。

3.构造POC

3.1 一条路径

xxxDispatchMessage虽然和问题函数FindSystemTimer存在调用关系,但是xxxDispatchMessage是内核函数,能否在用户层找到一条路径控制xxxDispatchMessage到达调用FindSystemTimer的流程是决定能够构造出POC的关键之一。

微软对函数采用匈牙利命名法对于分析的帮助非常大,内核函数xxxDispatchMessage可以很自然联想到用户层DispatchMessage函数。DispatchMessage函数似乎只是DispatchMessageWorker函数简单的一个过渡:

而DispatchMessageWorker函数会调用内核的NtUserDispatchMessage函数。NtUserDispatchMessage函数对参数做一些有效性检查后,就会调用xxxDispatchMessage函数。在xxxDispatchMessage函数中存在这么一段代码:

其中0x113为WM_TIMER消息,0x118为WM_SYSTIMER消息。当要处理的消息为WM_SYSTIMER时,就会顺利调用FindSystemTimer这个问题函数了。

WM_SYSTIMER为未公开的消息,还好通过Google查询可以知道其和caret blink有关。

目前为止,我们在用户层找到了一条调用路径,可以最终调用可疑函数FindSystemTimer:DispatchMessage(WM_SYSTIMER)àDispatchMessageWorkeràNtUserDispatchMessageàxxxDispatchMessageàFindSystemTimer。

3.2 一个框架

通过以上分析知道,要触发这个漏洞至少需要一个窗口并且能够产生WM_SYSTIMER消息。将一个最基本的win32窗口改一下就可以了,在消息循环之前加入如下代码:

用spy++观察这个窗口可以产生WM_SYSTIMER消息:

3.3 修改

现在得到了一个可以产生目标消息的一个窗口,消息中的hWnd和wParam是我们需要测试的两个参数,怎么让这两个参数随机化又是需要解决的问题。回头看创建caret时所产生的WM_SYSTIMER消息十分的有意思,因为我们并没有一个循环或者定时器,但是其产生的WM_SYSTIMER消息却是具有时间连续性,隔一段时间就会发出一个WM_SYSTIMER消息。所以有理由怀疑创建caret的函数中有一个定时器,并且很有可能是这个定时器发出的WM_SYSTIMER消息。

这次又是微软的匈牙利命名法帮了大忙,果然在xxxCreateCaret函数中找到了一个似乎和定时器相关的函数:

注意此时_SetSystemTimer的第二个参数为0xFFFF,这正好和上面spy++的输出中wParam相等,所以又可以怀疑一下该参数就代表wParam的值了。利用IDA的XREFS功能查看所有调用_SetSystemTimer的地方:

经过测试众多的函数,包括最开始的CreateCaret,似乎只有xxxFlashWindow函数才靠谱:不会崩溃,窗口的消息循环中也可以改变相关的值。用户层对应的是FlashWindow函数,其调用_SetSystemTimer上下文:

去掉创建caret的部分,增加FlashWindow函数,修改以前的框架为:

运行后,利用spy++查看输出,我们期望wParam的值为0xFFF8。

结果显示wParam正是0xFFF8,所以此时我们就拥有了一个可以产生目标消息,并且可以修改相关值的框架。

3.4 Crash

最后利用这个框架来对hWnd和wParam这两个值做随机化处理,在窗口的消息循环中可以添加这样的代码:

将整个代码放在虚拟机运行一段时间后,就可以得到崩溃了:

此时hWnd=0,wParam=0xFFF8(等于原来的值)。

4. 漏洞分析

根据崩溃后的调用堆栈,对此时的eax进行回溯,在函数xxxDispatchMessage内最终可以确定其是一个win32k!tagWnd结构:

所以漏洞的成因就很明显了:FindSystemTimer函数对参数的验证不完全,导致窗口句柄为0所对应的内核对象被解引用。打补丁后,FindSystemTimer函数会对这种情况进行校验改变流程使其不会进去到解引用流程中去。

5. 参考

http://blog.beyondtrust.com/fuzzing-for-ms15-010

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

从补丁到POC CVE-2015-0003(2015.3)的更多相关文章

  1. CVE-2015-0057 POC构造 & 利用分析(2015.7)

    CVE-2015-0057 POC构造 & 利用分析 主要内容: 构造POC 利用思路 0x00 初探 从这篇文章可以获知: 1.问题出在 win32k!xxxEnableWndSBArrow ...

  2. QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置

    1.下载: 所有Qt版本的下载地址: http://download.qt.io/archive/qt/ 实际使用了http://download.qt.io/archive/qt/5.7/5.7.1 ...

  3. Visual Studio 2015+InstallShield 2015

    下载Installshield http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visua ...

  4. #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲

    又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...

  5. #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲

    又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...

  6. Team Foundation Server (TFS) 2015 安装指导

    1. 概述 微软于8月6日发布了大家期待已久的TFS 2015正式版, https://www.visualstudio.com/en-us/news/tfs2015-vs.aspx ,新版本包含的大 ...

  7. Adobe CC Family 2015 Master 或 Adobe CC Family 2017 Master的安装步骤(图文详解)

    不多说,直接上干货!   你还在为安装PS烦恼吗?你还在为制作视频软件寻找烦恼吗?..... 前言 现在,已经出来了 简单了解, Adobe Acrobat的百度百科: http://baike.ba ...

  8. 挑战黑客极限:Pwn2Own 2015成史上“最难”黑客大赛

    Pwn2Own是全球最著名.奖金最丰厚的黑客大赛,由美国五角大楼入侵防护系统供应商TippingPoint赞助.近日Pwn2Own 2015公布全新的比赛规则,本届赛事难度超高.史无前例,包括VUPE ...

  9. 2015,2016 Open Source Yearbook

    https://opensource.com/yearbook/2015 The 2015 Open Source Yearbook is a community-contributed collec ...

随机推荐

  1. 分享自制的C#和VB Code互转工具

    分享自制的C#和VB Code互转工具 作为.NET程序员,往往习惯使用一种语言(据我观察,2006年后的程序员习惯用C#,之前的喜欢VB).而对于另一种语言虽然能读懂但是写起来总是比较费事.尤其面对 ...

  2. C++函数调用

    C++函数调用(1) 这篇博客名字起得可能太自大了,搞得自己像C++大牛一样,其实并非如此.C++有很多隐藏在语法之下的特性,使得用户可以在不是特别了解的情况下简单使用,这是非常好的一件事情.但是有时 ...

  3. linux 原生系统发送电子邮件 (在本地与因特网)

    有用的资料在 Linux mail 命令 http://www.cnblogs.com/JemBai/archive/2012/01/24/2329136.html 还有这里 Linux系统下mail ...

  4. 自己做个 Tag标签

    这是效果图,下面是源码,时间有限,有时间再完善 http://files.cnblogs.com/wxwall/tag.zip

  5. Java7新特性

    ① 新增了switch对字符串的支持,也就是说可以在switch之后直接使用字符串来进行判断,语法基本与Java7之前支持的语法一样. ② 对数值字面量的增强支持,首先是可以在源代码中直接使用二进制数 ...

  6. Kettle的应用——对mysql数据进行表输入与导出

    Kettle的应用——对mysql数据进行表输入与导出 1. 下载好kettle解压包 网址:http://sourceforge.net/projects/pentaho/files/Data%20 ...

  7. 【汇编语言】新手第一步——HelloWorld & A+B

    国际惯例,HelloWorld. 这个程序是masm for windows里面的样例程序.按照我自己的理解,对其加上了注释. ;完整段的Hello World程序 DATAS SEGMENT STR ...

  8. MVC源码解析 - Http Pipeline 解析(上)

    IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); 上一篇说到了创建 ...

  9. C#调用百度地图API

    1.打开链接http://developer.baidu.com/map/jshome.htm这里有很多DEMO,或者你直接百度搜索"百度地图API",第一个就是.进入后有很多方向 ...

  10. 在server2012安装tfs遇到的问题:KB2919355

    参考资料:http://blog.csdn.net/wo_984633714/article/details/52869851 安装tfs2015的时候,提示需要安装KB2919355的更新.然后我就 ...