专利名称:一种面向隐蔽通道分析的系统分析和划分方法
技术领域:
本发明涉及高等级安全系统中使用的面向隐蔽通道分析的系统分析和划分方法。
背景技术:
隐蔽通道分析是高等级安全系统开发中不可或缺的环节,对源代码进行隐蔽通道 分析是一种重要手段。随着系统规模和复杂度的不断提高,面对庞大的系统,源代码 分析问题的规模使得工作越来越困难。所以,需要有一种方法,对系统进行源代码分 析和划分,以降低分析工作的规模。
在系统源代码中,函数是分析的基本单位,通过分析函数之间的相互调用关系, 发现函数之间的依赖关系(函数之间的调用和被调用关系),据此进行系统划分,可 以为后续隐蔽通道分析提供分析处理的次序和范围,査找并行分析的可能。本发明提 供一种对函数调用图进行分析和划分方法,可简化此后进行隐蔽通道分析的问题复杂 度,提高分析效率。同时,本方法也可用于其它信息流分析的预处理过程。
发明内容
本发明目的是提出一种面向隐蔽通道分析的系统分析和划分方法。在源代码的 隐蔽通道分析中,针对因系统代码规模庞大、错综复杂,不利于分析处理的问题,提 供一种分析整个系统的函数调用关系,并把系统分成连通分支的方法。
本发明技术方案是面向隐蔽通道分析的系统分析和划分方法,实施系统分析和 划分的工作流程,步骤10:初始化动作;步骤ll:判断函数调用图是否为空,如果为 空转步骤12,表示分析划分算法结束,否则转步骤13;步骤12:输出分析的结果;步 骤13:判断函数调用图是否连通,如果连通转步骤16,否则转步骤14;步骤14:找出 函数调用图所有不连通的分支;步骤15:循环分析函数调用图的每个连通分支;步骤 16:判断函数调用图中是否存在不依赖其他节点的节点,即出度为0的节点;如果存 在节点转步骤17,否则转步骤19;步骤17:找到出度为0的节点;步骤18:把出度为0 的节点从函数调用图中删除,并且把该节点加入结果链表的末尾;结果链表指存储分 析结果的链表,其中的元素可能为连通分支、单个节点或极大强连通子图;序列中的 先后关系表明了元素之间的依赖关系,后面元素只依赖前面的元素;步骤19:判断函 数调用图中是否存在极大强连通子图,并且这个子图没有指向子图外节点的边;如果 存在转步骤la,否则转步骤ll;步骤la:找到函数调用图中的极大强连通子图,并且 该子图没有指向子图外节点的边;步骤lb:删除此极大强连通子图,并且把该子图加 入结果链表末尾。步骤lc:结束状态。
本发明方法包括3个主要步骤,步骤13:判断函数调用图是否连通
步骤16:判断函数调用图中是否存在不依赖其他节点的节点工作流程
步骤19:判断函数调用图中是否存在极大强连通子图
分析函数调用图连通性的流程,分析调用图的连通性,并且记录所有的连通分支。 步骤20:初始动作;步骤21:去除边的方向变为无向图;步骤22:判断这个无向图 是否有节点,如果有转步骤23,否则转步骤27;步骤23:从无向图中任选一个节点, 作为深度优先遍历的起始节点;步骤24:以步骤23选择的节点为起始节点,对无向 图进行深度优先遍历,并且在遍历过程中标记己访问的节点;步骤25:选择所有被 标记的节点,这些节点在有向的函数调用图中组成的子图为它的一个连通分支,找到 这个连通分支;步骤26:记录这个连通分支,即把这个连通分支放入结果集合,且 从无向图中删除所有被标记的节点,转步骤22;步骤27结束状态。己找到函数调用 图中的所有连通分支,并且记录在结果集合中。
判断函数调用图中是否存在不依赖其他节点函数的流程的步骤。函数调用图中的 所有节点被一个链表组织在一起。该过程遍历这个链表,查找是否有出度为0的节点。 步骤30:初始动作;步骤31:取链表的第一个节点;步骤32:判断这个节点的出度 是否为O,如果是转步骤33,否则转步骤34;步骤33:设置返回值为真,并且记录 该出度为O的节点;步骤34:判断是否到链表的末尾,如果是转步骤35,否则转步 骤36;步骤35:设置返回值为假;步骤36:取链表中下一个节点,继续分析;步骤 37:结束状态。
判断寻找函数调用图中极大强连通子图的流程。步骤40:初始动作;步骤41: 判断函数调用图中所有的节点是否都被遍历过,如果是转步骤44,否转步骤42;步 骤42:从函数调用图中选一个没有被遍历过的节点,作为步骤43的起始节点;步骤 43:以步骤42选择的节点开始,深度优先遍历函数调用图;并且在遍历过程中,给
每个节点标记完成访问的时间;步骤44:转置所分析的函数调用图;步骤45:选择 函数调用图中完成时间最大的节点;步骤46:以步骤45选择的节点为起始节点,深 度优先遍历函数调用图;步骤47:选择深度优先遍历过的所有节点,组成一个子图, 此子图即为一个极大强连通子图;步骤48:判断这个子图中的节点是否有指向子图 外节点的边,如果有转步骤4a,没有转步骤49;步骤49:把这个强连通子图放入结 果集合;步骤4a:标记子图中的所有节点。在下次深度优先遍历中,不能访问这些 被标记的节点;步骤4b:判断函数调用图是否全部被标记,如果是转步骤4c,否则 转步骤45;步骤4c:结束状态。
本发明方法对由程序分析工具,如gcc处理系统源代码得到的函数调用图进行分
析,根据函数之间的依赖关系进行系统划分,为后续隐蔽通道分析提供分析次序以及 并行分析的可能。
函数调用图由函数集合和函数间的调用关系表示,表示为一个有向图G。有向图 由节点集合V和边集合E等两部分组成,节点代表一个函数,边代表函数之间的调用
关系,边的方向为从调用函数指向被调用函数。
对函数调用图的分析目的是找到图中的单个函数、连通分支以及极大强连通子
图。
单个函数是不依赖于其他函数的函数。
连通分支是指在一个有向图G中,取消有向图边的方向得到的无向图;任取一个 节点,和这个节点有通路存在的所有的节点组成的子图,为G的一个连通分支。
极大强连通子图是指在有向图G中,如果任意两个不同的顶点相互可达,称该有 向图是强连通的。设有向图G,由顶点集合V和边集合E组成。若V'是V的子集, E'是E的子集,且E'中的边所关联的顶点均在V'中,则由顶点集合V'和边的集合E' 组成的图,称为G的子图。极大强连通子图就是有向图中的强连通子图,并且不能再 加入其他的节点构成更大的强连通子图。
其中各个连通分支在此后的分析过程中可以并行处理,极大强连通子图表示其中 的函数互相依赖, 一般预示着有递归调用存在,需特别处理。本方法的处理结果是这 些元素(包括单个函数、连通分支和极大强连通子图)的一个序列,如图l所示。这 个序列满足这样的依赖关系后面的元素只依赖于前面的元素。于是,这个序列就为 隐蔽通道的分析提供了分析次序。因此,降低了分析工作的复杂度。另外,分析者利 用各个连通分支之间的并行性,可以提高隐蔽通道分析的效率。
本发明方法分析和划分方法主要步骤
(1) 分析函数调用图的连通性。
(2) 寻找函数调用图是否存在不依赖于其他节点的函数。
(3) 寻找函数调用图中没有指向子图外节点的极大强连通子图。
本发明的有益效果是在针对源代码的隐蔽通道分析中,解决因系统代码规模庞
大、错综复杂、不利于分析处理的问题,提供一种分析整个系统的函数调用关系,并 将系统分成连通分支的方法。
图1系统分析和划分示意图
图2系统分析和划分方法工作流程图
图3函数调用图连通性分析的流程图
图4寻找不依赖于其他节点函数的流程图
图5寻找不指向子图外节点的极大强连通子图的流程图
图6深度优先遍历图的流程图
具体实施例方式
图2所示为本方法实施系统分析和划分的工作流程。步骤10是初始化动作。步骤 ll判断函数调用图是否为空。如果为空转步骤12,表示分析划分算法结束。否则转步 骤13。步骤12输出分析的结果,以便分析者使用。步骤13判断函数调用图是否连通。 如果连通转步骤16,否则转步骤14。步骤14找出函数调用图所有不连通的分支。步骤 15循环分析函数调用图的每个连通分支。分析过程和分析整个函数调用图的过程相同。并且提示分析者这些不连通的分支可以并行处理。步骤16判断函数调用图中是否 存在不依赖其他节点的节点,即出度为0的节点。在有向图中,节点出度指作为边的 始点的次数。如果存在转步骤17,否则转步骤19。步骤17找到出度为0的节点。步骤 18把出度为0的节点从函数调用图中删除,并且把该节点加入结果链表的末尾。结果 链表指存储分析结果的链表,其中的元素可能为连通分支、单个节点或极大强连通子 图;序列中的先后关系表明了元素之间的依赖关系,后面元素只依赖前面的元素。步 骤19判断函数调用图中是否存在极大强连通子图,并且这个子图没有指向子图外节点 的边。如果存在转步骤la,否则转步骤ll。步骤la找到函数调用图中的极大强连通子 图,并且该子图没有指向子图外节点的边。步骤lb删除此极大强连通子图,并且把该 子图加入结果链表末尾。步骤lc结束状态。在结束时,结果链表中存放着对系统划分 的结果,其中的先后次序代表了函数之间的依赖关系,后面的元素依赖前面的元素。 不连通的子图之间预示着并行分析的可能。
本发明方法包括3个主要步骤,工作流程如图3-图5所示。
图3表示分析函数调用图连通性的流程,分析调用图的连通性,并且记录所有的 连通分支。步骤20是初始动作。步骤21去除边的方向变为无向图,即去除函数调用 图中边的方向,把函数调用图变成无向图。这个过程如果存在a+b和b》a的边,则 需要把这两条边合并成一条边。因为无向图中两个顶点之间最多只有一条边。步骤 22判断这个无向图是否有节点。如果有,转步骤23,否则转步骤27。步骤23从无 向图中任选一个节点。作为下一步深度优先遍历的起始节点。步骤24以步骤23选择 的节点为起始节点,对无向图进行深度优先遍历。(流程见图6)并且在遍历过程中 标记已访问的节点。步骤25选择所有被标记的节点,这些节点在有向的函数调用图 中组成的子图为它的一个连通分支。找到这个连通分支。步骤26记录这个连通分支, 即把这个连通分支放入结果集合,并且从无向图中删除所有被标记的节点,转步骤 22。步骤27结束状态。此时,已经找到函数调用图中的所有连通分支,并且记录在 结果集合中。
图4表示判断函数调用图中是否存在不依赖其他节点函数的流程。函数调用图中 的所有节点被一个链表组织在一起。该过程遍历这个链表,査找是否有出度为O的节 点。步骤30初始动作。步骤31取链表的第一个节点。步骤32判断这个节点的出度 是否为O。如果是转步骤33,否则转步骤34。步骤33设置返回值为真,并且记录该 出度为0的节点。步骤34判断是否到链表的末尾。如果是转步骤35,否则转步骤36。 步骤35设置返回值为假。步骤36取链表中下一个节点,继续分析。步骤37结束状 态。此时,返回值代表函数调用图中是否存在出度为O的节点,即不依赖其他函数的 函数。如果有,结果中记录了出度为O的节点。
图5表示寻找函数调用图中极大强连通子图的流程,并且这个强连通子图中节点 没有指向子图外节点的边。步骤40初始动作。步骤41判断函数调用图中所有的节点
是否都被遍历过?如果是转步骤44,否转步骤42。步骤42从函数调用图中选一个没 有被遍历过的节点,作为步骤43的起始节点。步骤43以步骤42选择的节点开始, 深度优先遍历函数调用图(流程见图6)。并且在遍历过程中,给每个节点标记完成 访问的时间(访问时间不是具体的时间,是一个全局变量,每访问一个节点,就加l。 当访问完这个节点的所有后继时,也完成了对这个节点的处理,此时,给这个全局变 量加1,并且记录这个变量,这个变量此时的值即为这个节点完成访问的时间)。步 骤44转置所分析的函数调用图,即函数调用图中的有向边的方向倒置。步骤45选择 函数调用图中完成时间最大的节点。步骤46以步骤45选择的节点为起始节点,深度 优先遍历函数调用图。步骤47选择深度优先遍历过的所有节点,组成一个子图,此 子图即为一个极大强连通子图。步骤48判断这个子图中的节点是否有指向子图外节 点的边。如果有转步骤4a,没有转步骤49。步骤49把这个强连通子图放入结果集合。 步骤4a标记子图中的所有节点。在下次深度优先遍历中,不能访问这些被标记的节 点。步骤4b判断函数调用图是否全部被标记,如果是转步骤4c,否则转步骤45。步 骤4c为结束状态。此时,需要寻找的没有边指向子图之外的极大强连通子图如果存 在,则存放在结果集合中。否则,结果集合为空。
图6为深度优先遍历图的流程图,从指定节点开始,递归对它的后继节点进行遍 历。步骤50初始动作。步骤51选取指定的开始节点(开始节点由深度优先遍历的调 用动作指定)。步骤52标记这个节点被访问。步骤53选取开始节点的第一个后继节 点。步骤54判断这个后继节点是否被访问,即它是否被标记,如果被访问,转步骤 56,否则,转步骤55。步骤55递归访问这个后继节点。即以此节点为开始节点,调 用深度优先遍历算法。步骤56判断是否取完了开始节点的所有后继节点,如果取完, 转步骤58,否则转步骤57。步骤57选取下一个后继节点,转步骤54对它进行分析。 步骤58为结束状态。此时,深度优先遍历结束。
权利要求
1、面向隐蔽通道分析的系统分析和划分方法,其特征是工作流程如下,步骤10初始化动作;步骤11判断函数调用图是否为空,如果为空转步骤12,表示分析划分算法结束,否则转步骤13;步骤12输出分析的结果;步骤13判断函数调用图是否连通,如果连通转步骤16,否则转步骤14;步骤14找出函数调用图所有不连通的分支;步骤15循环分析函数调用图的每个连通分支;步骤16判断函数调用图中是否存在不依赖其他节点的节点,即出度为0的节点;如果存在节点转步骤17,否则转步骤19;步骤17找到出度为0的节点;步骤18把出度为0的节点从函数调用图中删除,并且把该节点加入结果链表的末尾;结果链表指存储分析结果的链表,其中的元素可能为连通分支、单个节点或极大强连通子图;序列中的先后关系表明了元素之间的依赖关系,后面元素只依赖前面的元素;步骤19判断函数调用图中是否存在极大强连通子图,并且这个子图没有指向子图外节点的边;如果存在转步骤1a,否则转步骤11;步骤1a找到函数调用图中的极大强连通子图,并且该子图没有指向子图外节点的边;步骤1b删除此极大强连通子图,并且把该子图加入结果链表末尾;步骤1c结束。
2、 根据权利要求1所述的面向隐蔽通道分析的系统分析和划分方法,其特征是 分析函数调用图连通性的流程如下,分析调用图的连通性,并且记录所有的连通分支; 步骤20:初始动作;步骤21:去除边的方向变为无向图;步骤22:判断这个无向图 是否有节点,如果有转步骤23,否则转步骤27;步骤23:从无向图中任选一个节点,作为深度优先遍历的起始节点;步骤24:以步骤23选择的节点为起始节点,对无向 图进行深度优先遍历,并且在遍历过程中标记已访问的节点;步骤25:选择所有被标记的节点,这些节点在有向的函数调用图中组成的子图为它的一个连通分支,找到这个连通分支;步骤26:记录这个连通分支,即把这个连通分支放入结果集合,且 从无向图中删除所有被标记的节点,转步骤22;步骤27结束状态,找到函数调用图中的所有连通分支,并且记录在结果集合中。
3、 根据权利要求1所述的面向隐蔽通道分析的系统分析和划分方法,其特征是 判断函数调用图中是否存在不依赖其他节点函数的流程是;步骤30:初始动作;步 骤31:取链表的第一个节点;步骤32:判断这个节点的出度是否为0,如果是转步 骤33,否则转步骤34;步骤33:设置返回值为真,并且记录该出度为O的节点;步 骤34:判断是否到链表的末尾,如果是转步骤35,否则转步骤36;步骤35:设置返 回值为假;步骤36:取链表中下一个节点,继续分析;步骤37:结束状态。
4、 根据权利要求1所述的面向隐蔽通道分析的系统分析和划分方法,其特征是 判断寻找函数调用图中极大强连通子图的流程是,步骤40:初始动作;步骤41:判断函数调用图中所有的节点是否都被遍历过,如果是转步骤44,否转步骤42;步骤42:从函数调用图中选一个没有被遍历过的节点,作为步骤43的起始节点;步骤43: 以步骤42选择的节点开始,深度优先遍历函数调用图;并且在遍历过程中,给每个 节点标记完成访问的时间;步骤44:转置所分析的函数调用图;步骤45:选择函数 调用图中完成时间最大的节点;步骤46:以步骤45选择的节点为起始节点,深度优 先遍历函数调用图;步骤47:选择深度优先遍历过的所有节点,组成一个子图,此 子图即为一个极大强连通子图;步骤48:判断这个子图中的节点是否有指向子图外 节点的边,如果有转步骤4a,没有转步骤49;步骤49:把这个强连通子图放入结果 集合;步骤4a:标记子图中的所有节点。在下次深度优先遍历中,不能访问这些被 标记的节点;步骤4b:判断函数调用图是否全部被标记,如果是转步骤4c,否则转 步骤45;步骤4C:结束。
5、根据权利要求2、 3或4所述的面向隐蔽通道分析的系统分析和划分方法,其 特征是深度优先遍历图的流程是,从指定节点开始,递归对它的后继节点进行遍历; 步骤50:初始动作;步骤51:选取指定的开始节点;步骤52:标记这个节点被访问; 步骤53:选取开始节点的第一个后继节点;步骤54:判断这个后继节点是否被访问, 即它是否被标记,如果被访问,转步骤56,否则,转步骤55;步骤55:递归访问这 个后继节点;步骤56:判断是否取完了开始节点的所有后继节点,如果取完,转步 骤58,否则转步骤57;步骤57:选取下一个后继节点,转步骤54对它进行分析; 步骤58:结束。
全文摘要
面向隐蔽通道分析的系统分析和划分方法,步骤10初始化动作;步骤11判断函数调用图是否为空,如果为空转步骤12,表示分析划分算法结束,否则转步骤13;步骤12输出分析的结果;步骤13判断函数调用图是否连通;步骤14找出函数调用图所有不连通的分支;步骤15循环分析函数调用图的每个连通分支;步骤16判断函数调用图中是否存在不依赖其他节点的节点;步骤18把出度为0的节点从函数调用图中删除,并且把该节点加入结果链表的末尾;步骤19判断函数调用图中是否存在极大强连通子图;如存在转步骤1a,否则转步骤11;步骤1a找到函数调用图中极大强连通子图;步骤1b删除此极大强连通子图,步骤1c结束。
文档编号G06F11/36GK101364203SQ200810156069
公开日2009年2月11日 申请日期2008年9月19日 优先权日2008年9月19日
发明者支雷磊, 曾庆凯 申请人:南京大学