CVE-2016-7255:分析挖掘windows内核提权漏洞。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);”