3 检测引擎
该引擎采用BP神经网络来解决分类问题,BP网络在解决分类问题时具有以下优势:
——数学理论已证明它具有实现任何复杂非线性映射的功能,这使得它特别适合于求解内部机制复杂的问题;
——网络能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力;
——网络具有一定的推广、泛化能力
因此在检测shellcode时,训练完成后的网络需要更少的CPU时间并具有较低的误报率,使得可以应用于高速网络上的NIDS,同时它的自学习能力使其具有一定的智能性。
3.1 简介
检测引擎一般用于NIDS系统中,主要对系统提供的数据流进行检测,以确定是否包含shellcode等恶意代码,若检测成功则发出报警,NIDS系统做出相应的防御措施。检测引擎主要包括两个部分:
——预处理器,用于对提供的数据流进行初级检测和预处理,包括对jmp esp指令地址的检测和对NOP字段的检测,同时为下一个处理器提供输入数据。
——神经网络处理器,对预处理器提供的数据进行计算,当输出节点输出值大于阈值(当前为0.4)时认为是检测到shellcode,并向NIDS发出报警。
3.2 预处理器
预处理器包括三个函数,esp_detect(),nop_detect() ,create_input()。esp_detect()函数用于检测数据流中是否包含jmp esp指令的地址。nop_detect()函数用于检测数据流中是否含有NOP段。create_input(data)函数用于计算特定符号集在数据流data中的特征值,结果为一个大小为75的浮点数数组。计算公式为(count(instruction)/size(data))*(FACTOR),其中count(instruction)为特定符号在数据流中出现的次数;size(data)为数据流的大小;FACTOR为影响因子,它表示特定符号在shellcode中的重要程度,是一个可调节的参数。
3.3 神经网络结构
网络结构为多层前馈神经网络,包括一个输入层,一个隐含层和一个输出层。有75个输入节点,40个隐层节点,1个输出节点,训练过程使用Levenberg-Marquartdt算法[9],结构如下图3示:
 
图3 神经网络结构
网络的输入项为create_input(data)计算得到的symbol[75]符号数组中每个符号在数据流中的特征值,这些符号主要有两个来源:
——变形算法经常使用的一些指令(当前为25个)可以通过分析常见的变形算法得到,
——所有shellcode样本中出现频率最高的(不包括前面的指令)前50个指令,通过分析shellcode样本得到。
3.4 网络训练与测试结果
获得shellcode和一些网络上经常传输的文件类型,然后生成样本并对网络进行训练,达到一定精度后停止,用测试样本来检测网络的泛化性能。
3.4.1 生成样本:
样本分为两类,正样本P和负样本N。
首先从shellcode生成器中生成编码后的shellcode,一共有8种不同的编码函数。样本生成函数code2data()读取所有shellcode代码,统计并分析代码中出现频率较高的前50个(不包括变形算法使用的)符号,再加上25个变形算法使用的符号,生成一个大小为75的符号数组symbol[75]。
正样本P来自于上述生成的shellcode。对每一个shellcode的代码create_input(data)函数计算符号数组symbol中的每个符号在shellcode中的特征,这样每个shellcode代码就被量化成大小为75的特征数组和一个值为1的教师信号,形如[x1,x2,x3,x4…..,x75] > 1,这就形成了正样本P,大小为2000。
负样本N来自于一些在网络中大量传输的文件类型和类似于shellcode的文件类型,主要有.jpeg .txt .html .dll .lib .nls .exe等。先用预处理器中的esp_detect()和nop_detect()处理上述文件,这样可以检测出假阳性样本。再用create_input(data)函数计算符号数组中的每个符号在这些假阳性样本中的特征值,再加上一个值为0 的教师信号。例如一个txt文本可以表示成如下形式:[x1,x2,x3,x4…..,x75] > 0,这样经过处理后生成了负样本N,大小为1000。
神经网络的泛化能力与样本之间有密切的联系,为了提高泛化能力,它需要有足够多和代表性强的样本。同时为防止所建立的网络模型发生“过拟合”现象,须将正样本集P分成训练集T、测试集Q、验证集V 三个部分大小分别为1200,400,400,数据分组时应尽可能考,虑样本模式间的平衡,同时在训练集T中加入大小为700的负样本,用以降低误报率,剩余的300负样本作为误报验证样本V_mis。
3.4.2 网络性能测试:
用训练集T以批处理方式训练网络,学习率为0.7,动量因子为0.6,当误差小于0.01停止,使用测试集Q和验证集V来测试网络。
测试样本集Q中包含8种不同编码的shellcode,使用样本集Q检测训练后的网络,检测结果如下表2示,可以看出网络具有较强的泛化能力。
编码样本 |
检测精度 |
Pex |
100% |
PexFnstenvSub |
100% |
PexAlphaNum |
98% |
PexFnstenvMov |
98% |
CountDown |
85% |
JmpCallAdditive |
90% |
Alpha2 |
97% |
ShikataGaNai |
97% |
表2 泛化能力测试
验证样本为包含正样本的V和包含负样本的V_mis,两次验证网络的检测效果,结果如表3示,网络的漏报率为5.5%,误报率为11.3%。由此可以看出可能由于负样本的代表性不够降低了对负样本的检测效果。
验证样本大小 |
检测结果 |
V(400) |
378 |
V_mis(300) |
266 |
表3 误报率和漏报率测试
分析不同的网络参数如隐层数对检测精度和检测时间的影响。
考察隐层节点对检测精度的影响,当隐层数从30到36再到40,达到同样的误差精度需要的训练代数越少,误差下降的速度也是越来越快。但是当隐层单元数超过40后再增大效果并没有明显的提高,因此选择隐层数为40.
 
图4 隐层单元数和误差下降关系
4 总结
随着越来越多的NIDS和网络防护软件的部署,为了避免攻击被检测出来,变形shellcode 会越来越流行,对变形Shellcode的成功检测与否将成为评价“好”IDS 的一项重要指标。该引擎的核心机制是神经网络引擎,通过上述测试得到的L和H的值,使得训练后的网络具有很高的检测性能,另外该引擎对新变形算法具有很好的适应性而不需要知道新算法的具体信息因而也具有了较高的泛化性能。
网络的输入为符号数组symbol[75]中符号在数据流中的特征值,符号数组的选择至关重要,它决定了网络的泛化性能。为了使得该引擎更加的通用,需要分析大量的变形引擎,并加入更多的常用指令到符号数组中。
参考文献
【1】AlephOne.Smashing the stack for fun and profit. http://www.phrack.com, 1996.PhrackMagazine 49(14).
【2】CLETteam: Polymorphic shellcode engine. Phrack Magazine 61(9) (2003)
【3】Metasploitproject. http://www.metasploit.com retrieved on 15.5.2008.
【4】Payer, U., Teufl, P.,Lamberger, M.: Hybrid Engine for Polymorphic Shellcode
Detection. accepted at DIMVA (2005)
【5】蒋卫华,伟华,杜君.缓冲区溢出攻击:原理﹑防御及检测[J].计算机工程,2003,29(10): 5-7.
【6】陈悦, 薛质, 王轶骏. 针对Shellcode变形规避的NIDS检测技术[J].信息安全与通信保密 , 2007,(01)
2/2 首页 上一页 1 2 |