8月23日微软就“不安全的DLL加载漏洞”发布了安全公告。该漏洞又名“DLL预加载漏洞”或者“二进制种植”漏洞。
该漏洞涉及全部的Windows操作系统,微软目前正在调查自身的哪些产品受这一漏洞的影响。同时,微软已经发布了一个补丁,这个补丁可帮助用户和系统管理员减轻受此漏洞的影响。(注意:此补丁的下载需要通过Window正版验证),不同版本操作系统的下载页面详见
http://www.microsoft.com/downloads/zh-cn/results.aspx?pocId=&freetext=KB2264107&DisplayLang=zh-cn
其实这个漏洞并非新近发现的,其所利用的原理,或者说导致此漏洞的原因,即是Windows加载未指明完整路径的DLL文件的机制。DLL文件大家都不陌生,无论是常用的应用程序,或者操作系统自身都带有不同数量的DLL文件。正是由于这些DLL文件的存在,才使得应用程序或者操作系统的功能丰富多彩。
DLL文件并不像EXE等可执行程序那样具备自主运行的能力,其需要通过其它程序的调用才可执行。由于Windows的一些特性,程序员在调用DLL时可不必指明被调DLL的完整路径。那Windows又是如何在茫茫的系统文件中找到所需的DLL文件呢?Windows系统在这一问题上有着自己的一套“潜规则”,其是按照如下顺序在海量系统文件中“捞针”的:
1.应用程序所在目录
2.系统目录
3.16位系统目录
4.Windows目录
5.当前工作目录
6.PATH变量定义的目录
Windows是按照如上的六部曲,完成寻找被调用DLL的工作。比如,一个程序要调用system32文件夹下的一个系统DLL,那么程序员在调用时只需直接注明DLL文件名,例如“wininet.dll”即可。至于程序可以在哪里找到这个DLL,程序员可不必关心,因为这个寻找、定位的工作是由操作系统完成的。可以看出,这样做的好处就是方便了程序员,减少了他们在代码编写过程中的输入量。不过,由此也便产生了一个严重的问题:如果被调用的DLL正好位于上面提到的六部曲中的第六部,那么系统则需要依次访问完之前的五部曲后,才可定位该文件。如果,在之前五部曲的某部曲中恰巧也存在与被调DLL文件同名的文件,那么系统便不会再继续之后的几部曲,而是单纯地认为被调DLL已经找到并且进行加载。这样问题便凸显了,如果这个同名的DLL是个恶意文件,那岂不是“帮”我们自动激活了病毒?
事实即是如此。其实,这个漏洞已不是什么新鲜的事物,利用这一漏洞的病毒也早已出现。比如一些盗号木马,会通过替换某些游戏程序必需的DLL文件的方式来实现自身的加载运行等。还有一些木马会替换一些流行软件安装目录下的DLL文件,其目的也是不言自明。
微软之所以发布这一显得颇为“过时”的安全公告,想必是其发现这一问题正在被越来越多地加以利用。
按照惯例,微软依旧给出了变通解决方案以供用户应对:
1.安装微软为此特别推出的KB2264107号补丁。不过遗憾的是,这个补丁的下载需要通过正版验证。考虑到此漏洞涉及面广且影响较大,强烈建议微软参考其它安全类补丁的做法,去除其下载时需要的正版验证。
在安装了这个补丁的前提下,可根据KB2264107文章中提到的方法,关闭WebDAV和远程网络共享的加载库功能。
2.关闭WebClient服务(会导致WebDAV请求无法被传送,同时任何依赖于此服务的服务将不能启动)
3.关闭TCP 139和445端口(使用这些端口的服务或协议会受到影响,例如文件与打印机共享、打印队列管理服务等)
PS:今天上午看的时候这个补丁还是要求正版系统才能下载,今天晚上看就可以公开下载了,甚是奇怪,顺便把补丁下载地址提供一下吧,以便方便大家。
注意:如果选择安装该补丁,请先在个别机器上安装,运行热门游戏以及常用软件后,确认无蓝屏死机问题后再批量部署到其他所有机器上,网维大师用户可以使用客户机系统补丁功能批量为有盘客户机更新该补丁,系统虚拟盘用户需要开超级用户手工安装该补丁。
更多关于该补丁的FAQ详见微软知识库介绍:http://support.microsoft.com/kb/2264107
Winxp补丁下载:http://download.microsoft.com/download/4/4/5/445A9E59-BA70-43F5-A127-DEFA7829E922/WindowsXP-KB2264107-x86-CHS.exe
Win2003补丁下载:http://download.microsoft.com/download/1/F/2/1F2CE6C6-F625-45DC-8957-E471EC43B1F4/WindowsServer2003-KB2264107-x86-CHS.exe