• 安全动态

windows中程序不安全的DLL加载漏洞的分析


背景
微软8月23日发布了新的安全通告(MSA2269637),提醒用户防范因应用程序采用不安全 的DLL加载方式而导致的远程代码执行威胁,即“DLL劫持攻击”。攻击者只要成功诱导用 户从一个不安全路径打开一个特殊构造的文件,即可触发运行用户计算机上存在问题的应用程 序,进而远程执行任意代码[1]。 原理
当应用程序调用LoadLibrary()或者LoadLibraryEx()的时候,如果参数指定了DLL的完整 路径,那么就会直接加载该路径上的DLL;否则就会按照预定的路径搜索顺序寻找同名的DLL来 加载。 DLL加载的搜索顺序如下[4]: SafeDllSearchMode关闭 1.应用程序所在目录 2.当前工作目录 3.系统目录 4.16位系统目录 5.Windows目录 6.环境变量指定的目录 SafeDllSearchMode打开 1.应用程序所在目录 2.系统目录 3.16位系统目录 4.Windows目录 5.当前工作目录 6.环境变量指定的目录 利用的方法 利用过程 攻击者把同名的恶意DLL放在当前工作目录上。应用程序运行时会按上述的搜索顺序寻找DLL,如 果在当前工作目录前的所有目录都没有需要的DLL,那么当搜索到当前工作目录时,应用程序就会 加载同名的恶意DLL,使得DLL中的代码可以在该应用程序的权限下执行。 利用条件 1.应用程序在调用LoadLibrary()时没有指定完整路径 2.在路径搜索顺序中,真正的DLL所在的目录排在当前工作目录之后 3.当前工作目录在路径搜索顺序中没有被剔除 4.当前工作目录的切换(方法:如BitTorrent,将恶意同名DLL跟一个种子文件放在同 一个目录下,当双击这个种子文件时,系统会自动调用BitTorrent程序来打开文件, 此时当前工作目录就是恶意DLL所在的目录) 为什么选择当前工作目录? 1.没有访问和修改系统目录的权限 2.当前工作目录所涵盖的范围更广(如包括WebDAV、SMB、etc.),所需要的权限较低 影响 攻击者可以通过提供恶意同名DLL,利用有漏洞的应用程序,在目标系统上执行恶意的代码,从而 实现获取权限、留下后门等目的。 受影响的程序:VMware、Wireshark、Mozilla、BitTorrent、Adobe、etc.(详见[3]) 解决方法 1.指定完整路径的DLL 2.打开安全路径搜索模式(部分解决) 3.剔除对当前工作目录的搜索  利用 SetDllDirectory 或者SetCurrentDirectory(参数设为空字符串)[3][6]  升级补丁(CWDIllegalInDllSearch) a.在库搜索路径中删除当前工作目录 b.阻止应用程序从WebDAV上加载动态库 c.阻止应用程序从WebDAV和远程UNC加载动态库 4.DLL重定向或者manifests文件 解决方法的影响 此前有部分第三方破解版软件是利用这个漏洞进行加载的,所以当修复完此漏洞之后,可能会 导致这些破解版软件无法正常运行[10]。 参考文献 [1]http://www.ccert.edu.cn/announce/show.php?handle=157 [2]http://www.microsoft.com/technet/security/advisory/2269637.mspx [3]http://www.kb.cert.org/vuls/id/707943#vendors [4]http://msdn.microsoft.com/en-us/library/ms682586(v=VS.85).aspx [5]http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx [6]http://blogs.msdn.com/b/david_leblanc/archive/2010/08 /23/another-technique-for-fixing-dll-preloading-attacks.aspx [7]http://www.us-cert.gov/cas/techalerts/TA10-238A.html [8]http://support.microsoft.com/kb/2264107 [9]http://msdn.microsoft.com/en-us/library/ms682600(v=VS.85).aspx [10]360修复漏洞说明