前言
本篇论文是一篇早期的针对主机入侵检测的论文,其中一些思想具有开创性。
入侵检测的目标
作者认为基于先验知识的入侵检测是不完备的,一个好的入侵检测系统更应当和生物的免疫系统相近,即要满足以下三点目标
- 检测系统应当是分布式的且每个检测系统应当具有特例性。生物的身体每个部分的功能不同,其对于异常的判定也不尽相同,在计算机系统中,我们不应当用一个统一的标准去做用于所有的进程,而是更应当根据每个进程本身的运行特性去制定一个相应的检测规则。
- 检测系统是基于概率的,并且是实时的在线的。实时性应当是入侵检测系统中最重要的一环。
- 就像生物的免疫系统一样,识别出的入侵行为,不应当仅局限于之前见到过的(即不应当完全是基于先验知识的)而是要对新出现的异常行为也能够做出反应。
如何刻画进程行为?
想要做到上述的目标,首先我们要转变思路,即从如何定义异常转化为如何定义正常。在此之前我们首先要解决的,是如何刻画一个进程的行为。我们知道进程的行为及其复杂,我们不可能考虑所有的行为。因此我们关注的是其中一些比较重要的操作,操作系统分为内核态和用户态,执行特权指令(系统调用)会陷入内核态。我们认为在用户态下的操作是相对安全的,因此重点关注于一个进程的系统调用序列。与多数使用数据挖掘方法寻找一个重复出现的pattern
相比,作者采用了另一种方法,即观察到在一个局部范围内,这些系统调用出现的次序通常是相对固定的。
于是作者根据正在运行的进程中短时间的系统调用序列来定义正常行为,比如设定这些序列的长度为6
。然后利用这些长度为6
的系统调用序列构建该进程的正常行为数据库,之后该数据库即可用于监视该进程的后续行为。正常的系统调用序列构成的数据库指明了该进程的正常行为模式,异常序列指示正在运行的进程中存在异常。
- 构建进程正常行为数据库
假设给我们一个正常的的系统调用序列,其长度L
,我们可以采用滑动窗口的方法生成局部的系统调用序列,假设我们的窗口尺寸为K+1
,那我们每次可以提取窗口最左端的系统调用,以及紧随其后的1
到K
个系统调用作为一个局部系统调用序列,然后将窗口向右移动一个位置来获取下一个局部系统调用序列。
Example:
整个序列长度为L=8
,K=3
如下
[open, read, mmap, mmap, open, getrlimit, mmap, close]
则我们可以生成如下的局部系统调用序列call
表示首个系统调用,position1
表示跟随其后第一个位置上的系统调用,以此类推直到position3
call |
position1 |
position2 |
position3 |
---|---|---|---|
open |
read |
mmap |
mmap |
getrlimit |
mmap |
close |
|
read |
mmap |
mmap |
open |
mmap |
mmap |
open |
getrlimit |
open |
getrlimit |
mmap |
|
open |
getrlimit |
mmap |
|
close |
|||
getrlimit |
mmap |
close |
|
close |
现在假设我们用以上的局部系统调用构建好了反应进程正常行为的特征库,现在进程生成了长度为
L=8
的另一串系统调用序列
[open, read, mmap, open, open, getrlimit, mmap, close]
我们可以用如上相同的滑动窗口方法生成以下局部子序列
call |
position1 |
position2 |
position3 |
---|---|---|---|
open |
read |
mmap |
*open
|
*open
|
*getrlimit
|
mmap |
|
read |
mmap |
*open
|
open |
mmap |
open |
open |
getrlimit |
close |
|||
getrlimit |
mmap |
close |
|
close |
通过对比正常行为特征的数据库,我们可以发现上图表格有
4
处系统调用在与相应位置的正常行为产生偏差,我们记录这个数量为4
,同时我们又可以通过数学方法计算出最多有
种可能的不匹配序列,这里L
表示用于检测的整个序列长度。
当K=3
以及L=8
时,共存在18
种不正常的局部系统调用序列,则我们可以计算出共有该长度为L=8
的系统序列的种异常比例为4/18=22%
,我们可以定义一个阀值来判定是否产生了异常。