RSS
 
當前位置 : 主頁 > 硬件知識 >

WINDOWS 7 RC 7100 GDI驅動Win32k.sys內核D.O.S漏洞

時間:2014-04-06 01:00 瀏覽:

點評:感謝:Iceboy發現此問題并提供DUMP 漏洞廠商及產品:Microsoft Windows 7 rc 7100 090421 存在漏洞組件:win32k.sys Timestamp :49ee8dc8 存在漏洞函數:NtUserGetDc/NtUserGetDcEx 漏洞描述:Win32k.sys是WINDOWS的GDI驅動程序,包含大量復雜的圖形界面處理,由于其中大量代

感謝:Iceboy發現此問題并提供DUMP
漏洞廠商及產品:Microsoft Windows 7 rc 7100 090421
存在漏洞組件:win32k.sys Timestamp :49ee8dc8
存在漏洞函數:NtUserGetDc/NtUserGetDcEx

www.vvoycf.tw 電腦網

漏洞描述:Win32k.sys是WINDOWS的GDI驅動程序,包含大量復雜的圖形界面處理,由于其中大量代碼是從WIN3.1中修改過來,因此成了WINDOWS漏洞多發之地。

www.vvoycf.tw 電腦網

這個漏洞主要是因為Windows 7 在其NtUserGetDc/NtUserGetDcEx函數中(也許不僅僅是這兩個函數)不正確地使用了共享臨界鎖,導致了任何權限下的GDI程序可以引發內核BSOD,從而進行DOS攻擊
  www.vvoycf.tw

漏洞分析:
在WINDOWS VISTA中,在這兩個函數進入前,會調用UserEnterUserCirtSec,進入臨界區,同時會將gptiCurrent設置為當前線程的WIN32THREAD

www.vvoycf.tw 電腦網

UserEnterUserCritSec的實現如下: www.vvoycf.tw

PWIN32THREAD UserEnterUserCritSec()
{

PWIN32THREAD pwin32Thread;

pwin32Thread = ExEnterPriorityRegionAndAcquireResourceExclusive(gpresUser);
gptiCurrent = pwin32Thread;
gbValidateHandleForIL = 1;
return pwin32Thread;
} 

www.vvoycf.tw

ExEnterPriorityRegionAndAcquireResourceShared是NTOSKRNL 導出一個提供給WIN32K使用的共享資源鎖函數,這個函數將共享鎖住gpresUser這個資源,同時返回當前線程的Win32Thread,即 KeGetCurrentThread->Win32Thread

www.vvoycf.tw

同時內核函數ExEnterPriorityRegionAndAcquireResourceExclusive也與其類似。
(XP則是調用KeEnterCriticalRegion后,用ExAcquireResourceExclusiveLite鎖住 gpresUser,然后用PsGetCurrentThread->PsGetThreadWin32Thread獲得當前線程 win32kthread,存放到gptiCurrent)

www.vvoycf.tw

而在windows 7 中,這兩個函數進入前,改為了調用UserEnterSharedCrit,進入共享臨界區 電腦網

UserEntrySharedCirt的實現很簡單

www.vvoycf.tw

PWIN32THREAD EnterSharedCrit()
{
return ExEnterPriorityRegionAndAcquireResourceShared(gpresUser);
} www.vvoycf.tw 電腦網 

可以注意到,這里并不設置gptiCurrent,事實上,NtUserGetDc/NtUserGetDcEx會將這個函數保存在寄存器中以便使用CurrentWin32Thread中存放的數據 zjjkw.cn 電腦網

從關鍵臨界轉為共享臨界,無疑這樣的修改將提升NtUserGetDc/NtUserGetDcEx的效率,減少了鎖競爭的可能,但是在這里這樣修改是錯誤的.

www.vvoycf.tw

因為在共享臨界中,沒有修改gptiCurrent,那么就很可能遇到gptiCurrent非法的狀態,比如遇到一個沒有做PsConvertToGuiThread的線程導致了gptiCurrent為空.

ZJJKW.CN 電腦網

WIN32K中有大量內部例程(經常以zzz,xxx開頭),他們都認為在調用自己之前,gptiCurrent是一個有效的狀態。這其中就包括了xxxDestoryWindow

www.vvoycf.tw

一個BSOD的例子是:NtUserGetDc->GetWindowDc->GetDcEx->SpbCheckDce->SpbCheckRect->SpbCheckRect2->FreeSpb www.vvoycf.tw

調用到FreeSpb時,這里要釋放一個spb對象了

www.vvoycf.tw

接著就到
FreeSpb->HMAssigmentUnlock->HMUnlockObject->HMUnlockObjectInternal->HMDestroyUnlockedObject, 最終調用到了ganti表中的函數,由于這里是GetWindowDc,所以將調用xxxDestroyWindow,xxxDestroyWindow 第一句代碼就無檢查引用了gptiCurrent指針中的數據,自然直接導致BSOD

www.vvoycf.tw

解決方案:
等待微軟更新官方補丁. www.vvoycf.tw

微軟可能的更新手段:
犧牲效率將NtUserGetDc等中的不正確共享鎖替換為關鍵臨界鎖,或者將所有NtUserGetDc等函數可能用到的內部函數中的gptiCurrent引用去掉或換為不引用gptiCurrent的其他函數

www.vvoycf.tw 電腦網

 
30选5怎么中奖号码