安全研究

安全漏洞
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(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障