发明内容
为了解决上述问题,本发明的目的在于,提供一种提取底层***行为特征的监控方法及***,能够更精确地捕捉操作***的底层***行为特征,对***当前的活动状态进行监控。
为实现上述目的,本发明提出的提取底层***行为特征的操作***监控方法,包括:步骤1,采集操作***中资源分配事件以及异常处理事件的内核函数的参数及返回值,将所述参数及返回值从***内核传递到用户态下,并记录到存储文件上;步骤2,用户态下将所述参数及返回值构造为特征值,将所述特征值记录到训练数据集,其中所述特征值反应***的活动状态;步骤3,获取操作***当前的特征值,基于已经大量记录的所述训练数据集来判断操作***当前的活动状态。
本发明的提取底层***行为特征的操作***监控方法,其中,所述资源分配事件的内核函数包括slab allocator内存分配函数、kfree释放内存空间函数和/或kmem_cache_alloc分配空闲对象函数;所述异常处理事件的内核函数包括do_page_falut缺页异常处理函数。
本发明的提取底层***行为特征的操作***监控方法,其中,上述步骤1包括:步骤11,操作***初始化时在操作***内核中创建relayfs文件***通道;步骤12,修改现有的Ftrace函数中对函数调用的监控机制;步骤13,在所述relayfs文件***通道中添加用于记录内核函数的堆栈信息的函数,并在所述内核函数中的出口部分添加用于记录所述内核函数的参数及返回值的函数。
本发明的提取底层***行为特征的操作***监控方法,其中,上述步骤1还包括:步骤14,对于每一个内核函数都分配一个唯一的ID号,用ID号来区分内核函数。
本发明的提取底层***行为特征的操作***监控方法,其中,在用户态下从relayfs文件***通道中定期读取所记录的内核函数的参数及返回值,记录到存储文件上。
本发明的提取底层***行为特征的操作***监控方法,其中,在上述步骤2中,将所述磁盘文件上记录的所述参数及返回值构造为特征值构造为具有如下格式的特征值,
(Si,F1(i,1),F1(i,2),...,F2(i,1),F2(i,2),...,R1(i),...,Rj(i)) (1)
其中,Si表示为内核函数ID,Rj(i)表示为第j次调用该函数时函数的返回值,Fj(i)表示为第j次调用该函数时函数的第i个参数值,为所有内核函数分配指定的ID。
本发明的提取底层***行为特征的操作***监控方法,其中,采用机器学习分类算法分析所述特征值,并记录到训练数据集。
本发明的提取底层***行为特征的操作***监控方法,其中,在上述步骤3中,以一段时间内获取的内核函数的参数和返回值作为***当前活动状态特征值。
另外,本发明还提出一种采用上述任一种方法提取底层***行为特征的操作***监控装置。
本发明的效果在于:本发明并不监控内核所有函数,而是监控内核中主要的资源分配事件以及异常处理事件的函数的参数以及返回值,能够降低监控***的工作量,利用较低的***开销提取足够多底层***特征,并采用形式化方法对获取的***特征进行解析,采用机器学习分类方法训练特征数据集,从而能够利用***过去的监控信息发现和解决***当前可能会出现的问题。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图对本发明的提取底层***行为特征的操作***监控方法及装置进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
一般来说,操作***内核主要分为进程管理,内存管理,虚拟文件***以及网络管理等等对上层应用提供***资源。在本发明中,通过对其中主要关键函数的参数和返回值进行监控并提取出固定模式下***的行为特征。与文献1不同的是本发明的监控方法并不监控内核所有的函数,而是监控内核中主要的资源分配事件以及异常处理事件的函数的参数以及返回值。对于参数和返回值,具有目前***中大量的活动信息。而本发明将此方法应用监控***的行为特征,因为***的行为特征也包括对内存资源的管理,对文件***的管理以及进程管理等。而其中所调用的内核函数的参数也富含了很多信息。比如监控内存管理部分,跟踪slab allocator内存分配函数的分配情况。包括kfree释放内存空间函数,kmem_cache_alloc分配空闲对象函数等内核函数的调用参数中拥有请求分配内存大小以申请向哪个区域的内存,最后可以根据tracer跟踪软件收集到的信息统计分析内部碎片情况,找出内存分配最频繁的代码片断,等等。也可根据内存分配机制(slab机制)中传递的参数得到内核近期分配使用频繁的结构体。对于异常事件的监控主要在于对do_page_falut缺页异常处理函数的监控,但函数的返回信息包含了对一些异常事件做出的决策,如用户层出现段错误,用户进程出现写时复制(copy)等。
本发明需要修改内核代码,监控指定函数调用信息以及在操作***初始化时创建relayfs通道用于监控信息的传递。最后在用户空间启动一个守护进程定期从relayfs读取所记录函数调用的详细信息,记录到磁盘文件上。对磁盘文件上的记录信息构造特征值,用于最后的机器学习分类的训练数据集。
relayfs是一个快速的转发(relay)数据的文件***,它以其功能而得名。它为那些需要从内核空间转发大量数据到用户空间的工具和应用提供了快速有效的转发机制。运用此转发工具来传输内核层函数监控得到的必要信息到用户层,供用户层进行分析。
下面给出本发明的具体实施例,结合附图对本发明做详细描述。
如图1所示,本发明的提取底层***行为特征的监控方法,包括:
步骤1,采集操作***中资源分配事件以及异常处理事件的内核函数的参数及返回值,将所述参数及返回值从***内核传递到用户态下,并记录到磁盘文件上;
步骤2,用户态下将所述参数及返回值构造为特征值,将所述特征值记录到训练数据集,其中所述特征值反应***的活动状态;
步骤3,获取操作***当前的特征值,基于已经大量记录的所述训练数据集来判断操作***当前的活动状态。
其中,在步骤1中,将所述参数及返回值从***内核传递到用户态下时,需要修改内核代码(以linux***为例),其具体包括:
步骤11,创建relayfs通道,用于内核态监控函数调用信息传递到用户态下。选择的创建位置在init/main.c函数下,do_basic_setup初始化函数中使用开启快速转发函数relay_open创建一个通道。用户空间的应用程序通过使用映射函数mmap()进行映射所创建的通道文件使其数据在用户空间下可用。
步骤12,修改现有的Ftrace中,对函数调用的监控机制主要在所有内核函数的开始部分加入一段stub存根代码,Ftrace重载这段代码来实现追踪(trace)功能。内核编译是会调用一个perl脚本:recordmcount.pl将每个函数的地址写入一个特殊的段:_mcount_loc.在内核初始化的初期,Ftrace查询__mcount_loc段,得到每个函数的入口地址,并将mcount替换为空指令(nop指令)。这样在默认情况下,Ftrace不会对内核性能产生影响。当用户打开Ftrace功能时,使Ftrace将这些nop指令动态替换为ftrace_caller,用于将调用用户注册的trace函数。本发明需要修改perl脚本将指定监控内核函数名写入段__mcount_loc段中,在内核函数入口地址和出口地址处都添加mcount。
步骤13,如图3所示为本发明实施例的监控内核输入函数参数以及函数返回值的示意图,该图中示出了所添加代码的位置,本发明添加自定义函数即开始存根函数stub_start记录内核函数的堆栈信息(即函数调用参数信息),在所监控的内核函数中的出口部分添加自定义函数即结束存根函数stub_end记录内核函数的返回值,且能够直接通过默认的使用栈规则的寄存器%eax中取得上述返回值,对于没有返回值的情况就使用0来表示,其中,上述内核函数的堆栈信息(即函数调用参数信息)是通过步骤12中所添加的入口的mcount重定向到函数stub_start的,上述函数返回值是通过步骤12中所添加的出口的mcount重定向到stub_end的(如图3中实线所示),最后将上述stub_start函数中记录的内核函数的堆栈信息(即函数调用参数信息)以及上述stub_end函数中记录的内核函数的返回值传送至步骤11所创建的relayfs通道(如图3中虚线所示)。
步骤14,对与所监控的内核函数都分配一个唯一的ID号,通过ID号来区分内核函数。
然后是需要通过按照上述的ID序列号构建步骤2所述的***活动特征值用于机器学习中训练特征,其中具体构造特征值的方法如下:
将磁盘文件上记录的内核函数参数及返回值构造为特征值构造为具有如下格式的特征值,
(Si,F1(i,1),F1(i,2),...,F2(i,1),F2(i,2),...,R1(i),...,Rj(i)) (1)
Si表示为内核函数ID(为每个内核函数指定一个唯一ID),Rj(i)表示为第j次调用该函数时函数的返回值,Fj(i)表示为第j次调用函数的第i个参数值。所有被监控的函数为其分配指定的ID,最后按照指定ID序列作为特征。
对于步骤1中的内核函数参数及返回值的采集,可以在用户空间启动守护进程来定期读取从relayfs文件***记录函数调用详细信息,记录到磁盘文件上。
上述步骤3涉及操作***当前活动状态的分析,具体包括:
步骤31,以一段时间T(比如T为30min或者60min)内的内核函数的参数和返回值作为当前***活动状态的特征值,构造特征值的方法以在上述内容中进行说明。
步骤32,自动分析***行为使用传统的统计技术比如聚类,机器学习或者基于搜索已标签的特征签名相似度比较,使用上一步中形式化为特征值格式的数据作为输入的数据。最后基于已经大量记录的实验训练数据集,通过采集当前活动状态特征值来判断当前***处于什么状态。
本发明实施例的提取底层***行为特征的操作***监控方法的总体设计框图如图2所示。具体为,步骤10,启动函数调用的开关,开始收集内核函数调用信息,可按上述步骤11-步骤13的方法创建relayfs文件***通道,将内核函数的参数及返回值从***内核传递到用户态下,并在用户态下启动守护进程定期收集来自relayfs文件***的信息;步骤20,对收集到的数据进行格式化定义,具体定义方法可以采用上述式(1)的方法;步骤30,使用机器学习分类算法分析所述特征值,并记录到训练数据集,获取操作***当前的特征值,基于已经大量记录的所述训练数据集来判断操作***当前的活动状态。
另外,本发明还提出一种采用上述提取底层***行为特征的操作***监控方法提取底层***行为特征的操作***监控装置1,其构成如图4所示,具体包括:信息提取模块11,用于采集操作***中资源分配事件以及异常处理事件的内核函数的参数及返回值,将所述参数及返回值从***内核传递到用户态下,并记录到磁盘文件上;格式化模块12,用于用户态下将所述参数及返回值构造为特征值,将所述特征值记录到训练数据集,其中所述特征值反应***的活动状态;状态分析模块13,用于获取操作***当前的特征值,基于已经大量记录的所述训练数据集来判断操作***当前的活动状态。