Microsoft Windows GreStretchBltInternal()函数本地拒绝服务漏洞
发布日期:2010-08-17
更新日期:2010-08-18
受影响系统:Microsoft Windows 7
描述:
BUGTRAQ ID:
42496
Microsoft Windows是微软发布的非常流行的操作系统。
bitblt(位块传输)用于将屏幕的一个矩形区域拷贝到另一个区域,通常执行某种光栅操作(rop)。在Windows上,bitblt是通过BitBlt() GDI32 API执行的。BitBlt()由原始系统服务NtGdiBitBlt()提供支持。
在Windows 7上,通过对包含有CAPTUREBLT的rop执行检查来保护win32k!GreStretchBltInternal中的以下代码:
.text:BF981F07 mov ecx, [ebp+dcoSrc] ; ecx is a pointer to src DCOBJ
.text:BF981F0D test dword ptr [ecx+18h], 4000h ; probably checking if redirection bitmap selected?
.text:BF981F14 jz short loc_BF981F24
.text:BF981F16 push ebx
.text:BF981F17 push ebx
.text:BF981F18 call DC::pSurface(void)
.text:BF981F1D mov ecx, eax
.text:BF981F1F call SURFACE::bUnMap(void *,DC *)
.text:BF981F24 loc_BF981F24:
.text:BF981F24 mov ecx, [ebp+dcoTrg] ; ecx is a pointer to dst DCOBJ
.text:BF981F2A test dword ptr [ecx+18h], 4000h
.text:BF981F31 jz short loc_BF981F41
.text:BF981F33 push ecx
.text:BF981F34 push ebx
.text:BF981F35 call DC::pSurface(void)
.text:BF981F3A mov ecx, eax
.text:BF981F3C call SURFACE::bUnMap(void *,DC *)
这段代码测试标志、获得到SURFACE对象的指针,然后解除映射。由于这段代码没有处理dcoSrc == dcoTrg,可能导致对同一SURFACE两次调用bUnMap()。这可能触发同步错误,由于无法处理的异常而导致bugcheck。
<*来源:Tavis Ormandy (
taviso@gentoo.org)
链接:
http://www.exploit-db.com/exploits/14669/
http://secunia.com/advisories/41029/
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
http://www.exploit-db.com/download/14669建议:
厂商补丁:
Microsoft
---------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.microsoft.com/technet/security/浏览次数:2692
严重程度:0(网友投票)