最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ā)之地。

這個漏洞主要是因?yàn)閃indows 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的實(shí)現(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的實(shí)現(xiàn)很簡單

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

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

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

因?yàn)樵诠蚕砼R界中,沒有修改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

解決方案:
等待微軟更新官方補(bǔ)丁.

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

相關(guān)文章

最新評論

怀化市| 墨江| 扬中市| 嘉义县| 六枝特区| 五指山市| 定襄县| 怀宁县| 盐亭县| 偏关县| 海盐县| 南通市| 怀宁县| 济南市| 田阳县| 南召县| 广饶县| 交城县| 克什克腾旗| 镶黄旗| 巩留县| 全州县| 蒙阴县| 青冈县| 饶阳县| 舟曲县| 宕昌县| 沐川县| 怀化市| 张北县| 东莞市| 永嘉县| 射洪县| 苏尼特右旗| 颍上县| 金华市| 宜黄县| 红桥区| 恩施市| 伊宁县| 金山区|