四. 防范“映像劫持”
好了,前面说了这么多,大概又吓得一批人开始冒冷汗了吧,我们现在就来学习如何防范和破解“映像劫持”。
判断你的机器是否被劫持
最简单的方法是逐个运行你常用的安全工具,检查是否出现“无法找到文件”或者干脆直接没了反应的,当然,执行结果和预期差别太大的也要被怀疑为劫持,例如你执行IceSword.exe反而是你的QQ运行了,那就不必我多说了。
其实只要注册表编辑器regedit.exe、regedt32.exe没有被劫持,那我们直接用它进入“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”这个注册表项并展开里面的子项列表一个个看下来确认是否出现Debugger参数或其他可能影响程序运行的堆管理参数,便可得知机器是否被劫持。
如果注册表编辑器被劫持了怎么办?直接改个名就能用了啊……
更简单的方法,是使用Sysinternals的Autoruns,点击它的“Image Hijacks”选项卡,即可看到被劫持的程序项了。
追查劫持来源
如果不幸你的机器上已经成为“映像劫持”的受害者,请记录好Debugger指向的程序位置,也不要试图再执行那些安全工具,首先应该尝试删除受影响的IFEO项,然后刷新注册表看看数据是否马上恢复了,如果马上恢复,则说明后台里有程序正在实时判断和写入IFEO,这时候必须拿出Sysinternals出品的注册表监控工具Regmon或类似工具,设置Filter为你正在尝试删除的安全工具的IFEO项,很快就能发现具体是什么进程在操作注册表了,然后将IceSword改名(如果已经被劫持),在它的进程列表里将相应进程终止掉。如果这个进程立即又重生了呢?再终止一次,然后迅速点击IceSword的“监视进线程创建”,你就能发现上一次捣乱的程序是什么名字了,将它记录下来,再开启一个Sysinternals的工具“Process Explorer”,在对应进程上点击右键选择“Suspend”,这个进程就会被挂起,用IceSword和它配合把相关恶意进程都挂起后,再使用IceSword的文件功能里的“强制删除”,在这个程序还没来得及反应时就把它们的本体给歼灭,这时候再返回Process Explorer里按照大小排列从最大的一个守护进程开始Kill Process即可,由于没有了映像文件存在,它们意欲重新建立木马帝国的贼心也就无法实现了。
如果查杀过程更为复杂的话,请自行参阅相关文章,这里就不再赘述了。
如此实现“免疫”?不被推荐的做法
由于AV终结者搞得人心惶惶,一时间网络上开始流传“免疫映像劫持”甚至“利用映像劫持免疫大部分常见病毒”的做法,对于这些方法的最初提供者,我相信他们的出发点是好的,只是,从严格的角度来看,这却是不可取的。
首先是“免疫映像劫持”,具体的方法是,例如免疫威金病毒“logo_1.exe”,则在IFEO列表里建立一个“logo_1.exe”项,然后设定它的Debugger参数为它自身即“logo_1.exe”,根据原作者解释,其原理是递归死循环:“当Debugger的值等于本身时,就是调用自身来调试自己,结果自己不是调试器,又来一次,递归了,就进入了死循环,也就不能启动了。”
这种方法虽然有效(最后的现象是“找不到文件”),但是它会导致系统在短时间内陷入一个CreateProcess循环和命令参数的字符串累加状态,会消耗一定的资源,最终没能执行程序是因为系统使用CreateProcess启动的实例会被它自身代替执行,从而造成死循环,而且命令行的长度是有系统限制的,到一定范围就会出错了,尤其在可以接受命令行参数的程序里,你甚至会发现硬盘狂转了好一会儿才弹出错误提示,这段时间里就是在死循环传递状态了,最终由于超过系统限制的命令行长度而导致系统传递执行请求时出错,才得以跳出这个死循环,换一个角度来看,如果系统没有限制命令行长度,那么这个操作很可能直接导致系统所有资源都消耗在这个自己反复执行自己的“调试器”上了。
至于“利用映像劫持免疫大部分常见病毒”的做法,发起号召者模仿“映像劫持”后门屏蔽大部分常用安全工具的原理,搜集了许多流行危害程序的可执行文件名加以前面提到的递归死循环方法达到目的,如果不计较前面提到的递归死循环缺点,似乎这个方法是可行的。
然而这真的可行吗?世界上存在许多与某些系统文件同名同姓的社交型后门,如位置不同而名字相同的命令提示符输入法控制程序“conime.exe”(被OSO超级U盘病毒借用名字)、重要程序Rundll32.exe被某些木马替换为自身、甚至IE浏览器主体iexplore.exe也存在被木马伪造文件名的案例,如此一来不知道多少正常的系统程序可能会被这份“免疫列表”给误杀了,我仅仅粗略浏览了一下就发现msiexec.exe居然存在“免疫列表”中,要知道这可是微软安装程序的主执行体啊……
争议话题:是否禁止IFEO列表权限?
同时,网上还流传着一个让初级用户看不懂的做法,那就是关闭IFEO列表的写入权限,具体操作如下:
?执行32位注册表编辑器regedt32.exe
?定位到HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
?确保焦点在Image File Execution Options上,选择“安全”—“权限”
?将出现的用户列表内所有带有“写入”的权限去掉,确定退出
这样一来,任何对IFEO的写入操作都失效了,也就起了免疫效果。这个方法对一般用户而言还是不错的,除非遭遇到一些特殊的需要往里面写入堆管理参数的程序,否则我建议一般用户还是禁止此项,从而杜绝一切IFEO类病毒来袭。
而争议正在于此,因为从长计议来看,用户很可能会遇到需要往IFEO列表里写入数据的正常程序,彻底禁止了IFEO的写入可能会导致不可预见的后果,既然如此,我们就采取折中的方法好了,使用HIPS(主机入侵防御系统)的注册表防御体系RD(Registry Defend),为我们提供一种两者都能兼顾的IFEO管理方法!
以SSM为例,首先确保RD体系模块已经开启,然后添加新监视规则,“键路径”指向HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,“操作”为“当更改时报警”,记得“包含值”选上,最后把“子键深度最大值”设为“3”,点击确定生成新的监视规则,然后在“规则”主界面里确保“存取”、“删除”、“写入”的操作均为疑问状态,这是表示在相关键值被进行写入操作时弹出消息询问用户,最后点击“应用设定”让规则生效,从此只需开着SSM,映像劫持就离你远去了。
五. 千篇一律的结语
道高一尺,魔高一丈,当几乎所有可能利用的启动项都被安全工具翻了个遍以后,与安全对立的技术也就不得不往上提高一个档次,于是无论什么歪门邪道的招数,只要能够被利用,哪怕它原意是好的,也会被改写定义,从这次的映像劫持事件可以看出,这个系统远远不如我们想像中那么容易被掌握,尤其对普通用户而言,这次技术的误用简直是他们的灭顶之灾!在安全技术与反安全技术斗争激烈的今天,我们用户越来越有在夹缝中生存的感觉了,当年轻松就可以得到的随便开多少个网页都不会带来一个病毒的日子早已远去,要想在这个疯狂的世界里得以保全,我们只能借助于各种工具的守护,和学习更多本来可以不用接触的安全知识,难道这真的要变成互联网的生存法则吗?
=================================
后记:
发现一个有趣的现象,在百度上搜索映像劫持,会得到一堆结果返回的网页里都有这么一句话:
映像劫持原理:
Windows NT系统在执行一个从命令行调用的可执行文件运行请求时,首先会检查这是否是一个可执行文件,如果是,又是什么格式的,然后就会检查是否存在。
这段话看着是不是莫名其妙?没头没尾的,经过我耐心查找,终于在一个角落找到了原始出处,感谢tombkeeper的撰文(节选):
Windows NT系统在执行一个从命令行调用的可执行文件运行请求时,首先会检查这是否是一个可执行文件,如果是,又是什么格式的,然后就会检查是否存在:
[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName]
如果存在,首先会试图读取这个键值:
[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName]
"Debugger"="debug_prog"
如果存在,就执行“debug_prog ImageName”
很明显,被流传的“原理”来自tombkeeper的某篇文章中的前一段,或许抄袭者不明白后面接着的注册表键值是什么意思,有什么重要作用,就想当然的截断了,于是,这篇抄袭不完整的断章取义文章经过一传十,十传百的散播途径后,终于成为了铺天盖地的“真理”,也难怪那么多人对IFEO感觉很好奇,因为光看那些大部分文章都是只有这么一段的,不信大家可以找找“IFEO”关键字,看看里面对“原理”的描述,真无语了,哎……