本发明专利技术公开了一种程序分解方法,属于软件工程、信息安全技术领域。本发明专利技术方法包括:a)设定始函数和终函数;b)以始函数和直接或间接调用始函数的函数组成的集合为Source;类似地,设定Sinks;c)分别对仅属于Source和Sinks的函数,以及两者交集中的函数分解其控制流图;d)依次连接各控制流图,输出对应的程序。当本方法用于漏洞挖掘时,始函数选自污染数据引入函数,比如文件读入函数,网络数据读入函数和格式化输入函数;终函数选自污染数据敏感函数,比如内存操作函数,内存分配函数,字符串操作函数和进程启动函数。本发明专利技术方法可将大规模程序分解为较小的代码片段,可有效地应用域漏洞挖掘等技术领域。
【技术实现步骤摘要】
本专利技术涉及程序分析和程序安全审计,尤其涉及及其在漏洞挖掘中 的应用,属于软件工程、信息安全
技术介绍
由于现在软件规模越来越大,设计越来越复杂,软件中不可避免地存在大量漏洞;同 时,庞大的软件规模给程序分析和代码安全审计带来巨大困难。例如,Linux 2.6.27内核源 代码行数已经超过了 1000万行,Windows Vista操作系统代码规模在5000万行以上。为了 分析如此大规模的软件,首先需要将大的程序分解为多个较小的代码片段从而使代码安全 分析变为可行,因此程序分解技术一直是业界研究的焦点。最常见的程序分解方法是程序切片技术。程序切片技术由M. Weiser于1979年首次提 出,经过几十年的发展,理论研究日益丰富,形成了多个分支。但是,应用程序切片技术 分解程序时,需要构造大量数据流方程,迭代求解这些数据流方程的过程异常复杂;此外, 当程序中存在大量指针别名时,切片技术的准确性受到严重制约。另一方面,程序切片技术并没有考虑到代码安全分析领域新产生的需求。根据CERT 的研究报告,绝大部分的程序安全漏洞都是因为程序没有对污染数据(如从文件、网络等读 取的数据)进行严格检验而造成的,当这些污染数据应用于敏感的系统调用(如execv、strcpy) 时,就会引发严重的安全问题。安全分析人员需要对这种既包含污染数据引入函数(如 fread, recv, recvfrom等)也包含污染数据敏感函数(如execv, strcpy, strcat等)的程序路径 格外关注,因为这些路径最容易引发安全问题。比如,函数recv会引入污染数据,而函数 execv对污染数据敏感,在下面所示代码中,int size = recv(s, buffer, sizeof(buffer),0); if(size!=-l){check—buf(buffer);execv(buffer, argv);存在一条程序路径,调用函数recv()读取网络数据后,又调用了函数execv()。因为网络数据被直接用于函数execv()将会导致严重的安全威胁,分析人员需要严格分析这段代码 以确认是否存在安全问题。
技术实现思路
本专利技术目的在于克服现有技术中存在的问题,提供,以及该方法用 于漏洞挖掘的用途。本专利技术程序分解方法通过分析程序函数调用图和程序控制流图,自动识别程序中最容 易引起安全问题的程序路径(在这些程序路径上,调用污染数据引入函数后,又调用了污染 数据敏感函数),进而将大规模程序分解为较小的代码片段,充分降低程序分析的复杂性, 大大提高代码安全分析的效率。本专利技术程序分解方法包括下列步骤1. 设定始函数和终函数;2. 以所述始函数和直接或间接调用所述始函数的函数组成的函数集作为Source;以 所述终函数以及直接或间接调用所述终函数的函数组成的函数集作为Sinks;若Source fl Sinks为空,则本方法不适用;3. 对中的每一个函数,以该函数的控制流图中由入口节点经 调用Source中函数的节点到出口节点的控制流作为分解后的控制流对中的每一个函数,以该函数的控制流图中由入口节点经调用 Sinks中函数的节点到出口节点的控制流作为分解后的控制流对(Source门Sinks)中的每一个函数,以该函数的控制流图中由入口节点经调用(Source USinks)中函数的节点到出口节点的控制流作为分解后的控制流4. 按照所述程序的函数调用图依次连接步骤c)所述各个分解后的控制流图,并以对 应的程序作为分解后的程序。在所述分解后的程序中,既调用了始函数,也调用了终函数。进一步,上述步骤2可通过下述方法进行i. 在所述程序的函数调用图中,设置始函数所在的节点具有"i"属性;设置终函数 所在的节点具有"u"属性;ii. 以始函数或终函数所在的节点为起点,同时向上作下述递归分析若某节点的子 节点具有"i"属性,则设置该节点具有"i"属性;若某节点的子节点具有"11"属性,则设置该节点具有"U"属性;iii.以所有具有"i"属性的节点所对应的函数组成的函数集作为Source;以所有具有 "u"属性的节点所对应的函数组成的函数集作为Sinks。进一步,上述步骤3可通过下述方法进行对(SourceU Sinks)中的每一个函数f,在该函数的控制流图中,若某节点对应的函数属 于Source,则设置该节点具有"r"属性;若某节点对应的函数属于Sinks,则设置该节点 具有"w"属性;如果f $ Sinks (即f在Source中而不在Sinks中),根据函数f原有控制流图生成新控 制流图的过程为a) 初始化节点集合ebsl= ebs2 = {函数f原有控制流图中属性为"r"的节点〉;b) 向上扩充ebsl:循环地把ebsl中节点的前驱节点加入到ebsl,直到ebsl中每个节 点的所有前驱节点也在ebsl内;c) 向下扩充ebs2:循环地把ebs2中节点的后继节点加入到ebs2,直到ebs2中每个节 点的所有后继也在ebs2内;d) 函数f新控制流图中的节点=ebslUebs2;如果f $ Source (即f在Sinks中而不在Source中),根据函数f原有控制流图生成新控 制流图的过程为a) 初始化节点集合ebsl= ebs2 = {函数f原有控制流图中属性为"w"的节点〉;b) 向上扩充ebsl:循环地把ebsl中节点的前驱节点加入到ebsl,直到ebsl中每个节 点的所有前驱节点也在ebsl内;c) 向下扩充ebs2:循环地把ebs2中节点的后继节点加入到ebs2,直到ebs2中每个节 点的所有后继也在ebs2内;d) 函数f新控制流图中的节点=ebslUebS2;如果f e SourcenSinks,根据函数f原有控制流图生成新控制流图的过程为a) 初始化节点集合ebsl= ebs2 = {函数f原有控制流图中属性为"r"的节点〉;b) 初始化节点集合ebs3= ebs4 = {函数f原有控制流图中属性为"w"的节点);c) 向上扩充ebsl:循环地把ebsl中节点的前驱节点加入到ebsl,直到ebsl中每个节 点的所有前驱节点也在ebsl内;d) 向下扩充ebs2:循环地把ebs2中节点的后继节点加入到ebs2,直到ebs2中每个节6点的所有后继也在ebs2内;e) 向上扩充ebs3:循环地把ebs3中节点的前驱节点加入到ebs3,直到ebs3中每个节 点的所有前驱节点也在ebs3内;f) 向下扩充ebs4:循环地把ebs4中节点的后继节点加入到ebs4,直到ebs4中每个节 点的所有后继也在ebs4内;g) 函数f新控制流图中的节点=ebsl U(ebs2Hebs3)Uebs4。本专利技术可用于多种用途,特别地,本专利技术可用于漏洞挖掘。当本专利技术用于漏洞挖掘时,所述始函数选自污染数据引入函数,所述终函数选自污染 数据敏感函数。所述污染数据引入函数包括但不限于基本的文件读入函数(如fread, read, fgetc, fgets, fscanf),网络数据读入函数(如recv, recvfrom, recvmsg)和格式化输入函数(如scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf本文档来自技高网...
【技术保护点】
一种程序分解方法,其特征在于,包括下列步骤: a)设定始函数和终函数; b)以所述始函数和直接或间接调用所述始函数的函数组成的函数集作为Source;以所述终函数以及直接或间接调用所述终函数的函数组成的函数集作为Sinks;c)对[Source-(Source∩Sinks)]中的每一个函数,以该函数的控制流图中由入口节点经调用Source中函数的节点到出口节点的控制流作为分解后的控制流图; 对[Sinks-(Source∩Sinks)]中的每一个函数,以该函数的控制流图中由入口节点经调用Sinks中函数的节点到出口节点的控制流作为分解后的控制流图; 对(Source∩Sinks)中的每一个函数,以该函数的控制流图中由入口节点经调用(Source∪Sinks)中函数的节点到出口节点的控制流作为分解后的控制流图; d)按照所述程序的函数调用图依次连接步骤c)所述各个分解后的控制流图,并以对应的程序作为分解后的程序。
【技术特征摘要】
【专利技术属性】
技术研发人员:王铁磊,韦韬,邹维,毛剑,李佳静,赵新建,张超,戴帅夫,
申请(专利权)人:北京大学,
类型:发明
国别省市:11[中国|北京]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。