点评:谢谢你,Iceboy
发现了这个问题并提供转储
漏洞供应商和产品:微软Windows 7 RC 7100090421
有一种脆弱的
组件:Win32k.sys中时间戳:49ee8dc8
一个漏洞
函数存在:ntusergetdc / ntusergetdcex
漏洞描述:Win32k.sys中是Windows GDI的
驱动程序,其中包含大量复杂的图形
界面处理,由于大量的代。
谢谢你,Iceboy发现了这个问题并提供转储
漏洞供应商和产品:微软Windows 7 RC 7100090421
有一种脆弱的组件:Win32k.sys中时间戳:49ee8dc8
一个漏洞函数存在:ntusergetdc / ntusergetdcex
漏洞描述:Win32k.sys中是Windows的GDI驱动程序,里面包含了很多复杂的图形界面处理,因为大量的代码
修改win3.1,所以它已经成为一种常见的Windows漏洞发生。
这个漏洞主要是由于共同的关键锁定在其ntusergetdc / ntusergetdcex函数不
正确的使用(也许不只是这两个函数)在Windows 7中,以便在任何
权限GDI任何程序可以触发进行DoS攻击的内核
蓝屏。
脆弱性分析:
在Windows Vista中,这两个
功能进入之前,他们会打电话给userenterusercirtsec进入临界区,同时
设置gpticurrent到当前
线程的win32thread。
对userenterusercritsec实施如下:
pwin32thread userenterusercritsec()
{
pwin32thread pwin32thread;
pwin32thread = exenterpriorityregionandacquireresourceexclusive(gpresuser);
gpticurrent = pwin32thread;
gbvalidatehandleforil = 1;
返回pwin32thread;
}
exenterpriorityregionandacquireresourceshared是部分出口资源共享锁功能提供Win32K。此功能将锁gpresuser资源整合在一起,并返回当前线程的win32thread,那是kegetcurrentthread -> win32thread。
同时,核函数exenterpriorityregionandacquireresourceexclusive相似。
(XP)后调用keentercriticalregion,与exacquireresourceexclusivelite gpresuser锁,然后用psgetcurrentthread -> psgetthreadwin32thread获取当前线程win32kthread,并存储到gpticurrent。
在Windows 7中,两个功能进入之前,打电话给userentersharedcrit进入共享临界区
userentrysharedcirt的实现是非常简单的
pwin32thread entersharedcrit()
{
返回exenterpriorityregionandacquireresourceshared(gpresuser);
}
可以看到,gpticurrent不在这里设置。事实上,ntusergetdc / ntusergetdcex将
保存这个功能寄存器使用存储在currentwin32thread数据。
从临界临界共享临界,毫无疑问,这样的修改将提高ntusergetdc / ntusergetdcex效率和降低锁竞争的可能性,但这是
错误的纠正。
因为在共享临界,没有修改的gpticurrent,很可能遇到gpticurrent非法状态,如遇到一个线程,不让psconverttoguithread,造成gpticurrent是空的。
win32k中内部有大量的例程(通常从ZZZ,XXX),他们都认为gpticurrent之前调用本身的有效状态。这包括xxxdestorywindow
的蓝屏的一个例子是:ntusergetdc ->区域-> getdcex -> spbcheckdce -> -> -> freespb spbcheckrect2 spbcheckrect
当打电话给FreeSpb,一个SPB对象发布在这里
然后就要
hmassigmentunlock freespb -> -> -> -> hmunlockobject hmunlockobjectinternal hmdestroyunlockedobject,表中的函数以最后的电话,因为这是GetWindowDc,所以叫xxxdestroywindow,xxxdestroywindow第一句代码没有
检查参考gpticurrent指针数据本质上直接导致蓝屏
解决方案:
等待微软更新官方补丁。
微软可能的更新手段:
牺牲效率与关键锁取代ntusergetdc等人的错误共享锁,或
删除在ntusergetdc功能和其他功能,不是指gpticurrent所有功能全部gpticurrent参考。