一种跨架构的二进制程序漏洞函数关联方法与流程

文档序号:11177040阅读:302来源:国知局
本发明涉及二进制程序漏洞挖掘与逆向分析领域,具体涉及一种跨架构的二进制程序漏洞函数关联方法,属计算机程序检测
技术领域
:。
背景技术
::随着全球信息技术的高速发展和信息化系统、信息化产品的迅速普及,计算机软件已经成为世界经济、科技、军事和社会发展的重要组成。实践表明,绝大部分的信息安全事件都是攻击者借助软件漏洞发起。因此,安全漏洞是直接影响信息安全系统的决定性因素,有必要对软件漏洞进行分析与利用。漏洞分析按被分析的对象可分为源码级与二进制级。源码级的漏洞分析技术是直接对用高级语言编写的程序进行分析。分析者可以利用源代码中丰富完整的语义信息,通过一系列漏洞分析技术,发现程序中的编码错误以及设计缺陷。但在实际应用中大量商业软件均以二进制代码形式存在,源代码却难以获取。因此,二进制程序漏洞分析逐渐成为了信息安全领域的一个重要分支。函数关联技术主要基于二进制代码相似性检测。早期的应用场景是计算针对同架构编译的两个二进制文件的相似度来进行函数关联,由于是针对同架构进行编译,反汇编后得到的汇编程序是同一个指令集的,因此可以将汇编程序看成是字符串,直接进行相似性分析和处理。2013年,arunlakhotia提出了一种语义模板的方法用于相似代码片段的快速定位。2014年,yanivdavid采用字符编译距离来计算基本块的相似程度。然而,研究人员发现,如果编译二进制文件时采用的编译优化选项不同,那么即使是同一段源码反汇编得到的汇编程序也存在很大差异,这就意味着对汇编程序表现形式依赖较强的方法对编译优化选项敏感,所以研究人员将研究点转向了对汇编程序表现形式依赖较低的语义信息,开始提取程序片段的语义信息作为特征。2014年,jannikpewny提出了一种基于语义签名的漏洞关联算法,将基本块内指令转化为表达式,并存储为树结构,采用树编译距离计算相似度,并实现了原型tedem。同年,manuelegele提出了一种基于动态插装技术的二进制代码相似性检测方法,主要是模拟函数动态运行环境作为函数的特征来进行代码检索,它通过从函数入口基本块开始沿某执行路线再次执行来保证每个基本块至少被执行一次,并实现了原型blex。后来,越来越多的iot厂家将第三方代码库编译并部署在不同的cpu平台上,这就意味着能够在针对任意架构编译的二进制文件中搜索漏洞函数的需求将会越来越大。已有的函数关联技术或由于方法局限(例如基于检测汇编程序字符串相似程度的函数关联技术)、或由于工具局限(例如动态插装工具pin只面对x86平台)并不能直接应用到跨架构的场景中来。2015年jannikpewny在s&p上发表了cross-architecturebugsearchinbinaryexecutables。该论文首次提出了跨架构这个应用场景,采用提升中间语言表示、数值采样和最小哈希等方法实现了跨架构的(x86,arm,mips)基本块语义信息提取。但该方法的准确率并不理想,使用该方法用来比较分别针对arm架构和mips架构的openssl固件的函数相似程度时rank1刚达到32.4%。因此有必要对跨架构的漏洞关联技术进行研究,提出一种准确率较高的关联方法。目前,缺少一种实现简单的,准确率高的,跨架构的二进制程序漏洞关联技术。技术实现要素:本发明目的在于提供一种跨架构的二进制程序漏洞函数关联方法。本发明涉及的方法流程主要包括:对二进制文件进行逆向分析获得待测函数库,计算待测函数与漏洞函数的数值相似度;从函数调用图中截取待比较的两个函数的局部结构信息构成两个结构子图;将两个结构子图分层抽象为赋权二部图,采用二部图匹配算法计算赋权二部图最大权匹配,加权求和作为两个函数的整体相似度,并据此进行排序;基于roc曲线计算判定阈值,相似度大于判定阈值的函数被判定为疑似漏洞函数,进行下一步分析,反之判定为正常函数,不作处理。本发明的技术创新点在于计算相似度时重构函数控制流图算法和计算整体相似度时结构化匹配算法。本发明融合了函数的数值信息与结构信息,特征的提取不依赖特定的指令集,可以对不同架构下的二进制文件进行函数关联,结果准确率高,实现简单。为实现上述目的,本发明采用如下技术方案:一种跨架构的二进制程序漏洞函数关联方法,主要包含以下3个步骤:1)计算待测函数与漏洞函数的数值相似度。首先对二进制文件进行逆向分析获得待测函数库;提取待测函数间调用关系信息(即函数调用图)、函数内控制流图信息、函数基本属性信息三方面信息进行数值化处理,作为函数的特征向量;采用自编译的、多平台、带符号表的函数集作为训练样本,对集成分类器进行训练;计算待测函数与漏洞函数的各特征的相似度构成相似度向量,带入集成分类器中进行预测,得到数值相似度。2)构造赋权二部图,采用二部图算法计算整体相似度。从函数调用图中截取待比较的两个函数的局部结构信息构成两个结构子图,截取的层数可以根据实际需要来确定。将两个结构子图分层抽象为赋权二部图,其中节点集为两个结构子图对应层包含的函数,边集为任意两个函数的相似程度,边权为上一步计算得到数值相似度,然后采用二部图匹配算法分层计算赋权二部图的最大权匹配,加权求和作为待测函数与漏洞函数的整体相似度。3)根据基于roc曲线计算的判定阈值进行判定。获得待测函数集与漏洞函数的整体相似度向量绘制roc曲线,取y-x曲线的最高点对应的阈值作为判定阈值,相似度大于判定阈值的函数被判定为疑似漏洞函数,反之判定为正常函数。构成roc曲线的每个点为(x,y),那么(x,y-x)构成的曲线即为基于roc曲线的y-x曲线,其中x定义域为m。本发明可以获得以下有益效果:本发明在计算待测函数与漏洞函数的数值相似度时,主要考虑了调用关系特征、栈空间特征、字符串特征、代码规模特征、路径序列特征、路径基本特征,度序列特征、度基本特征,图规模特征等9个方面特征,较为完整的反映了一个函数的典型特征,特征的提取不依赖特定的指令集,因此本发明可以对针对两个不同架构编译的二进制文件进行漏洞关联。同时,在提取特征时,采用编写ida插件的方式从ida分析结果中进行提取,而ida本身对不同架构的二进制文件进行逆向分析构造函数控制流图时具有差异,本发明提出了函数控制流图重构算法,一定程度上还原了函数控制流图的真实结构,提高了函数特征提取的准确度。本发明在在融合函数的数值信息和结构信息时,采用了截取函数调用图,构造赋权二部图计算最大权匹配的方法。假设距离待检函数越近的函数节点对匹配的贡献越大,按距离待检函数的跳数对函数节点进行分层,使用kuhn-munkres算法对单层函数节点进行最小二分图匹配得到单层的相似度,最后将各层的相似度加权求和得到函数整体相似度。该方法在计算待匹配函数的整体相似度时,基于函数间的调用信息,考虑到了其他函数对的相似程度对待匹配函数对的影响。相比仅用数值的方法,更为客观和准确。本发明与现有的技术比,不依赖特定的指令集,可以对不同架构的二进制文件进行漏洞关联,实现简单,易于推广。附图说明图1为方案流程示意图;图2为ida对不同架构下的函数分析的cfg图差异较大示意图,其中(a)针对arm架构编译的busybox-1.20.0的mencap_main函数的cfg图,(b)针对mips架构编译的busybox-1.20.0的mencap_main函数的cfg图;图3为重构函数控制流图示意图;图4为结构子图分层示意图;图5为构造赋权二部图示意图;图6为基于roc曲线确定最佳阈值示意图。具体实施方式一种跨架构的二进制程序漏洞关联方法,具体实施方式如下:1)编写ida插件对二进制文件进行逆向分析,获得待测函数库以及函数基本属性、函数调用图和函数控制流图。2)计算待测函数与漏洞函数的数值相似度。整个过程包括数值特征提取,相似度计算和神经网络预测相似度三个步骤。在数值特征提取阶段,分别从函数基本属性、函数调用图和函数控制流图三个方面进行数值特征提取。主要提取待测函数的调用关系特征、字符串特征、栈空间特征、代码规模特征、路径序列特征、路径基本特征,度序列特征、度基本特征,图规模特征等九方面特征。这九方面特征较为完整地反映了一个函数的典型属性。分析函数调用图,计算每一待测函数被其他函数调用的次数、计算该函数调用其他函数的次数及去重后的次数,构成了调用关系特征。分析函数基本属性,计算栈空间,构成栈空间特征;计算跳转指令个数、指令个数,代码量,构成代码规模特征;计算调用的字符串数量和调用的字符串集合,构成字符串特征。在对函数控制流图进行分析之前,对不能直接采用ida分析的函数控制流图(cfg图)进行特征提取。在少数情况下,同一函数在不同架构下的cfg图会有很大不同,比如busybox的memcap_main函数,它在arm架构和mips架构下的cfg图有很大差别,如图2所示。这是由于,每种平台的cpu指令集都由对应的ida处理器模块负责处理。但各平台处理器模块生成cfg图的策略并不相同,例如busybox的rmdir_main函数,arm平台bl指令对基本块进行划分,而mips平台下的jal(同为函数调用指令)不对基本块进行划分。为了统一cfg图的的基本块划分规则,我们需要对cfg图进行重建,重构算法如下a)识别函数所有基本块的头尾地址和原始边端点地址。b)按基本块头地址升序顺序对所有基本块进行排序,统计每个基本块的入度和出度。c)按基本块头地址升序顺序对基本块从小到大进行扫描。如果第n个基本块的出度为0且第n+1个基本块入度为0,则合并这两个基本块为新的第n个基本块,删除原第n个和原第n+1个基本块,并对以原第n+1个基本块的头地址为端点地址的边进行重置,改为以第n个基本块的头地址作为端点地址;如果第n个基本块的出度为0且第n+1个基本块入度不为0,则添加一条由第n个基本块指向第n+1个基本块的边,其端点信息为第n个基本块的头地址和端点信息为第n个基本块的头地址。d)直至扫描到最后一个基本块,重构过程结束。用python实现的重构cfg图算法源码如下,其中输入参数bblist指所有基本块的头尾构成的列表,edgelist是ida分析的所有原始边的列表,startpoint是该函数入口地址,其中输出todic是重建cfg图所有边构成的字典,bbdic是重建cfg图后所有基本块构成的字典。对busybox的memcap_main函数重建效果如图3所示。分析函数控制流图,计算每个节点(即基本块)的出入度,构造cfg有向图邻接矩阵,将函数控制流图转化为无向图,计算每个节点的度,构造cfg无向图邻接矩阵。对cfg有向图邻接矩阵和cfg无向图邻接矩阵进行度分析。基于cfg有向图邻接矩阵计算入度升序序列、出度升序序列,基于cfg无向图邻接矩阵计算度升序序列,三者构成度序列特征。基于度升序序列,计算最大度、平均度和度的概率序列。基于度的概率序列计算图的熵,构造度基本特征;对cfg无向图邻接矩阵进行路径分析,通过floyd算法或dijkstra算法计算任意两个节点(即基本块)的最小距离,构造路径序列特征;计算图平均路径长度、图直径和图半径,构成路径基本特征。对cfg有向图邻接矩阵进行基本属性分析,计算节点数、边数、图的链路相率、图密度、图的聚类系数,构成cfg图规模特征。按以上步骤操作,总共提取函数的调用关系特征、字符串特征、栈空间特征、代码规模特征、路径序列特征、路径基本特征,度序列特征、度基本特征和图规模特征。在特征相似度计算阶段,基于特征的表现形式,采用数值型相似度计算方法、基于字符串编辑距离算法的序列相似度计算方法和基于jaccard相似度的集合相似度计算方法,计算待比较函数的每个特征的相似程度作为集成分类器的输入向量。在集成分类器预测整体相似度阶段,首先采用自编译的、多平台、带符号表的函数集作为训练样本,训练集成分类器。具体方法是:选择同一份源码,选择不同的编译器,不同的优化选项,针对不同的架构进行编译,获得多份二进制可执行文件。对每一份二进制可执行文件进行逆向分析,得到一函数库并提取每个函数的多维特征。基于特征,对不同函数库间的每两个函数计算相似度作为集成分类器的输入向量。如果两个函数名称相同,则标签为1,作为正样本,如果两个函数名称不同,则标签为0,作为负样本。建立若干初始分类器。从初始样本集中有放回的抽取80%的样本构造若干独立同分布的子训练样本集,作为每个分类器的训练样本。将对应的子训练样本集输入分类器进行训练,根据预测结果,调整分类器的参数直至预测结果符合要求,此时分类器训练完毕。然后采用训练好的集成分类器对数值相似度进行预测。对该漏洞函数和每个待测函数提取特征,计算相似度向量,作为测试样本。用已经训练好的集成分类器中若干分类器进行预测得到若干预测值,取其加权平均作为最终预测值作为数值相似度。比如,如果需要得到mips-o2→arm-o2这种匹配模式的训练样本。步骤一:对openssl源码针对mips架构,采用-o2优化选项编译一份二进制文件,命名为openssl-mips-o2;对openssl源码针对arm架构,采用-o2优化选项编译一份二进制文件,命名为openssl-arm-o2。步骤二:对这两份二进制文件分别进行逆向分析得到两个函数库。设openssl-mips-o2的函数库共有m个函数,名称为x1-mips-o2,x2-mips-o2,……,xm-mips-o2;openssl-arm-o2的函数库共有n个函数,名称为y1-arm-o2,x2-arm-o2,……,yn-arm-o2。对这两个库的所有函数计算特征,一共得到m+n条特征。步骤三:计算库间函数相似度向量,得到m×n个相似度向量,如果xi=yj,那么可以认为openssl-mips-o2库的函数xi-mips-o2与openssl-arm-o2库的函数yj-arm-o2是同一个函数,则标签列为1,是正样本,反之,认为是负样本。步骤四:为了正负样本均衡同时也为了增速,每次对100个openssl-mips-o2的函数和100个openssl-arm-o2的函数,进行两两相似度计算和标签标记,那么会得到100个正样本和9900个负样本。收集全部的正样本和从9900个负样本中随机抽取100个作为负样本。这样就得到了min(m,n)个正样本和同样数量的负样本,作为mips-o2→arm-o2这种匹配模式的初始样本集。3)构造赋权二部图,采用二部图匹配算法(例如kuhn-munkres算法)计算整体相似度。整个算法步骤如下:a)从函数调用图中截取待比较函数的局部结构信息构成两个结构子图,其中,截取的层数可以根据实验效果来确定。b)将截取的结构子图按离待比较函数的跳数分层(其中,如果结构子图来自漏洞函数所在的二进制文件的函数调用图,此处的待比较函数指漏洞函数;如果结构子图来自待测函数所在的二进制文件的函数调用图,此处的待比较函数指待测函数),并按对待比较函数的重要程度来赋权重,如图4所示。c)将两个子图对应层抽象为赋权完全二部图,其中节点集为对应层包含的函数,边集为节点集中任意两个函数的相似关系,边权为对应两函数的数值相似度,如图5所示。这样便得到了多个赋权二部图。d)对每个赋权二部图采用二部图匹配算法分层计算每一层对应的最大权匹配作为对应层的相似度。e)对每层的相似度加权求和作为待比较函数的整体相似度。4)根据基于roc曲线计算的判定阈值进行判定。获得待测函数集与漏洞函数的整体相似度向量绘制roc曲线。其中roc曲线横轴是假阳率,即伪正例的比率(fp/(fp+tn));纵轴是真阳率,即真正例的比率(tp/(tp+fn))。roc曲线给出的是当阈值变化时假阳率和真阳率的变化情况,它可用于比较分类器的性能。理想情况下,最佳分类器应位于左上角,意味着分类器在假阳率很低时获得了高的真阳率,即将真正的漏洞函数检测了出来,而将很少的正常函数误判为漏洞函数。越靠近左上角的roc曲线的点是错误最少的最佳阈值,其在训练集上的假阳性和假阴性总数最少,即y-x最大的点,如图6所示。因此我们将y-x曲线的最高点对应的阈值作为判定阈值,相似度大于判定阈值的函数被判定为疑似漏洞函数,反之判定为正常函数。综上所述,本发明公开了一种跨架构的二进制程序漏洞关联技术。上面描述的应用场景及实施例,并非用于限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,可作各种更动和润饰。因此,本发明的保护范围视权利要求范围所界定。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1