一种基于检测对象的软件漏洞模型检测方法

2017-01-11 19:21

一种基于检测对象的软件漏洞模型检测方法,步骤包括:1)漏洞载入流程,建立漏洞模型的数据结构;漏洞模型由漏洞状态机的状态的集合和操作的集合构成,状态表示状态机的状态。2)漏洞模型检测处理流程。3)函数程序操作序列分析流程,表示针对检测对象进行函数程序序列分析的过程。4)操作的状态转换处理过程,计算操作后的转换状态。本发明提供一种基于漏洞模型的软件漏洞模型检测方法。基于软件漏洞的状态机模型,以重点检测对象为中心,对软件代码进行抽象建模,只对与漏洞状态相关的程序操作序列进行漏洞静态检测,判断漏洞模型在代码中的存在性。

克服现有技术需要大量重复工作、影响检测速度、准确性不高的问题。

1.一种基于检测对象的软件漏洞模型检测方法,其特征是步骤如下:1)漏洞载入流程,建立漏洞模型的数据结构;漏洞模型由漏洞状态机的状态的集合和操作的集合构成,其特征是状态表示状态机的状态;

每个状态有状态号、类型和特征属性;类型是指漏洞的分类,即文件、内存类别;特征属性有开始、过渡和漏洞值;操作表示引起状态发生变化的动作,每个操作具有操作号、动作、特征、检测对象指示、原状态和新状态属性;操作的动作指具体的程序动作;操作的特征有产生、转移、使用值;检测对象为程序中漏洞相关操作所涉及的需检测的变量,检测对象指示为操作涉及的参数编号;状态、操作的集合分别存储在数据库中的一个表中:状态表和操作表;在内存中建立由操作动作进行检索的操作转换表;每个操作动作对应一个链表,链表的结点为一个操作,表示一个原状态到新状态的转换关系;具体流程如下:步骤20:起始状态;步骤21:在数据库操作表中取一个操作的记录;步骤22:若取到转步骤23,否则转步骤26;步骤23:判断取得该操作动作的操作转换表表头是否已存在,若已存在转步骤24,否则转步骤25;步骤24:创建一个操作结点,结点的操作号、特征、检测对象指示、原状态和新状态分别为该操作的操作号、特征、检测对象指示、原状态和新状态,把此结点连接到对应的操作动作操作转换表的链表尾部,并转步骤21;步骤25:创建该操作动作的操作转换表表头,创建一个操作结点,结点的操作号、特征、检测对象指示、原状态和新状态分别为该操作的操作号、特征、检测对象指示、原状态和新状态;把此结点作为该操作动作的第一个结点,转步骤21;步骤26为结束状态,操作转换表建立完成;提取了与漏洞模型相关的操作序列;程序特征链表以函数为单位进行组织,每个函数对应若干个与检测对象相关的操作序列链表,操作序列链表的每个结点为一个与漏洞状态相关的操作或函数;

函数的检测对象包括输入检测对象和本地检测对象两类;程序特征载入时,将磁盘中程序特征链表装入内存,包括输入检测对象集合和本地检测对象集合及其操作序列链表;2)模型检测处理流程,以函数为单位进行模型检测工作,并报告漏洞的存在,步骤30:起始状态;步骤31:初始化,设置所有函数的访问标记为OFF,值为0;取main的检测对象集合为函数检测对象集合;步骤32:从函数检测对象集合中,取一个检测对象;步骤33:判断是否取到,若取到则转步骤34,否则转步骤36;步骤34:设置输入状态为开始,检测函数为main函数,输入检测对象为取得的检测对象;步骤35:对检测函数进行程序操作序列分析,处理流程见步骤40-4c;转步骤32;步骤36:结束状态;步骤40:起始状态;步骤41:判断检测函数的访问标记为ON,其值为1,是则转步骤41d,否则转步骤41a;步骤41a:置检测阶段为本地;步骤41b:从检测函数的本地检测对象集合中,取一个检测对象;步骤41c:判断是否取到检测对象,若取到则转步骤41e,否则转步骤41d;步骤41d:置检测阶段为输入,置检测函数的访问标记为ON,其值为1;置检测对象为输入检测对象,输入状态为当前状态,转步骤42;步骤41e:置输入状态为开始,转步骤42;步骤42:从检测对象的操作序列中,取一个操作结点;步骤43:判断是否取到,若取到转步骤44,否则转步骤4f;步骤44:判断该语句操作是否在漏洞状态机操作集合中,是则

