预计阅读本页时间:-
9.8.5 基于模型的入侵检测
还有一种方法可以保护我们的机器,那就是安装一个IDS(Intrusion Detection System)。IDS有两种基本的类型,一种关注于监测进入电脑的网络包,另一种关注寻找CPU上的异常情况。之前在防火墙的部分我们简要地提到了网络IDS;现在我们对于基于主机的IDS进行一些讲解。出于篇幅限制,我们不能够审视全部的种类繁多的基于主机的IDS。相反地,我们选择一种类型来简单地了解它们是如何工作的。这种类型是基于静态模型的入侵检测(wagner和Dean,2001)。它可以用上面提到的囚禁技术来实现,同时也有其他的实现方法。
在图9-36a中我们看到了这样一个小程序,它打开一个叫data的文件,然后每次一个字符地读入,直到遇到了一个0字节,这时打印出文件开始部分的非0字节的个数然后程序退出。在图9-36b中,我们看到了这个程序的系统调用图(这里打印被叫做write)。

这个图告诉了我们什么呢?首先,在任何情况下,这个程序的第一个系统调用一定是open。第二个系统调用是read或者write,这要根据执行if语句的那个分支来决定。如果第二个系统调用是write,那么就意味着文件无法打开,然后下一个系统调用必须是exit。如果第二个系统调用是read,那么可能还有额外任意多次的read调用,并且最后调用close、write和exit。在没有入侵的情况下,其他序列是不可能的。如果这个程序被囚禁,那么狱卒程序可以看到所有的系统调用并很容易地验证某个序列是不是有效的。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
现在假设某人发现了这个程序的一个bug,然后成功地引起了缓冲区溢出,插入并执行了恶意代码。当恶意代码运行的时候,极大的可能是会执行一个不同的系统调用序列。例如,恶意代码可能尝试打开某个它想要复制的文件或者可能和家里的电话建立网络连接。当第一次出现系统调用不符合原来的模式时,狱卒十分肯定地认定出现了攻击并会采取行动,比如结束这个进程并向系统管理员报警。这样,入侵检测系统就能够在攻击发生的时候检查到它们。静态系统调用分析只是很多IDS工作方法中的一种。
当使用这种基于静态模型的入侵检测的时候,狱卒必须知道这个模型(比如系统调用图)。最直接的方式就是让编译器产生它并让程序的作者签名同时附上它的证书。这样的话,任何预先修改可执行程序的企图都会被在程序运行的时候检测到,因为实际的行为和被签过名的预期行为不一致。
很不幸的是,一个聪明的攻击者可能发动一种叫做模仿攻击(mimicry attack)的攻击,在这种攻击中插入的代码会有和该程序同样的系统调用序列(Wagner和Soto,2002),所以我们需要更复杂的模型,不能仅仅依靠跟踪系统调用。然而,作为深层防御的一部分,IDS还是扮演着重要的角色。
无论如何,基于模型的IDS不仅仅是以一种。许多IDS利用了一个叫做蜜罐(honeypot)的概念,这是一个吸引和捕捉攻击者和恶意软件的陷阱。通常蜜罐会是一个孤立的机器,几乎没有防御,表面看起来令人感兴趣并且有些有价值的内容,像一个成熟等待采摘的果实一样。设置蜜罐的人会小心翼翼地监视它上面的任何攻击并尽量去了解攻击的特征。一些IDS会把蜜罐放在虚拟机上防止对下层实际系统的破坏。所以很自然地,恶意软件也会像之前提到的努力地检查自己是否运行在一个虚拟机上。