主机入侵防御系统(Host Intrusion Prevent System,HIPS)是近几年出现并迅速发展的新兴产物,与传统意义的防火墙和杀毒软件不同,它并不具备特征码扫描和主动杀毒等功能,所以想用它来替换传统杀毒软件然后安枕无忧睡大觉的用户可以不必尝试了,主机入侵防御系统是不会区别正常程序和木马的,它只有一个动作,那就是让你了解一个进程的加载情况并让你决定这个进程能否运行,换句话说,系统的安全性取决于用户本身,因为主机入侵防御系统只是一种将系统控制权交给用户的防御体系。
目前主机入侵防御系统可提供三种防御:应用程序防御体系AD(Application Defend)、注册表防御体系RD(Registry Defend)、文件防御体系FD(File Defend),这三种体系合称为“3D”,根据实际情况,并非所有HIPS都提供了完整的3D体系,例如文件防御体系就经常被取消。
应用程序防御体系(AD)在大部分HIPS里属于最重要的功能,这个功能的优劣足以直接影响到系统安全。AD通过拦截系统调用函数来达到监视目的,当一个程序请求执行时,系统会记录该程序的宿主(即该程序的执行请求由哪个程序发出),在Windows里,用户启动的程序,其宿主为Windows外壳程序Explorer.exe,因为用户的交互界面是由该程序负责的,用户双击鼠标执行一个程序时,实际上就是通过Explorer.exe向内核传递的消息,于是它便成为用户程序的宿主;而并非所有程序都是通过Explorer.exe执行的,系统自身也执行着许多基本进程,这些进程几乎都由smss.exe所产生,而这些通过smss.exe产生的进程又能成为其它进程的宿主,如services.exe成为svchost.exe的宿主等,这些层层叠叠的关系被称为“进程树”(Process Tree)。基于这个原理,许多伪造成系统程序的木马其实很容易被发现,因为它们大部分通过系统启动项加载,而这个启动项是属于Explorer.exe负责的,于是木马们的宿主就成了它——csrss.exe居然由Explorer.exe加载运行,这本身就违背了系统设计的初衷。
让我们继续学习用户程序的执行过程,当程序执行的请求被系统捕获后,系统会产生一个创建进程的函数调用,称为CreateProcess,位于kernel32.dll,这个函数的功能是执行一些基本的初始化工作,然后将程序请求封装传递到内核接口ntdll的NtCreateProcess函数中,该函数把有关的参数从用户空间拷贝到内核并做进一步处理,直至最后新的进程被成功创建,而ntdll也只是个内核接口而已,实际的内核体是ntoskrnl.exe。程序员通过编写内核驱动拦截NtCreateProcess、NtCreateSection等函数就实现了对创建进程的控制,在这点上,病毒作者和安全专家做的事情都是相同的,只不过用来实现破坏系统安全作用的被称为Rootkit木马,用来保护系统的被称为“应用程序防御体系”而已。HIPS的“应用程序防御体系”也是通过驱动拦截实现的,只是它把创建进程的决定权交给用户。
在HIPS的监视下,当一个进程被请求创建时,用户层的应用程序接口函数CreateProcess被拦截并被获取调用参数来分析出程序的执行体和宿主等,而后HIPS将这个执行请求挂起(暂停执行CreateProcess及以后的步骤),并于桌面弹出一个对话框报告用户当前拦截的进程创建信息,其中包括执行体、宿主、被拦截的API等,最后等待用户决定是否继续让其执行。用户必须具备相关的进程概念,如桌面快捷方式和幕后调用的可执行程序实际文件名的对应关系,这样才不至于出现一头雾水的后果,用户的决定对于系统安全才是致命的,如果一个用户在双击“千千静听”后对着HIPS拦截的“Explorer.exe试图创建TTPlayer.exe进程”的报告感到不解,那么或许传统意义的杀毒软件更适合这类未入门的初哥。
HIPS的AD体系不仅能拦截到用户或某个程序产生的进程创建请求,它还能拦截到进程产生的所有操作,如DLL加载、组件调用等,这样我们也能用它来拦截一些DLL形态的进程注入,只要用户的基础知识达到一定程度,AD体系足以让你不再害怕大部分木马病毒的来袭,试想一下,如果用户在浏览网页时HIPS突然报告说浏览器进程“试图创建123.exe进程”、或者运行某些安装程序时HIPS拦截到该安装程序“试图创建1.exe进程”,只要用户选取了“拒绝执行”功能,这些潜在的木马就无法入侵用户的系统了——但是要注意一点,那就是木马本体已经被释放或下载回来了,只是它们无法被执行而已,HIPS不是杀毒软件,它不能阻止非法程序的下载和释放,更不提供自动删除文件的功能,它所做的,只是拦截进程操作而已,使用HIPS保护的系统安全取决于用户自身。
HIPS里还有个相当重要的功能是注册表防御体系(RD),众所周知,在Windows系统结构中,注册表一直扮演着一个重要角色,许多非法程序和木马也通过修改注册表达到许多黑暗目的,如主页修改劫持等,而木马等程序的自启动也是由注册表的启动项负责的,因此,要进一步确保系统安全的话,对注册表的监视保护是必须的,从很早以前就开始使用电脑的用户应该会记得当初流行的许多注册表监视工具,然而这些工具并不能帮助用户保护注册表,因为它们仅仅是位于用户层的程序而已,其调用的API函数也是经过层层封装返回的,在当前许多进入了核心层的木马面前,这些程序根本就是被耍猴的对象,要正确监视到真正的注册表操作,就必须进入核心层,抢先拦截到系统相关的底层注册表操作函数,这就是注册表防御体系的工作。
系统提供了一系列的注册表读写访问函数来实现用户层的功能,而这些API和之前提到的创建进程函数一样,也是一种对系统内核导出函数的封装传递,如果相关函数被驱动木马拦截,普通的注册表监视程序,包括系统自带的注册表编辑器也无法发现某些项目或执行相关操作,这就是“删不掉的启动项”的来由。
在内核层中,注册表的名称并非为Registry,而是“HIVE”(蜂巢),它的数据结构称为“Cell”(蜂室),这是最底层最不可被欺骗的注册表形态结构,许多高级的Rootkit分析程序都提供分析注册表的功能,实际上就是通过分别读取用户层返回和HIVE数据结构来判断对比系统中是否存在被恶意隐藏的数据项,分析HIVE文件是漫长的过程,这是对付高级隐藏时才不得以而为之的方法,而平时安全工具只需要拦截到内核层导出的操作函数如NtOpenKey、NtCreateKey、NtQueryKey等就可以了,这正是注册表防御体系要做的事情。
RD默认提供了对几个常见的系统敏感注册表项进行监视,如启动项、服务驱动项、系统策略项、浏览器设置项等,所有木马要自启动都必须经过启动项或服务驱动项的添加修改来实现,而要对浏览器进行劫持和主页修改就得通过修改浏览器设置项等,而这些操作默认都被RD视为敏感行为而拦截挂起,并弹出警告框报告用户该次操作的具体内容和发出操作请求的执行体,操作最终能否通过也同样取决于用户本身,由于它拦截了系统核心层导出的API函数,无论是木马还是用户程序的操作都逃不过法眼,从而实现了真正有效的监视和拦截。
最后是文件防御体系(FD),这个功能的作用是监视系统敏感目录的文件操作,如修改删除系统目录里的任何文件或创建新文件等,也可用来发现被驱动木马隐藏的文件本体,FD体系在许多杀毒软件里已经提供,一部分HIPS为了提高效率,并不具备FD,因为它相对要消耗的资源比较大,而前面的AD+RD+有一定经验的用户操作,就已经足够防止危害的文件操作产生了。
实现文件防御体系的要点同样也是拦截系统底层函数如NtOpenFile等,HIPS默认对系统敏感目录进行监控保护,一旦发现异常读写,则把相关操作挂起,并提示用户是否放行,FD不仅仅只有HIPS提供,其他安全工具如360安全卫士、超级巡警等也具备此功能,该功能运作起来要比前两者消耗的资源大些。