- A+
摘要
针对二进制程序漏洞检测误报率高、路径覆盖率低等问题,本文提出了一个基于机器学习的动静结合的二
进制漏洞检测方法,借助动态二进制插桩工具 Pin 获取程序的静态特征和动态特征,通过程序切片和训练好的词向量模型转换成模型的输入向量,再结合机器学习算法检测二进制程序是否有内存泄漏、内存溢出或内存访问越界的漏洞,并定位到出现漏洞的位置。实验证明,该方法能够有效的对二进制程序进行漏洞检测和定位。与现有的二进制漏洞检测技术相比,该方法检测准确率高、漏洞定位准确且自动化程度较高。
贡献
提出了一种基于机器学习的二进制代码漏洞检测方案,引入动静结合的思想,同时提取二进制程序的静态特征和动态特征,构建面向二进制程序的漏洞自动检测模型。
方法设计
数据集:Juliet Test Suite
本文选用 Pin 作为提取二进制程序动态特征和静态特征的工具,首先获取程序的特征日志文件,经过预处理,切片生成数据集,通过分词转换成词向量,输入到模型中进行训练
整体架构
特征提取
静态特征
指的是可以反应程序语义和语法信息的特征。例如指令的操作码和操作数、是否为转移指令、是否为分支指令等。
动态特征
为程序运行时的行为状态信息。例如指令操作数大小、寄存器值等。
切片及标签
一个 RTN 包含多条指令,少则几十条,多则上万条。需要采用切片的方法,将长度不等的 RTN 切分成长度相等的代码片段,代码片段构成样本集。
Pin
插桩二进制程序可以得到指令的地址,利用 Addr2line
工具从指令地址中获取到指令所对应源码所处的文件名、函数名及代码文件中的行号。数据集中的 manifest.xml 文件记录了缺陷样例的文件名、漏洞类型和导致漏洞的行号,以此可以判断该指令是否在漏洞附近,并标注为有/无漏洞(1/0)。
对于本身无漏洞的函数,切片片段标签为“0”;对于存在漏洞的函数,切片后若片段中指令所对应的源码与漏洞位置在 5 行范围内,则该片段的标签为“1”,否则为“0”。
检测模型
第一行为函数名、SECTION 名、IMAGE 名。IMAGE 为函数所在的代码文件。为减少无效数据干扰,本文通过判断 IMAGE 字段是否为代码文件名来删除不匹配的样例文件中的函数,并将 SECTION 中非.text,即非代码段的函数删除。
得到日志后,通过 addr2line 获得每条指令的地址,由此生成一个新日志。
实验结果
本文通过两步来检验漏洞定位的准确性:
(1) 预测的漏洞位置是否包含了真实漏洞位置
该表统计了三种漏洞类型的测试集中漏洞定位结果不包含真实漏洞位置的比率。可以看到每种类型都是超过 99%的预测结果包含了真实漏洞的位置。
(2) 预测的漏洞位置范围和真实漏洞位置的距离
下图表示的是预测的漏洞位置和真实漏洞位置的距离统计,距离以行为单位,可以看到和真实漏洞位置的距离不超过 10 行的占整个测试集的 90% 左右,预测结果比较精确。
结论
本文提出了一种基于机器学习的二进制漏洞检测方法,利用动态二进制插桩工具 Pin 提取程序的静态特征和动态特征,通过本文提出的切片以及向量化方法得到训练模型的数据集,训练漏洞检测模型。实验结果表明,本文提出的方法在漏洞检测和定位上都取得了较好的效果,由于实验中的数据集是基于真实的项目,所以该方法在网络安全实际应用中也适用。