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

文档序号:6466782阅读:154来源:国知局
专利名称:一种基于漏洞模型的软件漏洞模型检测方法
技术领域
本发明涉及计算机软件的漏洞检测方法,尤其是基于漏洞模型检测的软件漏洞的方法。
背景技术
随着软件规模和复杂性的扩大,其中隐藏的安全漏洞不断增加,受到攻击而遭受损失的威胁 也不断增加。阻止系统攻击和入侵的根本解决途径是在软件缺陷被利用之前发现并将其消除。针 对软件安全漏洞进行软件代码检测是预测和防范漏洞的重要手段之一。漏洞静态检测是比较有效 的代码漏洞检测技术,而漏洞模型检测方法则是其中一种具有代表性的检测方法。我们提出一种 基于漏洞的状态机模型的模型检测方法,以提供对软件代码中可能存在的漏洞进行自动检测。
目前的基于漏洞模型的软件漏洞检测方法在检测过程中存在着重复检查等缺点,检测速度上 显得不足,影响着漏洞检测方法的适用性。因此,我们提出一种具有较高检测速度的检测方法, 该方法并不采用原有的模拟程序执行流程的检测顺序,而是只检测与漏洞模型相关的程序操作特 征,以提高软件漏洞检测的速度。

发明内容
针对目前软件漏洞检测方法存在大量重复工作、影响检测速度的问题,本发明提供一种基于 漏洞模型的软件漏洞模型检测方法。基于软件漏洞的状态机模型,对软件代码进行抽象建模,只 对与漏洞状态相关的程序操作序列进行漏洞静态检测,判断漏洞模型在代码中的存在性。
为实现本发明的所述目的,本发明提供一种基于漏洞模型的软件漏洞模型检测方法,方法主 要步骤包括1)将漏洞模型从数据库中载入流程即装入内存、建立漏洞模型的数据结构,在分 析程序时作为参考依据;
2) 模型检测前段步骤,以函数为单位根据漏洞相关操作进行模型检测工作;
3) 模型检测后段步骤对主函数进行模型检测,根据漏洞相关操作以及前段对函数的模型检 测结果,进行状态检测并报告漏洞的存在性;
所述漏洞模型载入流程漏洞模型由漏洞状态的状态结点、有向边的集合所构成;状态结点 有启始、中间过渡和漏洞识别3种类型,每个状态结点具有状态号、类型和描述等属性;有向边 表示引起状态变化的操作,每个有向边具有边号、类型、原状态、新状态和描述等属性;状态结 点、有向边的集合分别存储在数据库中的一个表中状态结点表和有向边表;为方便模型检测处 理,在内存中建立由有向边类型进行检索的操作转换表;每个类型的有向边对应一个链表,链表 的结点为一个有向边,表示一个原状态到新状态的转换关系;
通过对程序抽象提取处理,过滤去除无关的操作,进行提取与漏洞模型相关的操作序列的流 程每个函数程序特征对应一个操作序列链表,程序特征链表以函数为单位进行组织,操作序列 链表的结点为一个与漏洞状态相关的操作或函数;函数程序特征载入时,将磁盘中程序特征链表 装入内存,初始函数处理标志为INI (值为0)。
本发明的有益效果是可以基于软件漏洞的状态机模型,对软件代码进行抽象建模,对与漏
洞状态相关的程序操作序列进行漏洞静态检测,判断漏洞模型在代码中的存在性。从而提高计算 机软件的可靠性和质量。


