首页> 中国专利> 一种用于漏洞检测的检测对象程序特征提取方法

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

摘要

一种用于漏洞检测的检测对象程序特征提取方法,包括步骤如下:1)漏洞载入流程,建立漏洞模型的数据结构;漏洞模型由漏洞状态机的状态的集合和操作的集合构成,状态表示状态机的状态,每个状态有状态号、类型和特征属性。2)程序载入特征分析提取流程,对经过gcc编译的软件代码进行抽象,构造用于漏洞模型检测的、基于检测对象的程序特征序列:把程序控制流图中与漏洞状态相关的程序特征信息提取出来,并以函数为单位进行组织;每个函数组织成若干个由检测对象索引的操作序列链表;本发明克服目前软件漏洞检测方法存在大量重复工作、影响检测速度、以及参数分析不准确的问题,以判断漏洞模型在代码中的存在性。

著录项

  • 公开/公告号CN101937395A

    专利类型发明专利

  • 公开/公告日2011-01-05

    原文格式PDF

  • 申请/专利权人 南京大学;

    申请/专利号CN201010286663.6

  • 发明设计人 曾庆凯;

    申请日2010-09-20

  • 分类号G06F11/36;

  • 代理机构南京天翼专利代理有限责任公司;

  • 代理人陈建和

  • 地址 210093 江苏省南京市鼓楼区汉口路22号

  • 入库时间 2023-12-18 01:26:38

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-11-09

    未缴年费专利权终止 IPC(主分类):G06F11/36 授权公告日:20120725 终止日期:20150920 申请日:20100920

    专利权的终止

  • 2012-07-25

    授权

    授权

  • 2011-03-02

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20100920

    实质审查的生效

  • 2011-01-05

    公开

    公开

说明书

技术领域

本发明涉及一种计算机软件的检测方法,尤其是软件漏洞检测的方法。

背景技术

软件因存在着隐藏的安全漏洞易于受到攻击而遭受损失,其安全威胁有不断增加的趋势。通过对软件代码进行漏洞检测,发现和消除软件中的安全漏洞是减少安全威胁、降低安全风险的重要手段之一。漏洞模型检测是一种具有代表性的代码漏洞检测方法。为进行基于漏洞状态机模型的漏洞检测,我们提出一种用于漏洞模型检测的程序特征提取方法,以供对待检测程序代码进行抽象、建立用于漏洞检测的程序特征模型。

目前的漏洞模型软件漏洞检测方法在检测过程中存在着重复检查、不够准确等缺点,检测的速度和准确性显得不足,影响着检测方法的适用性。对此,我们提出一种用于漏洞模型检测的程序特征提取方法,该方法避免采用原有方法模拟程序执行流程的检测顺序,只提取与漏洞模型检测的程序操作特征,注重对重点参数的检测,以提高软件漏洞检测的速度和准确性。

发明内容

本发明目的是:面向基于漏洞模型的软件漏洞模型检测的目标,针对目前软件漏洞检测方法存在大量重复工作、影响检测速度、以及参数分析不准确的问题,基于软件漏洞的状态机模型,利用控制流图和数据流分析技术,以重点检测对象为中心,提取与软件漏洞的状态机模型相关的程序特征,对软件代码进行抽象建模,可用于对其进行漏洞静态检测,以判断漏洞模型在代码中的存在性。

为实现本发明的所述目的,本发明提供一种用于软件漏洞模型检测、基于检测对象的程序特征提取方法,用于漏洞检测的检测对象程序特征提取方法,包括主要步骤:

1)漏洞载入流程,建立漏洞模型的数据结构;漏洞模型由漏洞状态机的状态的集合和操作的集合构成,状态表示状态机的状态,每个状态有状态号、类型和特征属性。操作表示引起状态发生变化的动作,每个操作具有操作号、动作、特征、检测对象指示、原状态和新状态属性;操作的动作指具体的程序动作。操作的特征有产生、转移和使用等值; 软件漏洞模型检测对象为程序中漏洞相关操作所涉及的需检测的变量,软件漏洞模型检测对象指示为操作涉及的参数编号;状态、操作的集合分别存储在数据库中的一个表中:状态表和操作表;为方便模型检测处理,在内存中建立由操作动作进行检索的操作转换表;每个操作动作对应一个链表,链表的结点为一个操作,表示一个原状态到新状态的转换关系:

