欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2016-7255:分析挖掘Windows内核提权漏洞

来源:本站整理 作者:佚名 时间:2016-12-31 TAG: 我要投稿

Windows内核提权漏洞CVE-2016-7255已经受到了很多媒体的关注。在11月份的Patch Tuesday中,微软发布了针对此漏洞的修复程序,将其作为MS16-135公告的一部分。根据微软的说明,CVE-2016-7255主要用于执行有针对性的攻击,并且可以通过一些“野路子”来找到样本。 谷歌和微软已经证实俄罗斯黑客集团APT28使用了一个Flash漏洞(CVE-2016-7855)和这个内核提权漏洞执行了一次有针对性的攻击,谷歌也发布了一些针对此漏洞的讨论:
https://security.googleblog.com/2016/10/disclosing-vulnerabilities-to-protect.html
https://threatpost.com/microsoft-says-russian-apt-group-behind-zero-day-attacks/121722/
http://securityaffairs.co/wordpress/53242/hacking/cve-2016-7255-zero-day.html
McAfee Labs的漏洞研究团队花费了大量时间来分析此漏洞。我们将在这篇文章中,简要讨论我们的一些发现。
分析
我们首先从MS16-135的补丁开始着手分析,很快我们就注意到MS16-135在目标系统上更新了win32k.sys,于是我们下一步就开始比较(通过二进制差分手段)两个win32k.sys文件(安装补丁前后)。另外一提,我们的测试系统运行的是Windows 7,版本号为6.1.7601.23584。
看看二进制差分的结果,我们注意到以下功能被修改。

图1:在win32k.sys中被更改的函数——xxxNextWindow
经过这些初步调查后我们得出结论:CVE-2016-7255的补丁程序完全应用于修复win32k.sys中的xxxNextWindow函数。
以下截图显示了补丁中对xxxNextWindow(x, x)所做更改的更高级概括:

图2:对函数xxxNextWindow进行高级差分的结果
我们可以看到在被修复函数中增添了一些新的逻辑(用红色突出显示)。放大到第一个新插入的基本块,我们可以看到新引入的代码进行了对eax + 0x23的值的比较操作:

图3:xxxNextWindow中插入的第一个基本块
然后,我们在下一个新插入的基本块中看到了类似的逻辑。

图4:xxxNextWindow中插入的第二个基本块
谷歌已经声明了该漏洞“可以通过win32k.sys系统调用NtSetWindowLongPtr()为GWL_STYLE设置为WS_CHILD的窗口句柄上的索引GWLP_ID触发。“
事实上,NtSetWindowLongPtr()只起到了触发这个漏洞的作用,而根本原因在于xxxNextWindow。更具体地说,由NtSetWindowLongPtr()设置的不合适的参数可以触发xxxNextWindow中的“任意地址写入”场景。
现在让我们来看看未打补丁的xxxNextWindow(x, x, …)的反编译版本。

图5:未修复的xxxNextWindow的反编译版本
应用补丁后,xxxNextWindow(x, x, …)如下所示:

图6:已修复的xxxNextWindow的反编译版本
打补丁后的代码使用条件分支语句“(*(_BYTE *)(v8 + 0x23) & 0xC0) != 0x40”增强了参数验证。
在这个新语句中,变量v8(在eax中)是上一个GetNextQueueWindow调用的返回值。 (见下图)

图7:变量v8来自对GetNextQueueWindow的调用:“v8 = _GetNextQueueWindow(v7, v31, 1);”
快速查看_GetNextQueueWindow(x, x, …)的实现,它揭示了该函数实际上返回一个指向tagWND结构的指针。
下图显示了windbg中的tagWND结构:

图8:tagWND的结构
分析此代码,我们可以从中得知tagWND结构中偏移量0x78处的字段是与漏洞相关的。以下来自未修复函数的反编译代码行证实了这一点:

图9:未修复的xxxNextWindow中的问题代码
现在问题变得简单了:如果我们可以控制在v8+0x78地址处的值,就能够在内核区域中任意地址进行写入操作,并且这很可能就可以实现提权。幸运的是,一个用户态中的API(NtSetWindowLongPtr)就可用于在该位置设置任意值。
下图显示,我们传递给NtSetWindowLongPtr的值(0x41414141)被反射到了tagWND结构中,通过此漏洞可以轻松实现任意内存写入。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载