图1基于漏洞模型的软件漏洞模型检测方法结构示意图
图2漏洞载入流程图
图3模型检测前段处理流程图
图4为函数状态处理流程图。
图5状态转换处理过程图
图6模型检测后段处理流程图
具体实施方式
本发明方法工作流程如图1-图6所示。
图1所示为本方法实施的整体结构和工作原理。本发明方法根据漏洞模型所涉及的操作对待 检测程序进行分析检测。因此,需要将漏洞模型从数据库中装入内存,以便分析程序时,作为参 考依据;模型检测前段步骤,以函数为单位根据漏洞相关操作进行模型检测工作;模型检测后段 步骤对主函数进行模型检测,根据漏洞相关操作以及前段对函数的模型检测结果,进行状态检测 并报告漏洞的存在性。
图2表示漏洞模型载入流程。漏洞模型由漏洞状态机的状态结点、有向边的集合所构成。状 态结点有启始、中间过渡和漏洞识别等3种类型,每个状态结点具有状态号、类型和描述等属性。 有向边表示引起状态变化的操作,每个有向边具有边号、类型、原状态、新状态和描述等属性。 状态结点、有向边的集合分别存储在数据库中的一个表中状态结点表和有向边表。为方便模型 检测处理,在内存中建立由有向边类型进行检索的操作转换表。每个类型的有向边对应一个链表, 链表的结点为一个有向边,表示一个原状态到新状态的转换关系。
步骤20是初始动作。步骤21在数据库有向边表中取一个有向边的记录。步骤22若取到转 步骤23,否则,转步骤26。步骤23判断取得有向边类型的操作转换表头是否己存在。若己存在 转步骤24,否则,转步骤25。步骤24创建一个有向边结点,结点的边号为该有向边的边号。把 此结点连接到对应有向边类型的链表尾部,转步骤21。步骤25创建该有向边类型的操作转换表 头,创建一个有向边结点,结点的边号为该有向边的边号。把此结点作为该有向边类型的第一个 结点,转步骤21。步骤26是结束,操作转换表建立完成。
通过对程序抽象提取处理,过滤去处无关的操作,提取了与漏洞模型相关的操作序列。程序 特征链表以函数为单位进行组织,每个函数对应一个操作序列链表,链表的结点为一个与漏洞状 态相关的操作或函数。程序特征载入时,将磁盘中程序特征链表装入内存,初始函数处理标志为 INI (值为0)。
图3表示模型检测前段处理流程。开始时,建立函数有向边表,结构与漏洞状态机的有向边 表相同。步骤30是初始动作。步骤31按序取出一个函数程序特征链表结构。步骤32判断该函 数是否为main函数。是则转步骤31,否则转步骤33。步骤33置当前操作为函数操作表头,置 当前状态为ALL (为状态全集合),置函数处理标志为ING (值为1),进行函数状态处理,处理
流程见图4。步骤34判断是否所有函数己被处理完。是则转步骤35,否则转步骤31。步骤35为 结束。
图4所示为一个函数的状态处理流程图。步骤40为开始动作。步骤41取出函数当前操作的 下一个操作为当前操作。步骤42判断是否取到,若取到转步骤43,否则己为函数的最后操作队 尾,则转步骤4b。步骤43判断当前操作是否为漏洞状态机中操作集合中的语句(在有向边类型 集合中)。是则转步骤45,否则转步骤44。步骤44判断当前操作是否为函数调用,是则转步骤 46,否则转步骤41。步骤45以当前操作、当前状态,进行状态转换处理,处理流程见图5。得 到状态转换后的次状态,转步骤41。步骤46若函数处理标志为ED (值为2),则转步骤4a,否 则转步骤47。步骤47若函数处理标志为INI (值为O),则转步骤49,否则转步骤41。步骤49 置当前状态为ALL (状态全集合),置函数处理标志为ING (值为1),进行函数状态处理,处理 流程见图4。步骤4a以调用函数、当前状态,进行状态转换处理,处理流程见图5。得到状态转 换后的次状态,转步骤41。步骤4b判断函数结束时的当前状态是否同初始时的当前状态,是则 步骤4d,否则步骤4c。步骤4c函数有向边表中加入若干条表示〈源状态,新状态〉的函数有向边, 此时边操作为所处理的函数名f ,并同时建立操作转换表链表。步骤4d置函数处理标志为ED (值 为2)。步骤4e为结束。
图5所示为状态转换处理过程。步骤50开始状态。步骤51置次状态为空。步骤52从操作 类型或函数对应的操作转换表中取一个有向边。步骤53判断取到有向边否。若取到,转步骤55, 否则步骤54。步骤54得到状态转换后的次状态,置次状态为新的当前状态,转步骤57。步骤55 判断有向边的源状态是否在当前状态中。是则转步骤56,否则转步骤52。步骤56有向边的新状 态加入次状态,转步骤52。步骤57结束。
图6表示模型检测后段处理流程。步骤60是初始动作。步骤61取函数程序特征链表结构。 步骤62判断该函数是否为main函数,是则转步骤63,否则转步骤61。步骤63置当前操作为函 数操作表头,置当前状态为(INIT(启始)),置main函数处理标志为ING (值为1)。步骤64取出 函数当前操作的下一个操作为当前操作。步骤65判断是否取到,若取到转步骤66,否则已为函 数的最后操作队尾,则转步骤6e。步骤66判断当前操作是否为漏洞状态机中操作集合中的语句 (在有向边类型集合中)。是则转步骤68,否则转步骤67。步骤67判断当前操作是否为函数调 用,是则转步骤69,否则转步骤64。步骤68以当前操作、当前状态,进行状态转换处理,处理 流程见图5。得到状态转换后的次状态,转步骤6c。步骤69若函数处理标志为ED (值为2),则 转步骤6b,否则转步骤6a。步骤6a若函数处理标志为INI (值为0)或ING (值为1),则转步骤 6f,否则转步骤64。步骤6b以调用函数、当前状态,进行调用状态转换处理,处理流程见图5。 得到状态转换后的次状态,转步骤6c。步骤6c判断次状态中是否存在漏洞状态。是则转步骤6d, 否则转步骤64。步骤6d漏洞报警、并从集合去除报警状态,转步骤64。步骤6e置函数处理标 志为ED (值为2)。步骤6f处理出错结束。步骤6g正常结束。
函数main是确定的,其它的要么在漏洞操作中,要么就是普通函数.而且都是不确定的(因程序 而不同)。
权利要求
1.基于漏洞模型的软件漏洞模型检测方法,其特征是步骤包括1)将漏洞模型从数据库中载入流程即装入内存、建立漏洞模型的数据结构,在分析程序时作为参考依据;2)模型检测前段步骤,以函数为单位根据漏洞相关操作进行模型检测工作;3)模型检测后段步骤对主函数进行模型检测,根据漏洞相关操作以及前段对函数的模型检测结果,进行状态检测并报告漏洞的存在性;所述漏洞模型载入流程漏洞模型由漏洞状态的状态结点、有向边的集合所构成;状态结点有启始、中间过渡和漏洞识别3种类型,每个状态结点具有状态号、类型和描述等属性;有向边表示引起状态变化的操作,每个有向边具有边号、类型、原状态、新状态和描述等属性;状态结点、有向边的集合分别存储在数据库中的一个表中状态结点表和有向边表;为方便模型检测处理,在内存中建立由有向边类型进行检索的操作转换表;每个类型的有向边对应一个链表,链表的结点为一个有向边,表示一个原状态到新状态的转换关系;在内存中建立由有向边类型进行检索的操作转换表的流程步骤20初始动作;步骤21在数据库有向边表中取一个有向边的记录;步骤22若取到记录转步骤23,否则,转步骤26;步骤23判断取得有向边类型的操作转换表头是否已存在,若已存在转步骤24,否则,转步骤25;步骤24创建一个有向边结点,结点的边号为该有向边的边号;把此结点连接到对应有向边类型的链表尾部,转步骤21,直到在数据库有向边表中取完有向边的记录;步骤25创建该有向边类型的操作转换表头,创建一个有向边结点,结点的边号为该有向边的边号;把此结点作为该有向边类型的第一个结点,转步骤21;直到在数据库有向边表中取完有向边的记录;步骤26结束,操作转换表建立完成;通过对程序抽象提取处理,过滤去除无关的操作,进行提取与漏洞模型相关的操作序列的流程每个函数程序特征对应一个操作序列链表,程序特征链表以函数为单位进行组织,操作序列链表的结点为一个与漏洞状态相关的操作或函数;函数程序特征载入时,将磁盘中程序特征链表装入内存,初始函数处理标志为INI(值为0)。
2、 根据权利要求1所述的基于漏洞模型的软件漏洞模型检测方法,其特征是模型检测前段 处理流程时,建立函数有向边表,结构与漏洞状态机的有向边表相同步骤30:初始动作;步骤 31:按序取出一个函数程序特征链表结构;步骤32:判断该函数是否为main函数;是则转步骤 31,否则转步骤33;步骤33:置当前操作为函数操作表头,置当前状态为ALL (为状态全集合), 置函数处理标志为ING (值为1),进行函数状态处理流程;步骤34:判断是否所有函数己被处 理完,是则转步骤35,否则转步骤31;步骤35:结束。
3、 根据权利要求1所述的基于漏洞模型的软件漏洞模型检测方法,其特征是函数的状态处 理流程步骤40:开始动作;步骤41:取出函数当前操作的下一个操作为当前操作;步骤42: 判断是否取到,若取到转步骤43,否则已为函数的最后操作队尾,则转步骤4b;步骤43:判断 当前操作是否为漏洞状态机中操作集合中的语句(在有向边类型集合中);是则转步骤45,否则 转步骤44;步骤44:判断当前操作是否为函数调用,是则转步骤46,否则转步骤41;步骤45 : 以当前操作、当前状态,进行状态转换处理流程;得到状态转换后的次状态,转步骤41;步骤 46 :若函数处理标志为ED (值为2),则转步骤4a,否则转步骤47;步骤47:若函数处理标志 为INI (值为0),则转步骤49,否则转步骤41;步骤49:置当前状态为ALL (状态全集合),置 函数处理标志为ING (值为1),进行函数状态处理流程;步骤4a:以调用函数、当前状态,进 行状态转换处理流程,得到状态转换后的次状态,转步骤41;步骤4b:判断函数结束时的当前 状态是否同初始时的当前状态,是则转步骤4d,否则转步骤4C;步骤4C:函数有向边表中加入若干条表示〈源状态,新状态〉的函数有向边,此时边操作为所处理的函数名,并同时建立操作转换表链表;步骤4d:置函数处理标志为ED (值为2);步骤4e:结束。
4、 根据权利要求1所述的基于漏洞模型的软件漏洞模型检测方法,其特征是状态转换处理 过程,步骤50:开始;步骤51:置次状态为空;步骤52:从操作类型或函数对应的操作转换表 中取一个有向边;步骤53:判断取到有向边否,若取到,转步骤55,否则步骤54;步骤54:得到状态转换后的次状态,置次状态为新的当前状态,转步骤57;步骤55:判断有向边的源状态是否在当前状态中,是则转步骤56,否则转步骤52;步骤56:有向边的新状态加入次状态,转步骤52;步骤57:结束。
5、 根据权利要求1所述的基于漏洞模型的软件漏洞模型检测方法,其特征是模型检测后段 处理流程,步骤60:初始动作;步骤61:取函数程序特征链表结构;步骤62:判断该函数是否为main函数,是则转步骤63,否则转步骤61;步骤63:置当前操作为函数操作表头,置当前状 态为UNIT(启始M,置main函数处理标志为ING (值为1);步骤64:取出函数当前操作的下一 个操作为当前操作;步骤65:判断是否取到,若取到转步骤66,否则已为函数的最后操作队尾, 则转步骤6e;步骤66:判断当前操作是否为漏洞状态机中操作集合中的语句(在有向边类型集 合中),是则转步骤68,否则转步骤67;步骤67:判断当前操作是否为函数调用,是则转步骤69,否则转步骤64;步骤68:以当前操作、当前状态,进行状态转换处理流程;得到状态转换后的次状态,转步骤6c;步骤69:若函数处理标志为ED (值为2),则转步骤6b,否则转步骤6a; 步骤6a:若函数处理标志为INI (值为O)或ING (值为1),则转步骤6f,否则转步骤64;步骤6b以调用函数、当前状态,进行调用状态转换处理流程;得到状态转换后的次状态,转步骤6C; 步骤6c:判断次状态中是否存在漏洞状态,是则转步骤6d,否则转步骤64;步骤6d:漏洞报警、 并从集合去除报警状态,转步骤64;步骤6e:置函数处理标志为ED (值为2);步骤6f:处理出 错结束;步骤6g:正常结束。
全文摘要
基于漏洞模型的软件漏洞模型检测方法,步骤如下1)将漏洞模型从数据库中载入流程即装入内存、建立漏洞模型的数据结构,在分析程序时作为参考依据;2)模型检测前段步骤,以函数为单位根据漏洞相关操作进行模型检测工作;3)模型检测后段步骤对主函数进行模型检测,根据漏洞相关操作以及前段对函数的模型检测结果,进行状态检测并报告漏洞的存在性;所述漏洞模型载入流程漏洞模型由漏洞状态的状态结点、有向边的集合所构成;在内存中建立由有向边类型进行检索的操作转换表的流程;通过对程序抽象提取处理,过滤去除无关的操作,进行提取与漏洞模型相关的操作序列的流程;每个函数程序特征对应一个操作序列链表。
文档编号G06F21/00GK101373506SQ200810155450
公开日2009年2月25日 申请日期2008年10月22日 优先权日2008年10月22日
发明者林 张, 曾庆凯 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1