转步骤45,否则转步骤46;步骤45:操作状态转换计算,处理流程见步骤50-57,得到转换状态,置当前状态为转换状态,转步骤4c;步骤46:判断该语句操作是否函数调用,是则转步骤47,否则转步骤4c;步骤47:顺序取每个函数调用参数;步骤48:判断是否取到,若取到,转步骤49,没取到则转步骤42;步骤49:判断所取的函数调用参数是否为检测对象,是则转步骤4a,否则转步骤47;步骤4a:设置当前状态为输入状态、检测函数为被调用函数、输入检测对象为现检测对象;进行函数程序操作序列分析,处理流程见步骤40-4c,置当前状态为函数结果状态;步骤4c:判断当前状态是否漏洞状态,是则转步骤4d,否则转步骤42;步骤4d:漏洞报警,转步骤42;步骤4f:操作序列分析结束处理,判断检测阶段是否为本地,是则转步骤41b,否则转步骤4g;步骤4g:置函数结果状态为当前状态;步骤4h:结束状态;

步骤50:起始状态;步骤51:置次状态为空;步骤52:在操作转换表中,查找操作动作所对应的操作结点;步骤53:判断查到操作结点否,若得到,转步骤54,否则转步骤56;步骤54:判断操作结点的源状态是否为当前状态,是则转步骤55,否则转步骤52;步骤55:置转换状态为操作结点的新状态,转步骤57;步骤56:数据错误报警:步骤57:结束状态。

一种基于检测对象的软件漏洞模型检测方法技术领域

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

背景技术

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

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

发明内容

针对目前软件漏洞检测方法存在大量重复工作、影响检测速度、准确性不高的问题,本发明提供一种基于漏洞模型的软件漏洞模型检测方法。基于软件漏洞的状态机模型,以重点检测对象为中心,对软件代码进行抽象建模,只对与漏洞状态相关的程序操作序列进行漏洞静态检测,判断漏洞模型在代码中的存在性。

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

1)漏洞载入流程,建立漏洞模型的数据结构;

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

具体步骤如下。

步骤20是起始状态。步骤21在数据库操作表中取一个操作的记录。步骤22若取到转步骤23,否则转步骤26。步骤23判断取得该操作动作的操作转换表表头是否已存在。

若已存在转步骤24,否则转步骤25。步骤24创建一个操作结点,结点的操作号、特征、检测对象指示、原状态和新状态分别为该操作的操作号、特征、检测对象指示、原状态和新状态。

把此结点连接到对应的操作动作操作转换表的链表尾部,转步骤21。步骤25创建该操作动作的操作转换表表头,创建一个操作结点,结点的操作号、特征、检测对象指示、原状态和新状态分别为该操作的操作号、特征、检测对象指示、原状态和新状态。把此结点作为该操作动作的第一个结点,转步骤21。步骤26为结束状态,操作转换表建立完成。

通过对程序抽象提取处理,过滤去处无关的操作,提取了与漏洞模型相关的操作序列。程序特征链表以函数为单位进行组织,每个函数对应若干个与检测对象相关的操作序列链表,链表的每个结点为一个与漏洞状态相关的操作或函数。函数的检测对象包括输入检测对象和本地检测对象两类。程序特征载入时,将磁盘中程序特征链表装入内存,包括输入检测对象集合和本地检测对象集合及其操作序列链表。