步骤20:起始状态;步骤21:在数据库操作表中取一个操作的记录;步骤22:若取到转步骤23,否则转步骤26;步骤23判断取得该操作动作的操作转换表表头是否已存在;若已存在转步骤24,否则转步骤25;步骤24:创建一个操作结点,结点的操作号、特征和检测对象指示分别为该操作的操作号、特征和检测对象指示;把此结点连接到对应的操作动作操作转换表的链表尾部,转步骤21;步骤25:创建该操作动作的操作转换表表头,创建一个操作结点,结点的操作号、特征和检测对象指示分别为该操作的操作号、特征和检测对象指示;把此结点作为该操作动作的第一个结点,转步骤21;步骤26为结束状态,操作转换表建立完成;

2)程序载入特征分析提取流程,对经过gcc编译的软件代码进行抽象,构造用于漏洞模型检测的、基于检测对象的程序特征序列:

把程序控制流图中与漏洞状态相关的程序特征信息,即操作序列提取出来,并以函数为单位进行组织;每个函数组织成若干个由检测对象索引的操作序列链表;链表的每个结点表示一个与漏洞状态相关的操作或函数;一方面过滤去除与漏洞检测无关的语句,另一方面,使函数简化控制流到语句级,并使操作序列化,便于检测处理;

程序特征提取处理从main函数开始进行,其流程如下,步骤31:起始状态;步骤32:为初始化处理:设置所有函数的访问标记为OFF,值为0;置提取处理函数为函数main,函数的输入检测对象集合和本地检测对象集合都为空;步骤33:对提取处理函数进行函数程序特征提取;步骤34:存储提取的程序特征到磁盘,将全部函数的程序特征,包括检测对象集合(含输入检测对象集合和本地检测对象集合)及其操作序列链表写入磁盘保存;步骤36:结束状态,此时,所有函数的操作序列链表已经建立完成,作为程序操作序列分析之用;

步骤33的函数程序特征提取流程的详细步骤是,表示对处理函数进行函数程序特征提取的过程;步骤40:起始状态, 步骤41:在程序控制流图中取出处理函数并构造其数据结构。步骤41a判断处理函数的访问标记为ON,值为1,是则转步骤4e,否则转步骤42;步骤42:函数处理初始化:创建该函数的语句块链表表头,此时表头也是链表表尾,以及操作序列链表表头;为函数的输入检测对象集合中每个检测对象(为原始对象),建立原始对象的操作序列,初始无结点,和关系集合(初始化为空);步骤43:语句块链表当前语句块向后移一次,而首次执行是使当前语句块指向函数的头语句块;步骤44:判断语句块是否为空,是则转步骤4e,否则转步骤45;步骤45:进行当前语句块的分析提取处理;步骤46:判断当前语句块的后继是否是顺序结构,是则转步骤47,否则转步骤48;步骤47:取出顺序结构的下一后继语句块放入语句块链表表尾,后继语句块置标记DONE(值为1);若后继语句块已标记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:设置处理函数的访问标记为ON(值为1);步骤4f:为函数处理结束状态;此时,提取处理函数的检测对象集合(包括输入检测对象集合和本地检测对象集合)及其操作序列链表已经建立完成;

步骤45的一个语句块的语句操作提取处理流程的详细步骤是:步骤50:起始状态;步骤51:顺序取出该语句块的一条语句为当前语句;步骤52:判断是否取到,若取到转步骤53,否则转步骤5e;步骤53:查操作转换表,判断该语句是否为产生型操作(语句为操作转换表中操作且操作的特征为产生),是则转步骤54,否则转步骤55;步骤53a:该操作的检测对象指示所指的参数为新产生的检测对象(为原始对象);判断新产生的原始对象是否已在本地检测对象集合中。是则转步骤55,否则转步骤54;步骤54:将该原始对象加入到函数的本地检测对象集合中;建立该原始对象的操作序列,操作序列的首结点为本语句的操作;建立该原始对象的关系集合,且初始化为空;步骤55:判断该语句是否为赋值,且右值表达式中含有检测对象(包括输入检测对象和本地检测对象);是则转步骤56,否则转步骤57;步骤56:被赋值变量为关系检测对象,右值中检测对象为传递检测对象。找到传递检测对象所属的原始对象(传递检测对象在原始对象的关系集合中),加入关系检测对象到原始对象的关系集合中;步骤57:查操作转换表,判断该语句操作是否在漏洞状态机的操作集合中(语句为操作转换表中操作);是则转步骤58,否则转步骤59;步骤58:创建该语句操作的操作链表结点:置结点的操作为该语句的操作,检测对象为操作的检测对象指示所指的参数;找到该检测对象所属的原始对象(该检测对象在原始对象的关系集合中),将该语句的操作加到原始对象的序列尾部;步骤59:判断该语句是否为函数调用,是则转步骤5a,否则转步骤5b;步骤5a: 函数调用语句处理;步骤5b:转步骤51;步骤5e为结束状态;

