亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

WINDOWS 7 RC 7100 GDI驅(qū)動Win32k.sys內(nèi)核D.O.S漏洞

  發(fā)布時間:2009-05-24 18:19:01   作者:佚名   我要評論
感謝:Iceboy發(fā)現(xiàn)此問題并提供DUMP 漏洞廠商及產(chǎn)品:Microsoft Windows 7 rc 7100 090421 存在漏洞組件:win32k.sys Timestamp :49ee8dc8 存在漏洞函數(shù):NtUserGetDc/NtUserGetDcEx 漏洞描述:Win32k.sys是WINDOWS的GDI驅(qū)動程序,包含大量復(fù)雜的圖形界面處理,由于其中大量代

感謝:Iceboy發(fā)現(xiàn)此問題并提供DUMP
漏洞廠商及產(chǎn)品:Microsoft Windows 7 rc 7100 090421
存在漏洞組件:win32k.sys Timestamp :49ee8dc8
存在漏洞函數(shù):NtUserGetDc/NtUserGetDcEx

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

這個漏洞主要是因為Windows 7 在其NtUserGetDc/NtUserGetDcEx函數(shù)中(也許不僅僅是這兩個函數(shù))不正確地使用了共享臨界鎖,導(dǎo)致了任何權(quán)限下的GDI程序可以引發(fā)內(nèi)核BSOD,從而進(jìn)行DOS攻擊
 

漏洞分析:
在WINDOWS VISTA中,在這兩個函數(shù)進(jìn)入前,會調(diào)用UserEnterUserCirtSec,進(jìn)入臨界區(qū),同時會將gptiCurrent設(shè)置為當(dāng)前線程的WIN32THREAD

UserEnterUserCritSec的實現(xiàn)如下:

PWIN32THREAD UserEnterUserCritSec()
{

PWIN32THREAD pwin32Thread;

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

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

同時內(nèi)核函數(shù)ExEnterPriorityRegionAndAcquireResourceExclusive也與其類似。
(XP則是調(diào)用KeEnterCriticalRegion后,用ExAcquireResourceExclusiveLite鎖住 gpresUser,然后用PsGetCurrentThread->PsGetThreadWin32Thread獲得當(dāng)前線程 win32kthread,存放到gptiCurrent)

而在windows 7 中,這兩個函數(shù)進(jìn)入前,改為了調(diào)用UserEnterSharedCrit,進(jìn)入共享臨界區(qū)

UserEntrySharedCirt的實現(xiàn)很簡單

PWIN32THREAD EnterSharedCrit()
{
return ExEnterPriorityRegionAndAcquireResourceShared(gpresUser);
}

可以注意到,這里并不設(shè)置gptiCurrent,事實上,NtUserGetDc/NtUserGetDcEx會將這個函數(shù)保存在寄存器中以便使用CurrentWin32Thread中存放的數(shù)據(jù)

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

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

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

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

調(diào)用到FreeSpb時,這里要釋放一個spb對象了

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

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

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

相關(guān)文章

最新評論