瑞星卡卡安全论坛技术交流区反病毒/反流氓软件论坛 微软史上最严重漏洞--MS08-067漏洞分析

1   1  /  1  页   跳转

[转载] 微软史上最严重漏洞--MS08-067漏洞分析

微软史上最严重漏洞--MS08-067漏洞分析

来源:瑞星公司 时间:2008-10-31 11:10:05


  近日,微软打破常规发布了MS08-067漏洞补丁。使用该漏洞,黑客可以在远程发动类似“冲击波”病毒一样的攻击。


  下面是瑞星互联网攻防实验室做的漏洞分析报告,下午会发布一个瑞星提供的内存补丁,该补丁可以检查异常RPC请求,阻断黑客利用该漏洞的攻击。暂时不愿意打微软补丁的用户,可以用这个补丁来应急。(瑞星防火墙2009体验版也升级了针对该漏洞的异常请求过滤,大家可以下载来试试看。)


MS08-067漏洞分析


    netapi32.dll!NetpwPathCanonicalize在解析路径名时存在堆栈上溢的漏洞,攻击者可以传入精心构造的路径参数来覆盖掉函数的返回地址,从而执行远程代码。攻击者可以通过RPC发起请求,该请求的处理在svchost.exe中实现,导致svchost.exe发生远程溢出。
   
    下面以 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
函数通过内部函数CanonicalizePathName来处理传入的路径。该函数又调用内部函数DoCanonicalizePathName来实现真正的处理过程,该漏洞的溢出点则是出现在DoCanonicalizePathName函数中:



该函数首先把路径中的’/’全部转成’\’,然后试图修改传入的路径缓冲区来得到相对路径。比如:
.\\abc\123\..\a\..\b\.\c
将被处理成:
\abc\b\c



该函数在处理相对路径时,使用两个指针分别保存前一个斜杠(后面用’\’表示)和当前’\’的指针,如下所示:
\abc\a\..\b
    ^  ^
    |  |
    |  +--- 当前’\’指针(后文表示为CurrentSlash)
    +----- 前一个’\’指针(后文表示为PrevSlash)



   
当该函数扫描到’..\’时,会把CurrentSlash开始的数据复制到PrevSlash开始的内存空间处,然后(!漏洞就在这里!)从当前的PrevSlash指针减1的位置开始向前(低地址处)搜索’\’来重新定位PrevSlash,搜索截止条件为PrevSlash等于路径缓冲区的起始地址。
   
   
    下面是该函数的处理过程:


.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



   
当完成对’..\’的替换后,缓冲区的内容为:’\a’。这时,按照该函数的算法,把PrevSlash减1并开始向前搜索’\’,此时PrevSlash已经向前越过了路径缓冲区的起始地址,所以该函数的截止条件失效,导致该函数会一直向堆栈的低地址空间搜索(上溢出)。如果在低地址处正好搜到一个’\’,则会把CurrentSlash之后的数据复制到堆栈中’\’开始的地方,并覆盖掉堆栈中的正常数据。攻击者可以通过传入精心构造的路径数据来覆盖掉函数的返回地址来执行代码。




用户系统信息:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
分享到:
gototop
 

回复:微软史上最严重漏洞--MS08-067漏洞分析

我只是想让你们看看,看有懂的没有呀!
gototop
 
1   1  /  1  页   跳转
页面顶部
Powered by Discuz!NT