2)模型检测处理流程,以函数为单位进行模型检测工作,并报告漏洞的存在,步骤30:起始状态;步骤31初始化:设置所有函数的访问标记为OFF(值为0);取main的检测对象集合为函数检测对象集合。步骤32从函数检测对象集合中,取一个检测对象。步骤33判断是否取到。若取到则转步骤34,否则转步骤36。步骤34设置输入状态为开始,检测函数为main函数,输入检测对象为取得的检测对象。步骤35对检测函数进行程序操作序列分析,处理流程见图4;转步骤32。步骤36为结束状态。

图4为函数程序操作序列分析流程,表示针对检测对象进行函数程序序列分析的过程,具体步骤如下。步骤40是起始状态。步骤41判断检测函数的访问标记为ON(值为1)。是则转步骤41d,否则转步骤41a。步骤41a置检测阶段为本地。步骤41b从检测函数的本地检测对象集合中,取一个检测对象。步骤41c判断是否取到检测对象。若取到则转步骤41e,否则转步骤41d。步骤41d置检测阶段为输入,置检测函数的访问标记为ON(值为1)。置检测对象为输入检测对象,输入状态为当前状态。转步骤42。步骤41e置输入状态为开始。转步骤42。步骤42从检测对象的操作序列中,取一个操作结点。步骤43判断是否取到。若取到,转步骤44,否则转步骤4f。步骤44判断该语句操作是否在漏洞状态机操作集合中。是则转步骤45,否则转步骤46。步骤45操作状态转换计算,处理流程见图5,得到转换状态。置当前状态为转换状态。转步骤4c。步骤46判断该语句操作是否函数调用。是则转步骤47,否则转步骤4c。步骤47顺序取每个函数调用参数。步骤48判断是否取到。若取到,转步骤49,没取到则转步骤42。步骤49判断所取的函数调用参数是否为检测对象。是则转步骤4a,否则转步骤47。步骤4a设置当前状态为输入状态、检测函数为被调用函数、输入检测对象为现检测对象。进行函数程序操作序列分析,处理流程见图4。置当前状态为函数结果状态。步骤4c判断当前状态是否漏洞状态。是则转步骤4d,否则转步骤42。步骤4d漏洞报警,转步骤42。步骤4f操作序列分析结束处理:判断检测阶段是否为本地。是则转步骤41b,否则转步骤4g。步骤4g置函数结果状态为当前状态。步骤4h为结束状态。40-4c循环中:步骤43也总会转向步骤4f,跳出循环。

图5所示为操作的状态转换处理过程,计算操作后的转换状态。步骤50是起始状态。步骤51置次状态为空。步骤52在操作转换表中,查找操作动作所对应的操作结点。步骤53判断查到操作结点否。若得到,转步骤54,否则转步骤56。步骤54判断操作结点的源状态是否为当前状态。是则转步骤55,否则转步骤52。步骤55置转换状态为操作结点的新状态,转步骤57。步骤56数据错误报警。步骤57为结束状态。

本发明的有益效果是:本发明提供一种基于漏洞模型的软件漏洞模型检测方法。

基于软件漏洞的状态机模型,以重点检测对象为中心,对软件代码进行抽象建模,只对与漏洞状态相关的程序操作序列进行漏洞静态检测,判断漏洞模型在代码中的存在性。克服现有技术需要大量重复工作、影响检测速度、准确性不高的问题。

附图说明

图1为基于漏洞模型的软件漏洞模型检测方法结构示意图

图2漏洞载入流程图

图3漏洞模型检测处理流程图

图4函数程序序列分析流程图

图5操作状态转换处理过程图。

具体实施方式

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

图1所示为本方法实施的整体结构和工作原理。本方法的目的是根据漏洞模型所涉及的操作对待检测程序进行分析检测,报告发现的漏洞。为提高处理速度,需要将漏洞模型从数据库中装入内存,以便分析程序时,作为参考依据。漏洞模型检测过程中,以函数为单位根据漏洞相关操作逐步进行模型检测工作。漏洞模型检测工作从主函数开始进行检测,根据漏洞相关操作以及逐级函数的模型检测结果,进行状态检测并报告漏洞的存在性。

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

步骤20是起始状态。步骤21在数据库操作表中取一个操作的记录。步骤22若取到转步骤23,否则转步骤26。步骤23判断取得该操作动作的操作转换表表头是否已存在。

