微軟爆出2008年最嚴(yán)重漏洞 用戶可用瑞星卡卡打好補(bǔ)丁
2009-08-27 07:51:00MS08-067漏洞分析
netapi32.dll!NetpwPathCanonicalize在解析路徑名時(shí)存在堆棧上溢的漏洞,攻擊者可以傳入精心構(gòu)造的路徑參數(shù)來(lái)覆蓋掉函數(shù)的返回地址,從而執(zhí)行遠(yuǎn)程代碼。攻擊者可以通過(guò)RPC發(fā)起請(qǐng)求,該請(qǐng)求的處理在svchost.exe中實(shí)現(xiàn),導(dǎo)致svchost.exe發(fā)生遠(yuǎn)程溢出。
下面以 5.1.2600.2180 版本為例分析該漏洞的成因:
.text:5B86A259 NetpwPathCanonicalize proc near
...
.text:5B86A2AF push edi ; int
.text:5B86A2B0 push [ebp arg_8] ; int
.text:5B86A2B3 mov [esi], di
.text:5B86A2B6 push esi ; int
.text:5B86A2B7 push [ebp pPolicyChain] ; pathname
.text:5B86A2BA push ebx ; int
.text:5B86A2BB call CanonicalizePathName
.text:5B86A2C0 cmp eax, edi
.text:5B86A2C2 jnz short @@Return
...
.text:5B86A2D2 NetpwPathCanonicalize endp
.text:5B86A2E0 CanonicalizePathName proc near
...
.text:5B86A37D push eax ; str
.text:5B86A37E call DoCanonicalizePathName
.text:5B86A383 test eax, eax
.text:5B86A385 jz short @@Return_0x7B
...
.text:5B86A3C7 CanonicalizePathName endp
Netapi32.dll!NetpwPathCanonicalize函數(shù)通過(guò)內(nèi)部函數(shù)CanonicalizePathName來(lái)處理傳入的路徑。該函數(shù)又調(diào)用內(nèi)部函數(shù)DoCanonicalizePathName來(lái)實(shí)現(xiàn)真正的處理過(guò)程,該漏洞的溢出點(diǎn)則是出現(xiàn)在DoCanonicalizePathName函數(shù)中:
該函數(shù)首先把路徑中的’/’全部轉(zhuǎn)成’\’,然后試圖修改傳入的路徑緩沖區(qū)來(lái)得到相對(duì)路徑。比如:
.\\abc\123\..\a\..\b\.\c
將被處理成:
\abc\b\c
該函數(shù)在處理相對(duì)路徑時(shí),使用兩個(gè)指針?lè)謩e保存前一個(gè)斜杠(后面用’\’表示)和當(dāng)前’\’的指針,如下所示:
\abc\a\..\b
^ ^
| |
| --- 當(dāng)前’\’指針(后文表示為CurrentSlash)
----- 前一個(gè)’\’指針(后文表示為PrevSlash)
當(dāng)該函數(shù)掃描到’..\’時(shí),會(huì)把CurrentSlash開始的數(shù)據(jù)復(fù)制到PrevSlash開始的內(nèi)存空間處,然后(!漏洞就在這里?。漠?dāng)前的PrevSlash指針減1的位置開始向前(低地址處)搜索’\’來(lái)重新定位PrevSlash,搜索截止條件為PrevSlash等于路徑緩沖區(qū)的起始地址。
下面是該函數(shù)的處理過(guò)程:
.text:5B87879C @@LoopSearchSlash:
.text:5B87879C mov [ebp PrevSlash], edi
.text:5B87879F mov esi, edi
.text:5B8787A1 lea eax, [edi-2]
.text:5B8787A4 jmp short @@IsSlash?
.text:5B8787A6
.text:5B8787A6 @@LoopSearchBack:
.text:5B8787A6 cmp eax, [ebp BufferStart]
.text:5B8787A9 jz short @@EndOfSearch
.text:5B8787AB dec eax
.text:5B8787AC dec eax
.text:5B8787AD
.text:5B8787AD @@IsSlash?:
.text:5B8787AD cmp word ptr [eax], '\'
.text:5B8787B1 jnz short @@LoopSearchBack
.text:5B8787B3
.text:5B8787B3 @@EndOfSearch:
考慮下面的情況:
\..\a
^ ^
| |
| --- CurrentSlash
------ PrevSlash
當(dāng)完成對(duì)’..\’的替換后,緩沖區(qū)的內(nèi)容為:’\a’。這時(shí),按照該函數(shù)的算法,把PrevSlash減1并開始向前搜索’\’,此時(shí)PrevSlash已經(jīng)向前越過(guò)了路徑緩沖區(qū)的起始地址,所以該函數(shù)的截止條件失效,導(dǎo)致該函數(shù)會(huì)一直向堆棧的低地址空間搜索(上溢出)。如果在低地址處正好搜到一個(gè)’\’,則會(huì)把CurrentSlash之后的數(shù)據(jù)復(fù)制到堆棧中’\’開始的地方,并覆蓋掉堆棧中的正常數(shù)據(jù)。攻擊者可以通過(guò)傳入精心構(gòu)造的路徑數(shù)據(jù)來(lái)覆蓋掉函數(shù)的返回地址來(lái)執(zhí)行代碼。