步骤5a为函数调用语句处理流程的详细步骤;步骤60是起始状态。步骤61:函数调用检测对象集合初始化为空;步骤62:顺序取调用函数的一个参数;步骤63:判断是否取到,若没取到,则转步骤66;步骤64:判断参数是否为检测对象(在检测对象集合中),若不是则转步骤62,是则转步骤65;步骤65:查找该检测对象的原始对象,将本语句的函数调用加到原始对象的操作序列尾部;将此检测对象对应的形参加入到函数调用检测对象集合,转步骤62;步骤66:若函数调用检测对象集合为空,则转步骤69;步骤67:置提取处理函数为被调用函数,输入检测对象集合为函数调用检测对象集合;步骤68:对提取处理函数进行程序特征抽取,即步骤45一个语句块的语句操作提取处理流程的处理流程;步骤69:结束状态,函数调用处理结束。几次循环后,步骤63总会转向步骤66,跳出循环。

本发明有益效果:这是一种用于软件漏洞模型检测、基于检测对象的程序特征提取方法,克服目前软件漏洞检测方法存在大量重复工作、影响检测速度、以及参数分析不准确的问题,通过提取与软件漏洞的状态机模型相关的程序特征,对软件代码进行抽象建模,用于对其进行漏洞静态检测,以判断漏洞模型在代码中的存在性。

附图说明

图1 用于漏洞模型检测的程序特征提取示意图

图2 漏洞载入流程图

图3 程序载入特征提取流程图

图4 函数程序特征提取流程图

图5 语句块的语句操作提取处理流程图

图6 函数调用语句处理流程图。

 

具体实施方式

本发明方法工作流程如图1-图6所示。

图1所示为本方法实施的整体结构和工作原理。本方法的目的是根据漏洞模型所涉及的操作对待检测程序进行分析过滤,得到与漏洞检测相关的程序特征。为提高处理速度,需要将漏洞模型从数据库中装入内存,以便在分析程序时,作为参考依据。程序载入和特征分析过程,根据漏洞模型相关操作的信息抽取必要的程序操作,完成对程序的抽象,得到漏洞相关的程序特征,即基于检测对象的操作序列。

图2表示漏洞模型载入流程。漏洞模型由漏洞状态机的状态的集合和操作的集合构成。状态表示状态机的状态。每个状态有状态号、类型和特征等属性。类型是指漏洞的分类,如文件、内存等类别。特征有开始、过渡和漏洞等值。操作表示引起状态发生变化的动作,每个操作具有操作号、动作、特征、检测对象指示、原状态和新状态等属性。操作的动作指具体的程序动作。操作的特征有产生、转移和使用等值。检测对象为程序中漏洞相关操作所涉及的需检测的变量,检测对象指示为操作涉及的参数编号。状态、操作的集合分别存储在数据库中的一个表中:状态表和操作表。为方便模型检测处理,在内存中建立由操作动作进行检索的操作转换表。每个操作动作对应一个链表,链表的结点为一个操作,表示一个原状态到新状态的转换关系。具体步骤如下。

步骤20是起始状态。步骤21在数据库操作表中取一个操作的记录。步骤22若取到转步骤23,否则转步骤26。步骤23判断取得该操作动作的操作转换表表头是否已存在。若已存在转步骤24,否则转步骤25。步骤24创建一个操作结点,结点的操作号、特征和检测对象指示分别为该操作的操作号、特征和检测对象指示。把此结点连接到对应的操作动作操作转换表的链表尾部,转步骤21。步骤25创建该操作动作的操作转换表表头,创建一个操作结点,结点的操作号、特征和检测对象指示分别为该操作的操作号、特征和检测对象指示。把此结点作为该操作动作的第一个结点,转步骤21。步骤26为结束状态,操作转换表建立完成。

图3表示程序载入和特征提取流程。把程序控制流图中与漏洞状态相关的程序特征信息,即操作序列提取出来,并以函数为单位进行组织。每个函数组织成若干个由检测对象索引的操作序列链表。链表的每个结点表示一个与漏洞状态相关的操作或函数。一方面过滤去除与漏洞检测无关的语句,另一方面,使函数简化控制流到语句级,并使操作序列化,便于检测处理。

