使用二维二进制程序特征的基于深度神经网络的恶意软件检测
作者是Saxe J,Berlin K
2015 年发表在10th International Conference on Malicious and Unwanted Software, MALWARE 2015
主要内容:
恶意软件对公司、政府机构和个人来说仍然是一个严重的问题,机器学习有希望自动化检测新发现的恶意软件族,并可能学习关于恶意软件和良性软件的一般化,以支持检测全新的、未知的恶意软件族。
本文对基于深度神经网络的恶意软件检测系统进行了详细的描述。具体地说,我们的系统实现了95%的检出率和0.1%的假阳性率(FPR),基于直接来自客户和内部恶意软件数据库的超过400,000个软件二进制文件。(我们通过直接学习所有二进制文件来实现这些结果,而不需要任何过滤、解压缩或手动将二进制文件分类)
设计实现
特征提取(feature extraction)(input vector)
从静态良性和恶意二进制文件中提取四种不同类型的互补特征
1.字节/熵直方图
对文件的字节分布进行建模。在输入的二进制文件上,滑动一个1024字节的窗口,步长为256字节。
计算每个1024字节窗口的熵,
对窗口的每个字节,存储一个元组(byte,entropy)(1024对)
熵轴,[0,8]范围内有16个大小均匀的存储单元
字节轴,[0,255]范围内有16个大小均匀的存储单元
为了得到特征向量,将矩阵每个行向量连接成一个256维的向量
2.PE import feature
特征2来自于输入二进制文件的导入地址表(import address table)
1.将一个256个整数的数组初始化为0
2.从二进制程序中提取导入地址表
3.将DLL名称,导入函数(import function)的每个元组散列到【0,255】范围内
4.给特征数组增加计数器
3.PE(可移植可执行文件) metadata feature
来自:从目标二进制文件的可移植可执行文件包中提取的数值字段
使用python “perfile”解析库从二进制文件中提取数值可移植可执行字段。每个字段都有一个文本名称,与import table相似,聚合为256个长度的数组。
?4.String feature
文中没有详细的描述
特征的汇总
将上述4个256为数组聚合为一个1024为特征向量
深度神经网络
深度神经网络分类器,四层。一输入层,两隐藏层,一输出层。
分数校准器 (NN输出值的转化)
神经网络的输出层输出S[0,1](分类器给出的分数)
0:100%好软件 ;1:100%恶意软件
现在将神经网络的输出S转换为一个分数,该分数为文件是恶意软件的近似概率,评分s,类别C={m,b},即 求P(C=m|S=s)
现在需要获得p(s|m)和p(s|b),这里用非参数法(如:kernel density estimator 取邻域的加权平均值来近似给定C(类别)的pdf值)。本文用KDE和Epanechnikov kernel获得pdf(概率密度函数)
实验评估
1.看图ABCDE得出结论:将所有的特征结合使用产生了最好的结果,平均95.2%的训练中未发现的恶意二进制文件以0.1%的假阳性率被检测出来,roc(AUC)下的面积为0.99964。
2.实验F是拿2014年8月前的软件训练神经网络,拿2014年8月之后的软件进行测试,由图可知分类效果较差。
看图AF得出结论:我们的系统在此测试F中的性能明显较差。分类器应经常使用新数据进行更新,以保持分类的准确性。 然而,对于神经网络分类器而言,这可以快速且廉价地完成。
结论评价
本文贡献:
1.特征提取方法:深度神经网络的分层方法以及我们的二维直方图特征提供了二进制类型的隐式分类,使我们能够直接训练所有二进制文件,而无需基于内部特征(如打包程序类型等)将它们分开。
我们已经表明,我们的方法需要适度的计算才能执行特征提取,并且可以在适度的时间范围内在单个GPU上的语料库上实现良好的准确性。
2.基于贝叶斯模型的分数校准