若已存在转步骤24,否则转步骤25。步骤24创建一个操作结点,结点的操作号、特征、检测对象指示、原状态和新状态分别为该操作的操作号、特征、检测对象指示、原状态和新状态。

把此结点连接到对应的操作动作操作转换表的链表尾部,转步骤21。步骤25创建该操作动作的操作转换表表头,创建一个操作结点,结点的操作号、特征、检测对象指示、原状态和新状态分别为该操作的操作号、特征、检测对象指示、原状态和新状态。把此结点作为该操作动作的第一个结点,转步骤21。步骤26为结束状态,操作转换表建立完成。

通过对程序抽象提取处理,过滤去处无关的操作,提取了与漏洞模型相关的操作序列。程序特征链表以函数为单位进行组织,每个函数对应若干个与检测对象相关的操作序列链表,链表的每个结点为一个与漏洞状态相关的操作或函数。函数的检测对象包括输入检测对象和本地检测对象两类。程序特征载入时,将磁盘中程序特征链表装入内存,包括

输入检测对象集合和本地检测对象集合及其操作序列链表。

图3表示漏洞模型检测处理流程,具体步骤如下。步骤30是起始状态。步骤31初始化:设置所有函数的访问标记为OFF(值为0);取main的检测对象集合为函数检测对象集合。步骤32从函数检测对象集合中,取一个检测对象。步骤33判断是否取到。若取到则转步骤34,否则转步骤36。步骤34设置输入状态为开始,检测函数为main函数,输入检测对象为取得的检测对象。步骤35对检测函数进行程序操作序列分析,处理流程见图4;转步骤32。步骤36为结束状态。

图4为函数程序操作序列分析流程,表示针对检测对象进行函数程序序列分析的过程,具体步骤如下。步骤40是起始状态。步骤41判断检测函数的访问标记为ON(值为1)。是则转步骤41d,否则转步骤41a。步骤41a置检测阶段为本地。步骤41b从检测函数的本地检测对象集合中,取一个检测对象。步骤41c判断是否取到检测对象。若取到则转步骤41e,否则转步骤41d。步骤41d置检测阶段为输入,置检测函数的访问标记为ON(值为1)。置检测对象为输入检测对象,输入状态为当前状态。转步骤42。步骤41e置输入状态为开始。转步骤42。步骤42从检测对象的操作序列中,取一个操作结点。步骤43判断是否取到。若取到,转步骤44,否则转步骤4f。步骤44判断该语句操作是否在漏洞状态机操作集合中。是则转步骤45,否则转步骤46。步骤45操作状态转换计算,处理流程见图5,得到转换状态。置当前状态为转换状态。转步骤4c。步骤46判断该语句操作是否函数调用。是则转步骤47,否则转步骤4c。步骤47顺序取每个函数调用参数。步骤48判断是否取到。若取到,转步骤49,没取到则转步骤42。步骤49判断所取的函数调用参数是否为检测对象。是则转步骤4a,否则转步骤47。步骤4a设置当前状态为输入状态、检测函数为被调用函数、输入检测对象为现检测对象。进行函数程序操作序列分析,处理流程见图4。置当前状态为函数结果状态。步骤4c判断当前状态是否漏洞状态。是则转步骤4d,否则转步骤42。步骤4d漏洞报警,转步骤42。步骤4f操作序列分析结束处理:判断检测阶段是否为本地。是则转步骤41b,否则转步骤4g。步骤4g置函数结果状态为当前状态。步骤4h为结束状态。

图5所示为操作的状态转换处理过程,计算操作后的转换状态。步骤50是起始状态。步骤51置次状态为空。步骤52在操作转换表中,查找操作动作所对应的操作结点。步骤53判断查到操作结点否。若得到,转步骤54,否则转步骤56。步骤54判断操作结点的源状态是否为当前状态。是则转步骤55,否则转步骤52。步骤55置转换状态为操作结点的新状态,转步骤57。步骤56数据错误报警。步骤57为结束状态。

图1

图2

图3

图4

图5