程序特征提取处理从main函数开始进行,其流程如下。步骤31是起始状态。步骤32为初始化处理:设置所有函数的访问标记为OFF(值为0);置提取处理函数为函数main,函数的输入检测对象集合和本地检测对象集合都为空。步骤33对提取处理函数进行函数程序特征提取。处理流程见图4。步骤34存储提取的程序特征到磁盘。将全部函数的程序特征,包括检测对象集合(含输入检测对象集合和本地检测对象集合)及其操作序列链表写入磁盘保存。步骤36为结束状态。此时,所有函数的操作序列链表已经建立完成,可以作为程序操作序列分析之用。

图4为函数程序特征提取流程图,表示对处理函数进行函数程序特征提取的过程。步骤40是起始状态。步骤41在程序控制流图中取出处理函数并构造其数据结构。步骤41a判断处理函数的访问标记为ON(值为1)。是则转步骤4e;否则转步骤42。步骤42函数处理初始化:创建该函数的语句块链表表头(此时表头也是链表表尾),以及操作序列链表表头。为函数的输入检测对象集合中每个检测对象(为原始对象),建立原始对象的操作序列(初始无结点)和关系集合(初始化为空)。步骤43语句块链表当前语句块向后移一次,而首次执行是使当前语句块指向函数的头语句块。步骤44判断语句块是否为空。是则转步骤4e,否则转步骤45。步骤45进行当前语句块的分析提取处理,处理流程见图5。步骤46判断当前语句块的后继是否是顺序结构。是则转步骤47,否则转步骤48。步骤47取出顺序结构的下一后继语句块放入语句块链表表尾,后继语句块置标记DONE(值为1)。若后继语句块已标记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设置处理函数的访问标记为ON(值为1)。步骤4f为函数处理结束状态。此时,提取处理函数的检测对象集合(包括输入检测对象集合和本地检测对象集合)及其操作序列链表已经建立完成。

图5表示一个语句块的语句操作提取处理流程。步骤50是起始状态。步骤51顺序取出该语句块的一条语句为当前语句。步骤52判断是否取到。若取到转步骤53,否则转步骤5e。步骤53查操作转换表,判断该语句是否为产生型操作(语句为操作转换表中操作且操作的特征为产生)。是则转步骤54,否则转步骤55。步骤53a该操作的检测对象指示所指的参数为新产生的检测对象(为原始对象)。判断新产生的原始对象是否已在本地检测对象集合中。是则转步骤55,否则转步骤54。步骤54将该原始对象加入到函数的本地检测对象集合中;建立该原始对象的操作序列,操作序列的首结点为本语句的操作;建立该原始对象的关系集合,且初始化为空。步骤55判断该语句是否为赋值,且右值表达式中含有检测对象(包括输入检测对象和本地检测对象)。是则转步骤56,否则转步骤57。步骤56被赋值变量为关系检测对象,右值中检测对象为传递检测对象。找到传递检测对象所属的原始对象(传递检测对象在原始对象的关系集合中),加入关系检测对象到原始对象的关系集合中。步骤57查操作转换表,判断该语句操作是否在漏洞状态机的操作集合中(语句为操作转换表中操作)。是则转步骤58,否则转步骤59。步骤58创建该语句操作的操作链表结点:置结点的操作为该语句的操作,检测对象为操作的检测对象指示所指的参数;找到该检测对象所属的原始对象(该检测对象在原始对象的关系集合中),将该语句的操作加到原始对象的序列尾部。步骤59判断该语句是否为函数调用。是则转步骤5a,否则转步骤5b。步骤5a 函数调用语句处理,处理流程见图6。步骤5b转步骤51。步骤5e为结束状态,一个语句块处理结束。

图6 为函数调用语句处理流程,表示函数调用语句操作提取处理的过程。步骤60是起始状态。步骤61函数调用检测对象集合初始化为空。步骤62顺序取调用函数的一个参数。步骤63判断是否取到。若没取到,则转步骤66。步骤64判断参数是否为检测对象(在检测对象集合中)。若不是,则转步骤62,是则转步骤65。 步骤65查找该检测对象的原始对象,将本语句的函数调用加到原始对象的操作序列尾部;将此检测对象对应的形参加入到函数调用检测对象集合。转步骤62。步骤66若函数调用检测对象集合为空,则转步骤69。步骤67置提取处理函数为被调用函数,输入检测对象集合为函数调用检测对象集合。步骤68对提取处理函数进行程序特征抽取,处理流程见图4。步骤69是结束状态,函数调用处理结束。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号