一种用于漏洞检测的可调对象程序特征提取方法

文档序号:6378877阅读:157来源:国知局
专利名称:一种用于漏洞检测的可调对象程序特征提取方法
技术领域
本发明涉及软件工程技术领域,尤其是涉及对软件的检测方法。
背景技术
软件因存在着隐藏的安全漏洞而易受攻击造成损失,其安全威胁有不断增加的趋势。通过对软件代码进行漏洞检测,发现和消除软件中的安全漏洞是减少安全威胁、降低安全风险的重要手段之一。漏洞模型检测是一种具有代表性的代码漏洞检测方法。为此,我们提出一种用于漏洞检测的可调对象程序状态特征提取方法,以供对待检测程序代码进行状态抽象建模、建立用于漏洞检测的程序状态特征模型。目前的漏洞模型软件漏洞检测方法在检测过程中存在着重复检查、检查关注重点不集中、不够准确等缺点,检测的速度和准确性显得不足,影响着检测方法的适用性。

发明内容
本发明目的是,提出一种用于漏洞检测的程序状态特征提取方法,该方法避免采用原有方法模拟程序执行流程的检测顺序,只提取与漏洞模型检测相关的可调对象程序状态特征,注重对可能存在潜在漏洞的重点状态的检测,以提高软件漏洞检测的速度和准确性。为实现本发明的所述目的,本发明提出的技术方案是,一种用于软件漏洞检测、可调对象程序特征提取方法,其步骤包括I)漏洞模型载入流程,建立漏洞模型的数据结构;2)程序载入和状态特征分析提取流程,对经过gcc编译的软件代码进行抽象,构造用于漏洞检测的、可调对象的程序状态特征序列。将漏洞模型从数据库中装入内存,以便在分析程序时,作为参考依据。程序载入和状态特征分析过程,根据漏洞模型相关操作的信息抽取必要的程序状态序列,完成对程序的抽象建模,得到漏洞相关的程序状态特征,即可调对象的的状态特征序列。漏洞模型由漏洞相关操作的集合构成。操作表示引起状态发生变化的动作,每个操作具有操作号、动作、特征、输入变量与输出变量的集合等属性。操作的动作指具体的程序动作;操作的特征有产生、转移、刷新和使用等值。可调对象指程序中漏洞相关操作所涉及的需分析和检测的变量,输入变量和输出变量都是可调对象。操作的集合存储在数据库中的一个表中即操作关系表。为方便模型检测处理,在内存中建立由操作动作进行检索的操作变量关系表。每个操作动作对应一个链表,链表的结点为一个输入输出关系,表示一个输出变量与其输入变量的关系。程序载入和状态特征提取流程,把程序控制流图中与漏洞状态相关的程序状态特征信息,即程序可调变量的状态序列提取出来,并以函数为单位进行组织;每个函数组织成若干个由可调对象索引的操作状态序列链表。本发明的有益效果是,实现面向基于漏洞模型的软件漏洞模型检测的目标,针对目前软件漏洞检测方法存在大量重复工作、检查和关注目标过于宽泛、影响检测速度、以及状态分析不准确的问题,基于软件漏洞的状态模型,利用控制流图和数据流分析技术,以重点外部可调对象为中心,提取与软件漏洞的状态模型相关的程序状态特征,对软件代码进行抽象建模,可用于对其进行漏洞静态检测,以判断漏洞模型在代码中的存在。本发明避免采用原有方法模拟程序执行流程的检测顺序,只提取与漏洞模型检测相关的可调对象程序状态特征,注重对可能存在潜在漏洞的重点状态的检测,大大提高软件漏洞检测的速度和准确性。








