法律状态公告日
法律状态信息
法律状态
2013-12-11
未缴年费专利权终止 IPC(主分类):G06F21/22 授权公告日:20100421 终止日期:20121022 申请日:20081022
专利权的终止
2010-04-21
授权
授权
2009-04-22
实质审查的生效
实质审查的生效
2009-02-25
公开
公开
技术领域
本发明涉及计算机软件的漏洞检测方法,尤其是基于漏洞模型检测的软件漏洞的方法。
背景技术
随着软件规模和复杂性的扩大,其中隐藏的安全漏洞不断增加,受到攻击而遭受损失的威胁也不断增加。阻止系统攻击和入侵的根本解决途径是在软件缺陷被利用之前发现并将其消除。针对软件安全漏洞进行软件代码检测是预测和防范漏洞的重要手段之一。漏洞静态检测是比较有效的代码漏洞检测技术,而漏洞模型检测方法则是其中一种具有代表性的检测方法。我们提出一种基于漏洞的状态机模型的模型检测方法,以提供对软件代码中可能存在的漏洞进行自动检测。
目前的基于漏洞模型的软件漏洞检测方法在检测过程中存在着重复检查等缺点,检测速度上显得不足,影响着漏洞检测方法的适用性。因此,我们提出一种具有较高检测速度的检测方法,该方法并不采用原有的模拟程序执行流程的检测顺序,而是只检测与漏洞模型相关的程序操作特征,以提高软件漏洞检测的速度。
发明内容
针对目前软件漏洞检测方法存在大量重复工作、影响检测速度的问题,本发明提供一种基于漏洞模型的软件漏洞模型检测方法。基于软件漏洞的状态机模型,对软件代码进行抽象建模,只对与漏洞状态相关的程序操作序列进行漏洞静态检测,判断漏洞模型在代码中的存在性。
为实现本发明的所述目的,本发明提供一种基于漏洞模型的软件漏洞模型检测方法,方法主要步骤包括: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(值为0),则转步骤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是确定的,其它的要么在漏洞操作中,要么就是普通函数.而且都是不确定的(因程序而不同)。
机译: 基于文档对象模型的跨站点脚本攻击漏洞的检测方法,装置,终端和媒体
机译: 一种基于实时模型的结构异常检测方法
机译: 一种基于实时模型的结构异常检测方法