论文阅读-A|论文阅读-A Sense of Self for Unix Process

前言 本篇论文是一篇早期的针对主机入侵检测的论文,其中一些思想具有开创性。
入侵检测的目标 作者认为基于先验知识的入侵检测是不完备的,一个好的入侵检测系统更应当和生物的免疫系统相近,即要满足以下三点目标

  • 检测系统应当是分布式的且每个检测系统应当具有特例性。生物的身体每个部分的功能不同,其对于异常的判定也不尽相同,在计算机系统中,我们不应当用一个统一的标准去做用于所有的进程,而是更应当根据每个进程本身的运行特性去制定一个相应的检测规则。
  • 检测系统是基于概率的,并且是实时的在线的。实时性应当是入侵检测系统中最重要的一环。
  • 就像生物的免疫系统一样,识别出的入侵行为,不应当仅局限于之前见到过的(即不应当完全是基于先验知识的)而是要对新出现的异常行为也能够做出反应。
如何刻画进程行为? 想要做到上述的目标,首先我们要转变思路,即从如何定义异常转化为如何定义正常。在此之前我们首先要解决的,是如何刻画一个进程的行为。我们知道进程的行为及其复杂,我们不可能考虑所有的行为。因此我们关注的是其中一些比较重要的操作,操作系统分为内核态和用户态,执行特权指令(系统调用)会陷入内核态。我们认为在用户态下的操作是相对安全的,因此重点关注于一个进程的系统调用序列。与多数使用数据挖掘方法寻找一个重复出现的pattern相比,作者采用了另一种方法,即观察到在一个局部范围内,这些系统调用出现的次序通常是相对固定的。
于是作者根据正在运行的进程中短时间的系统调用序列来定义正常行为,比如设定这些序列的长度为6。然后利用这些长度为6的系统调用序列构建该进程的正常行为数据库,之后该数据库即可用于监视该进程的后续行为。正常的系统调用序列构成的数据库指明了该进程的正常行为模式,异常序列指示正在运行的进程中存在异常。
  • 构建进程正常行为数据库
    假设给我们一个正常的的系统调用序列,其长度L,我们可以采用滑动窗口的方法生成局部的系统调用序列,假设我们的窗口尺寸为K+1,那我们每次可以提取窗口最左端的系统调用,以及紧随其后的1K个系统调用作为一个局部系统调用序列,然后将窗口向右移动一个位置来获取下一个局部系统调用序列。
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
【论文阅读-A|论文阅读-A Sense of Self for Unix Process】通过对比正常行为特征的数据库,我们可以发现上图表格有4处系统调用在与相应位置的正常行为产生偏差,我们记录这个数量为4,同时我们又可以通过数学方法计算出最多有

种可能的不匹配序列,这里L表示用于检测的整个序列长度。
K=3以及L=8时,共存在18种不正常的局部系统调用序列,则我们可以计算出共有该长度为L=8的系统序列的种异常比例为4/18=22%,我们可以定义一个阀值来判定是否产生了异常。

    推荐阅读