I用于漏洞模型检测的程序状态特征提取示意图2为漏洞模型载入流程3为程序载入状态特征提取流程4为函数程序状态特征提取流程5为语句块的语句状态提取处理流程6为函数调用语句处理流程图。
具体实施例方式本发明方法工作流程如图I-图6所示。图I所示为本方法实施的整体结构和工作原理。本方法的目的是根据漏洞模型所涉及的操作对待检测程序进行状态分析和过滤,得到与漏洞检测相关的程序状态特征。为提高处理速度,需要将漏洞模型从数据库中装入内存,以便在分析程序时,作为参考依据。程序载入和状态特征分析过程,根据漏洞模型相关操作的信息抽取必要的程序状态序列,完成对程序的抽象建模,得到漏洞相关的程序状态特征,即可调对象的的状态特征序列。图2表示漏洞模型载入流程。漏洞模型由漏洞相关操作的集合构成。操作表示引起状态发生变化的动作,每个操作具有操作号、动作、特征、输入变量与输出变量的集合等属性。操作的动作指具体的程序动作。操作的特征有产生、转移、刷新和使用等值。可调对象指程序中漏洞相关操作所涉及的需分析和检测的变量,输入变量和输出变量都是可调对象。操作的集合存储在数据库中的一个表中操作关系表。为方便模型检测处理,在内存中建立由操作动作进行检索的操作变量关系表。每个操作动作对应一个链表,链表的结点为一个输入输出关系,表示一个输出变量与其输入变量的关系。具体步骤如下。步骤20是起始状态;步骤21在数据库的操作关系表中依次取一个操作关系头的记录;步骤22判断是否取到一个操作关系头的记录,若取到转步骤23,否则转步骤27 ;步骤23创建该操作动作的操作变量关系表表头,根据输出变量数目,创建输出变量指针链;步骤24在数据库操作关系表中依次取该操作的输出变量关系的记录;步骤25判断是否取到该操作的输出变量关系的记录;若取到转步骤26,否则转步骤21 ;步骤26创建一个输入输出关系结点,用读取的内容设置结点的输出变量与其输入变量;判断是否把相应的输出变量指针指向此结点,是转步骤27,否则转步骤24。步骤27为结束状态,操作变量关系表建立完成。图3表示程序载入和状态特征提取流程。把程序控制流图中与漏洞状态相关的程序状态特征信息,即程序可调对象的状态序列提取出来,并以函数为单位进行组织。每个函数组织成若干个由可调对象索引的操作状态序列链表。状态序列链表的每个结点表示一个 与漏洞状态相关的可调对象的变量状态。一方面使函数简化为漏洞检测所关注的相关变量集合,另一方面,过滤去除与漏洞检测无关的变量状态,并使其序列化,便于检测处理。程序状态特征提取处理从main函数开始进行,其流程如下。步骤31是起始状态。步骤32为初始化处理设置所有函数的访问标记为OFF(值为O);置提取处理函数为函数main,函数调用可调对象集合为空。步骤33对提取处理函数进行函数程序状态特征提取。处理流程见图4。步骤34存储提取的程序状态特征到磁盘。将全部函数的程序状态特征,包括可调对象集合及其操作状态序列写入磁盘保存。步骤35为结束状态。此时,所有函数的操作状态序列已经建立完成,可以作为程序操作状态序列分析之用。图4为函数程序状态特征提取流程图,表示对处理函数进行函数程序状态特征提取的过程。步骤40是起始状态。步骤41在程序控制流图中取出处理函数并构造其数据结构。步骤41a判断处理函数的访问标记为ON(值为I)。是则转步骤4f;否则转步骤42。步骤42函数处理初始化创建该函数的语句块链表表头(此时表头也是链表表尾),以及操作状态序列链表表头。为函数的输入可调对象集合中每个可调对象(为原始对象),建立原始对象的操作状态序列(初始无结点)和关联集合(初始化为空)。步骤43语句块链表当前语句块向后移一次,而首次执行时使当前语句块指向函数的头语句块。步骤44判断语句块是否为空。是则转步骤4d,否则转步骤45。步骤45进行当前语句块的分析状态提取处理,处理流程见图5。步骤46判断当前语句块的后继是否是顺序结构。是则转步骤47,否则转步骤48。步骤47取出顺序结构的下一后继语句块放入语句块链表表尾,后继语句块置标记DONE (值为I)。若后继语句块已标记DONE,不再放入。转步骤4d。步骤48判断当前语句块的后继是否是if结构。是则转步骤49,否则转步骤4a。步骤49对条件表达式提取变量集合(称为刷新变量集合)。取出if语句为真和为假时的后继语句块,并将刷新变量集合加链接到后继语句块,依次放入语句块链表表尾,后继语句块置标记DONE。若后继语句块已标记DONE,不再放入。转步骤4d。步骤4a判断当前语句块的后继是否是switch结构。是则转步骤4b,否则转步骤4d。步骤4b取出switch分支语句中的一个语句块放入语句块链表表尾,分支后继语句块置标记DONE。若后继语句块已标记D0NE,不再放入。步骤4c对取出的switch分支语句判断是否所有语句块都已处理完毕。是则转步骤4d,否则转步骤4b。步骤4d判断语句块链表当前语句块是否是链尾(此时函数的操作状态序列链表已经建成)。是则转步骤4e,否则转步骤43。步骤4e创建该操作动作的操作变量关系表表头,创建输出变量指针链。步骤4el取得传递变量中函数形参为输出变量,取得则步骤4e2,否则步骤4e3。步骤4e2创建一个输出变量关系结点,以输出变量状态设置此结点,把相应的输出变量指针指向此结点,转步骤4el。步骤4e3设置处理函数的访问标记为ON(值为I)。步骤4f为函数处理结束状态。此时,提取处理函数的可调对象集合及其操作状态序列链表已经建立完成。图5表示一个语句块的语句操作状态提取处理流程。步骤50是起始状态。步骤51顺序取出该语句块的一条语句为当前语句。步骤52判断是否取到。若取到转步骤53,否则转步骤5e。步骤53查操作变量关系表,判断该语句是否为产生操作(语句为操作变量关系表中操作且操作的特征为产生)。是则转步骤53a,否则转步骤55。步骤53a该操作的输出变量为新产生的可调对象(为原始对象)。判断新产生的原始对象是否已在本地可调对象集合中。是则转步骤55,否则转步骤54。步骤54将该原始对象加入到函数的本地可调对象集合中;建立该原始对象的操作状态序列,操作状态序列的首结点输入和输出项同为自己,操作为本语句的操作;建立该原始对象的关联集合,且初始化为空。转步骤55。步骤55判断该语句操作是否为漏洞状态相关操作(语句为操作变量关系表中操作且操作的特征为非产生)。是则转步骤56,否则转步骤59。步骤56根据本语句操作查操作变量关系表,依次取得一个输出变量,是则步骤56a,否则转步骤59。步骤56a查判断输出变量的输入变量是否属于语句块的刷新变量集合,是则步骤56,否则转步骤57。步骤57判断输出变量是否已在本地可调对象集合中。是则转步骤58a,否则转步骤58。步骤58将该输出变量加入到函数的本地可调对象集合中;建立该可调对象的操作状态序列,根据输出变量关系设置操作状态序列的首结点,操作为本语句的操作。找到输入变量所属的原始对象,加入输出变量到原始对象的关联集合中。转步骤56。步骤58a根据输出变量关系,建立并设置相应输入输出关系结点,并链接到该可调对象的操作状态序列。转步骤56。步骤59判断该语句是否为函数调用。是则转步骤5a,否则转步骤5b。步骤5a函数调用语句处理,处理流程见图6,转步骤5b。步骤5b转步骤51。步骤5e为结束状态,一个语句块处理结束。图6为函数调用语句处理流程,表示函数调用语句操作状态提取处理的过程。即步骤5a函数调用语句处理流程步骤60是起始状态。步骤60a判断若处理函数的访问标记是否为0N,则步骤60b,否则步骤61 ;步骤60b查操作变量关系表,得输入输出关系集合;依次更新输出变量的状态,建立并设置相应的操作状态序列结点,并链接到输出变量的操作状态序列;转步骤69 ;步骤61函数调用输入可调对象集合初始化为空;步骤62顺序取调用函数的一个参数;步骤63判断是否取到,若没取到,则转步骤67 ;步骤64判断参数是否在可调对象集合中,若不是,则转步骤62,是则转步骤65 ;步骤65将此可调对象对应的形参加入到函数调用输入可调对象集合;转步骤62 ;步骤67置提取处理函数为被调用函数,输入可调对象集合为函数调用可调对象集合;步骤68对提取处理函数进行程序状态特征抽取,处理流程见函数程序状态特征提取流程(参见图4),转步骤69 ;步骤69是结束状态,函数调用处理结束。
权利要求
1.一种用于漏洞检测的可调对象程序特征提取方法,其特征是包括步骤如下 1)漏洞模型载入流程,建立漏洞模型的数据结构; 2)程序载入和状态特征分析提取流程,对经过gcc编译的软件代码进行抽象,构造用于漏洞检测的、可调对象的程序状态特征序列; 将漏洞模型从数据库中装入内存,在分析程序时,作为参考依据。程序载入和状态特征分析过程,根据漏洞模型相关操作的信息抽取必要的程序状态序列,完成对待测程序的抽象建模,得到漏洞相关的程序状态特征,即可调对象的的状态特征序列; 漏洞模型由漏洞相关操作的集合构成;操作表示引起状态发生变化的动作,每个操作具有操作号、动作、特征、输入变量与输出变量的集合等属性;操作的动作指具体的程序动作;操作的特征有产生、转移、刷新和使用等值。可调对象指程序中漏洞相关操作所涉及的需分析和检测的变量,输入变量和输出变量都是可调对象;操作的集合存储在数据库中的一个表中即操作关系表。
2.根据权利要求I所述的用于漏洞检测的可调对象程序特征提取方法,其特征是为方便模型检测处理,在内存中建立由操作动作进行检索的操作变量关系表。每个操作动作对应一个链表,链表的结点为一个输入输出关系,表不一个输出变量与其输入变量的关系;具体流程步骤20是起始状态;步骤21在数据库的操作关系表中依次取一个操作关系头的记录;步骤22判断是否取到一个操作关系头的记录,若取到转步骤23,否则转步骤27 ;步骤23创建该操作动作的操作变量关系表表头,根据输出变量数目,创建输出变量指针链;步骤24在数据库操作关系表中依次取该操作的输出变量关系的记录;步骤25判断是否取到该操作的输出变量关系的记录;若取到转步骤26,否则转步骤21 ;步骤26创建一个输入输出关系结点,用读取的内容设置结点的输出变量与其输入变量;判断是否把相应的输出变量指针指向此结点,是转步骤27,否则转步骤24。步骤27为结束状态,操作变量关系表建立完成。
3.根据权利要求I或2所述的用于漏洞检测的可调对象程序特征提取方法,其特征是程序载入和状态特征提取流程,把程序控制流图中与漏洞状态相关的程序状态特征信息,即程序可调对象的状态序列提取出来,并以函数为单位进行组织;每个函数组织成若干个由可调对象索引的操作状态序列链表;状态序列链表的每个结点表示一个与漏洞状态相关的可调对象的变量状态。一方面使函数简化为漏洞检测所关注的相关变量集合,另一方面,过滤去除与漏洞检测无关的变量状态,并使其序列化,便于检测处理。
4.根据权利要求I或3所述的用于漏洞检测的可调对象程序特征提取方法,其特征是程序状态特征提取处理从main函数开始进行,其流程如下步骤31是起始状态。步骤32为初始化处理设置所有函数的访问标记为OFF、值为O ;置提取处理函数为函数main,函数调用可调对象集合为空;步骤33对提取处理函数进行函数程序状态特征提取;步骤34存储提取的程序状态特征到磁盘。将全部函数的程序状态特征,包括可调对象集合及其操作状态序列写入磁盘保存;步骤35为结束状态;此时,所有函数的操作状态序列已经建立完成,作为程序操作状态序列分析之用。
5.根据权利要求4所述的用于漏洞检测的可调对象程序特征提取方法,其特征是步骤·33对提取处理函数进行函数程序状态特征提取流程表示对处理函数进行函数程序状态特征提取的过程;步骤40起始状态。步骤41在程序控制流图中取出处理函数并构造其数据结构;步骤41a判断处理函数的访问标记为ON、值为I,是则转步骤4f,否则转步骤42 ;步骤42函数处理初始化创建该函数的语句块链表表头、此时表头也是链表表尾,以及操作状态序列链表表头,为函数的输入可调对象集合中每个可调对象、可调对象为原始对象,建立原始对象的操作状态序列、初始时无结点,建立原始对象的关联集合、初始化为空;步骤43语句块链表当前语句块向后移一次,而首次执行时使当前语句块指向函数的头语句块;步骤44判断语句块是否为空,是则转步骤4d,否则转步骤45 ;步骤45进行当前语句块的分析状态提取处理;步骤46判断当前语句块的后继是否是顺序结构,是则转步骤47,否则转步骤48 ;步骤47取出顺序结构的下一后继语句块放入语句块链表表尾,后继语句块置标记DONE、值为I ;若后继语句块已标记DONE,不再放入。转步骤4d。步骤48判断当前语句块的后继是否是if结构。是则转步骤49,否则转步骤4a ;步骤49对条件表达式提取变量集合、称为刷新变量集合;取出if语句为真和为假时的后继语句块,并将刷新变量集合加链接到后继语句块,依次放入语句块链表表尾,后继语句块置标记DONE。若后继语句块已标记DONE,不再放入。转步骤4d。步骤4a判断当前语句块的后继是否是switch结构。是则转步骤4b,否则转步骤4d。步骤4b取出switch分支语句中的一个语句块放入语句块链表表尾,分支后继语句块置标记DONE。若后继语句块已标记DONE,不再放入;步骤4c对取出的switch分支语句判断是否所有语句块都已处理完毕 。是则转步骤4d,否则转步骤4b ;步骤 4d判断语句块链表当前语句块是否是链尾(此时函数的操作状态序列链表已经建成),是则转步骤4e,否则转步骤43 ;步骤4e创建该操作动作的操作变量关系表表头,创建输出变量指针链;步骤4el取得传递变量中函数形参为输出变量,取得则步骤4e2,否则步骤4e3 ;步骤4e2创建一个输出变量关系结点,以输出变量状态设置此结点,把相应的输出变量指针指向此结点,转步骤4el ;步骤4e3设置处理函数的访问标记为ON、值为I ;步骤4f为函数处理结束状态;此时,提取处理函数的可调对象集合及其操作状态序列链表已经建立完成。
6.根据权利要求5所述的用于漏洞检测的可调对象程序特征提取方法,其特征是步骤45进行当前语句块的分析状态提取处理流程的具体步骤步骤50起始状态。步骤51顺序取出该语句块的一条语句为当前语句;步骤52判断是否取到,若取到转步骤53,否则转步骤5e ;步骤53查操作变量关系表,判断该语句是否为产生操作、语句为操作变量关系表中操作且操作的特征为产生操作;是则转步骤53a,否则转步骤55 ;步骤53a该操作的输出变量为新产生的可调对象、为原始对象;判断新产生的原始对象是否已在本地可调对象集合中;是则转步骤55,否则转步骤54 ;步骤54将该原始对象加入到函数的本地可调对象集合中;建立该原始对象的操作状态序列,操作状态序列的首结点输入和输出项同为自己,操作为本语句的操作;建立该原始对象的关联集合,且初始化为空;步骤55判断该语句操作是否为漏洞状态相关操作,语句为操作变量关系表中操作且操作的特征为非产生,是则转步骤56,否则转步骤59 ;步骤56根据本语句操作查操作变量关系表,判断是否依次取得一个输出变量,是则步骤56a,否则转步骤59 ;步骤56a判断输出变量的输入变量是否属于语句块的刷新变量集合,是则转步骤56,否则转步骤57 ;步骤57判断输出变量是否已在本地可调对象集合中,是则转步骤58a,否则转步骤58 ;步骤58将该输出变量加入到函数的本地可调对象集合中;建立该可调对象的操作状态序列,根据输出变量关系设置操作状态序列的首结点,操作为本语句的操作;找到输入变量所属的原始对象,加入输出变量到原始对象的关联集合中,转步骤56 ;步骤58a根据输出变量关系,建立并设置相应输入输出关系结点,并链接到该可调对象的操作状态序列,转步骤56 ;步骤59判断该语句是否为函数调用,是则转步骤5a,否则转步骤5b ;步骤5a函数调用语句处理;步骤5b转步骤51 ;步骤5e为结束状态,一个语句块处理结束。步骤5a函数调用语句处理流程步骤60是起始状态。步骤60a判断若处理函数的访问标记是否为ON,则步骤60b,否则步骤61 ;步骤60b查操作变量关系表, 得输入输出关系集合;依次更新输出变量的状态,建立并设置相应的操作状态序列结点,并链接到输出变量的操作状态序列;转步骤69 ;步骤61函数调用输入可调对象集合初始化为空;步骤62顺序取调用函数的一个参数;步骤63判断是否取到,若没取到,则转步骤67 ;步骤64判断参数是否在可调对象集合中,若不是,则转步骤62,是则转步骤65 ;步骤65将此可调对象对应的形参加入到函数调用输入可调对象集合;转步骤62 ;步骤67置提取处理函数为被调用函数,输入可调对象集合为函数调用可调对象集合;步骤68对提取处理函数进行程序状态特征抽取,处理流程见函数程序状态特征提取流程,转步骤69 ;步骤69是结束状态,函数调用处理结束。
全文摘要
一种用于漏洞检测的可调对象程序特征提取方法,包括步骤如下1)漏洞模型载入流程,建立漏洞模型的数据结构;2)程序载入和状态特征分析提取流程,对经过gcc编译的软件代码进行抽象,构造用于漏洞检测的、可调对象的程序状态特征序列;将漏洞模型从数据库中装入内存,在分析程序时,作为参考依据。程序载入和状态特征分析过程,根据漏洞模型相关操作的信息抽取必要的程序状态序列,完成对待测程序的抽象建模,得到漏洞相关的程序状态特征,即可调对象的状态特征序列;漏洞模型由漏洞相关操作的集合构成;可调对象指程序中漏洞相关操作所涉及的需分析和检测的变量,输入变量和输出变量都是可调对象。
文档编号G06F9/44GK102929614SQ20121039154
公开日2013年2月13日 申请日期2012年10月16日 优先权日2012年10月16日
发明者曾庆凯 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1