对于微软MS08-067重大漏洞分析

taitaiai 2008-11-04 05:21:33



近日,微软打破常规发布了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已经向前越过了路径缓冲区的起始地址,所以该函

数的截止条件失效,导致该函数会一直向堆栈的低地址空间搜索

(上溢出)。如果在低地址处正好搜到一个’\’,则会把

CurrentSlas
...全文
185 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