微软爆出2008年最严重漏洞 用户可用瑞星卡卡打好补丁

2009-08-27 07:51:00
摘要:  10月24日,瑞星公司发出安全警报,微软系统爆出2008年最大的安全漏洞(MS08-067),影响包括Windows XP SP3、Windows 2000、Windows Server 2003、Windows Vista等几乎所有主流操作系统。黑客可以利用此漏洞发动大规模远程

  10月24日,瑞星公司发出安全警报,微软系统爆出2008年最大的安全漏洞(MS08-067),影响包括Windows XP SP3、Windows 2000、Windows Server 2003、Windows Vista等几乎所有主流操作系统。黑客可以利用此漏洞发动大规模远程攻击,实际效果可与“冲击波”、“震荡波”等病毒类似。
  瑞星安全专家表示,尽管微软已经发布了该漏洞的补丁,但由于近期“黑屏”事件的影响,很多用户已经关闭了系统的补丁自动更新功能,因此很可能造成严重的危害。针对此情况,瑞星卡卡上网安全助手(下载地址:http://tool.ikaka.com)已经升级了漏洞扫描库,用户可以使用卡卡给自己的电脑打好这个补丁,以应对此漏洞带来的安全风险。
  瑞星安全专家表示,该漏洞存在于操作系统的RPC模块,如果用户的计算机收到了特制的RPC请求,则攻击者可以绕过系统的认证远程运行任意代码。当初“冲击波”、“震荡波”病毒利用的同样是RPC漏洞,因此该漏洞很可能造成类似的大规模蠕虫攻击。
  
  瑞星专家建议,对于个人用户来讲,最好用瑞星卡卡助手的漏洞扫描功能,给计算机打好所有补丁,打好补丁之后即可防御此类蠕虫攻击;企业用户应该对自己的服务器和防火墙进行相应的防范性配置,以免该漏洞影响自己的正常工作。

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之后的数据复制到堆栈中’\’开始的地方,并覆盖掉堆栈中的正常数据。攻击者可以通过传入精心构造的路径数据来覆盖掉函数的返回地址来执行代码。

下载:MS08-067漏洞内存补丁工具

[责任编辑:郑国维]

相关文章:

关于瑞星|联系方式|服务与支持