一种通讯软件的安全性的自动化验证方法

文档序号:26800187发布日期:2021-09-29 01:46阅读:99来源:国知局
一种通讯软件的安全性的自动化验证方法

1.本发明属于形式化验证的技术领域,具体涉及一种通讯软件的安全性的自动化验证方法。


背景技术:

2.随着信息技术的不断发展,互联网中的安全问题层出不穷,通讯软件的存在的漏洞和问题也日益凸显,因此对通讯软件的形式化验证技术也越来越受到关注。
3.现有的对于通讯软件的形式化验证技术主要是模型检测的技术,模型检测主要是通过对整个通讯软件进行人为的分析,提取通讯软件中的状态机,然后通过现有的形式化验证工具进行建模,最后将建立好的通讯软件模型进行分析。
4.但是现有的技术方案都是需要纯人为分析建模等,无法实现自动化的效果,而且纯人为分析的准确性和一致性无法得到保证。完成对一个通讯软件的分析建模通常需要耗费的精力相对较多,且效率比较低。因此需要一种自动化的方式帮助提高形式化验证的效率、准确性和一致性。


技术实现要素:

5.本发明的目的是提供一种能够提高形式化验证的效率、准确性和通讯软件的一致性的通讯软件的安全性的自动化验证方法。
6.为达上述目的,本发明提供了一种通讯软件的安全性的自动化验证方法,包括如下步骤:
7.步骤1、将待分析的通信软件c或c++代码,通过软件代码分析工具分析,获得对应软件函数调用关系图并导出对应的html和xml文件;
8.步骤2、根据导出的html和xml文件获得待验证的通讯软件的入口和出口函数;
9.步骤3、根据上述获取的通讯软件的入口和出口函数,自动提取功能函数,建立通讯软件的执行链表;
10.步骤4、利用上述步骤建立的执行链表,将链表每一个结点视为一个状态,根据状态的先后关系建立状态转移序列,以此建立状态机模型;
11.步骤5、利用所建立的状态机模型,编写基于spin脚本的安全验证模型;
12.步骤6、将安全性验证模型通过模型检测工具进行分析,生成通讯软件的流程模型,比较通讯软件的设计流程与生成的流程模型,完成一致性验证。
13.进一步的,所述步骤1、将待验证的通讯软件的代码导入doxygen中运行的过程是:首先,打开doxygen软件,开始配置doxygen输入输出文件格式,包括配置doxygen工作目录、配置源码所在目录、配置文档输出目录;然后依次进行mode菜单、output菜单、diagram菜单、expert菜单、expert标签、input界面的设定;最后,进入doxygen运行界面,单机run按钮,运行doxygen。
14.进一步的,所述步骤2、获得待验证的通讯软件的入口和出口的过程是:通过html
页面获取待的验证的通讯软件的函数调用关系图,通过函数调用关系图确定通讯软件的入口函数和出口函数;通过解析xml文件获取有关通讯软件的函数的相关信息,获取元素树,遍历元素树确定待验证的通讯软件的入口函数的名称和出口函数的名称。
15.进一步的,所述步骤3、根据上述获取的通讯软件的入口和出口函数,自动提取功能函数,建立通讯软件的执行链表的具体过程是:通过观察html显示的函数调用图上体现出的功能函数与出入口函数之间的关系,发现在以入口函数开始生成的调用图中,以出口函数为起始点向前查找,分支最多的层中的函数就是功能函数。
16.进一步的,所述步骤4、利用上述步骤建立的执行链表,将链表每一个结点视为一个状态,根据状态的先后关系建立状态转移序列,以此建立状态机模型的具体过程是:依据已经提取的状态,从html文件中获取状态的先后关系,依据html文件中的状态先后顺序,建立状态间的连接,连接建立完成之后,从xml文件中获取状态之间发生的条件,将条件设置为状态转移的动作。
17.本发明的优点是:本发明提供一种通讯软件的安全性的自动化验证方法,不需要纯人为分析建模等,从而实现自动化的效果,而且能够提高对通讯软件分析的准确性和一致性;提高了通讯软件的分析建模的效率节省了人工成本;本方法提供一种有效的安全验证途径,能帮助通讯软件的使用者发现通讯软件存在的安全问题,并在实现中及时作出调整,避免通讯软件所产生的安全问题导致后续使用者造成不可避免的损失。其次,相比于传统的软件测试,采用形式化的方式,更能从全局把控通讯软件,找出通讯软件设计层面的问题,从而帮助使用者在早期就能发现问题。
18.下面结合附图和实施例对本发明做详细说明。
附图说明
19.图1为本发明的结构图。图2为本发明的步骤流程图。
20.图3为本发明的代码抽象架构。图4为doxygen源码上传图。
21.图5为doxygen编程语言配置图。图6为doxygen结果生成配置图。
22.图7为图表输出配置图。图8为工程项目配置图。
23.图9为项目函数选择分析配置图。图10为工程文件格式配置图。
24.图11为doxygen运行结果图。图12为函数调用关系图。
25.图13为xml生成图。图14为邻接链表图
26.图15为邻接链表字段释义图图16为通讯软件出入口函数提取图。
27.图17为函数判断算法实现图。图18为邻接链表建立的算法实现图。
28.图19为spin界面图。图20为spin脚本验证图。
29.图21为通讯软件交互流程图。图22为通讯软件的实现流程图。
具体实施方式
30.为进一步阐述本发明达成预定目的所采取的技术手段及功效,以下结合附图及实施例对本发明的具体实施方式、结构特征及其功效,详细说明如下。
31.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
32.实施案例1
33.通讯软件的安全性的自动化验证方法,包括如下步骤:
34.步骤1、将待分析的通信软件c或c++代码,通过软件代码分析工具(例如doxygen)分析,获得对应软件函数调用关系图并导出对应的html和xml文件;
35.步骤2、根据导出的html和xml文件获得待验证的通讯软件的入口和出口函数;
36.步骤3、根据上述获取的通讯软件的入口和出口函数,自动提取功能函数,建立通讯软件的执行链表;
37.步骤4、利用上述步骤建立的执行链表,将链表每一个结点视为一个状态,根据状态的先后关系建立状态转移序列,以此建立状态机模型;
38.步骤5、利用所建立的状态机模型,编写基于spin脚本的安全验证模型;
39.步骤6、将安全性验证模型通过模型检测工具(例如spin)进行分析,生成通讯软件的流程模型,比较通讯软件的设计流程与生成的流程模型,完成一致性验证。
40.进一步的,所述步骤1、将待验证的通讯软件的代码导入doxygen中运行的过程是:首先,打开doxygen软件,开始配置doxygen输入输出文件格式,包括配置doxygen工作目录、配置源码所在目录、配置文档输出目录;然后依次进行mode菜单、output菜单、diagram菜单、expert菜单、expert标签、input界面的设定;最后,进入doxygen运行界面,单机run按钮,运行doxygen。
41.进一步的,所述步骤2、获得待验证的通讯软件的入口和出口的过程是:通过html页面获取待验证的通讯软件的函数调用关系图,通过函数调用关系图确定通讯软件的入口函数和出口函数;通过解析xml文件获取有关通讯软件的函数的相关信息,获取元素树,遍历元素树确定待验证的通讯软件的入口函数的名称和出口函数的名称。
42.进一步的,所述步骤3、根据上述获取的通讯软件的入口和出口函数,自动提取功能函数,建立通讯软件的执行链表的具体过程是:通过观察html显示的函数调用图上体现出的功能函数与出入口函数之间的关系,发现在以入口函数开始生成的调用图中,以出口函数为起始点向前查找,分支最多的层中的函数就是功能函数。
43.进一步的,所述步骤4、利用上述步骤建立的执行链表,将链表每一个结点视为一个状态,根据状态的先后关系建立状态转移序列,以此建立状态机模型的具体过程是:依据已经提取的状态,从html文件中获取状态的先后关系,依据html文件中的状态先后顺序,建立状态间的连接,连接建立完成之后,从xml文件中获取状态之间发生的条件,将条件设置为状态转移的动作。
44.综上所述,该种通讯软件的安全性的自动化验证方法,不需要纯人为分析建模等,从而实现自动化的效果,而且提高对通讯软件分析的准确性和一致性无法;提高了通讯软件的分析建模的效率节省了人工成本。
45.实施案例2
46.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明的具体实施方式做详细的说明。
47.在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施方式的限制。
48.为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的实施方式作进一步地详细描述。
49.本发明提供如下技术方案:一种通讯软件的安全性的自动化验证方法,在使用过程中,提高验证效率、建模的准确性和一致性。
50.作为本发明所述的一种通讯软件的安全性的自动化验证方案,其中:包括如下步骤:
51.s1:首先打开doxygen软件,开始配置doxygen输入输出文件格式,具体步骤如下:
52.刚进入doxygen界面时,首先可以看到有两步,第一步配置doxygen工作目录,doxygen工作目录,就是用来存放配置文件的目录(可以不配置)。在这里,选择配置好doxygen的工作目录。然后就是第二步,首先我们处在wizard菜单下,需要配置源码所在目录以及配置文档输出目录。上方的项目名称项目版本或id都可以不填写,在下方源码目录中将已有的源码导入,在源码下方有个复选框,指的是递归搜索文件目录,需要勾选,接着在最下方的那个是目标目录用于存放运行后的结果,建立一个名为out的文件夹,然后将此文件夹导入,如图4所示。
53.然后选择mode菜单,会出现模型界面,在模型界面中选择期望的输出模型:这里选择所有实体,下方交叉引用的复选框并不需要选择,如果文件存在交叉引用,那么在勾选,再下方是选择程序语言的类型包含多种:c++、java、c#、python等,由于验证的通讯软件是采用c++语言编写故选择第一项单选按钮,如图5。
54.接着选择output菜单栏,会出现你需要生成的输出文件格式,第一个复选框是生成html文件,在这里选择生成带有chm的html文件且勾选带有搜索函数的复选框。同时勾选下方xml复选按钮,由于以下步骤中需要使用到xml的分析,因此需要生成xml文件,如图6。
55.然后就是选择diagram菜单,也就是图表输出配置。由于需要使用graphviz生成器,因此选择第三个单选按钮,由于分析通讯软件代码的文件需要了解文件与文件的依赖、类成员、协作关系、调用关系,因此需要将下方的生成图的关系需要全部勾选,如图7。
56.接下来选择expert菜单,可以细化doxygen配置。进入expert后选择下方project标签,进入后细化配置项目,首先是配置项目编码格式,由于c++通讯软件代码大部分均为utf

8,因此utf

8是首选。然后是output_language配置输出语言,在此选择english。往下继续是tab_size,主要是帮助文件中代码的缩进尺寸,譬如@code和@endcode段中代码的排版,在此设置成4。subgrouping这个选项选择后,输出将会按类型分组,由于通讯软件中是进行分类的,在这里需要勾选,其余部分均采用默认设置即可,如图8。
57.选择expert标签下的build,build页面,这个页面是生成帮助信息中比较关键的配置页面:extract_all表示:输出所有的函数,但是private和static函数不属于其管制;extract_private表示:输出private函数;extract_static表示:输出static函数。同时还有几个extract,相应查看文档即可;hide_undoc_members表示:那些没有使用doxygen格式描述的文档(函数或类等)就不显示了,当然,如果extract_all被启用,那么这个标志其实是被忽略的;internal_docs主要指:是否输出注解中的@internal部分。如果没有被启动,那么注解中所有的@internal部分都将在目标帮助中不可见;case_sense_names表示:是否关注大小写名称,注意,如果开启了,那么所有的名称都将被小写。对于c/c++这种字母相关的语言来说,建议永远不要开启;hide_scope_names表示:域隐藏,建议永远不要开启;
show_include_files表示:是否显示包含文件,如果开启,帮助中会专门生成一个页面,里面包含所有包含文件的列表;inline_info:如果开启,那么在帮助文档中,inline函数前面会有一个inline修饰词来标明;sort_member_docs:如果开启,那么在帮助文档列表显示的时候,函数名称会排序,否则按照解释的顺序显示;generate_todolist:是否生成todolist页面,如果开启,那么包含在@todo注解中的内容将会单独生成并显示在一个页面中,其他的generate选项同;show_used_files:是否在函数或类等的帮助中,最下面显示函数或类的来源文件;show_files:是否显示文件列表页面,如果开启,那么帮助中会存在一个一个文件列表索引页面。在这里进行如下配置,其余并未涉及的属性皆可以按默认配置,如图9。
58.接着进入input界面,在input_encoding中配置源码编码格式,输入的源文件的编码,要与源文件的编码格式相同。如果源文件不是utf

8编码最好转一下。文件名符合file_patterns都会被处理。其中包括了.c、.h、.py等等。如果文件的扩展名并不在file_patterns内,那么可以加上去。那我们可以编辑doxyfile配置文件满足这一需求,需要2个步骤:(1)在file_patterns中添加*.ccc;(2)在extension_mapping中添加映射规则ccc=c,如图10。语法是ext=language,其中language可以取的值有:idl、java、javascript、c#、c、c++、d、php、objective

c、python、fortran、vhdl如图10。
59.直接进入doxygen运行界面,单机run按钮,运行doxygen。通过doxygen的输出,可以获得两个必须的文件,一个是xml文件,还有一个是html文件,如图11。所生成的通讯软件的函数调用关系图以及所生成通讯软件的xml文件如图12、13所示。
60.s2:首先通过xml文件提取出函数之间的调用关系,可以以邻接表的形式进行保存,如图14示。邻接表中除了包含xml文件中的一些关键信息外,还给每个函数建立一个reference和一个referenced字段分别用来保存它调用的函数和调用它的函数,各个字段及其含义如图15所示。一个程序必定有出口和入口,不同实体之间实现交互需要从初始状态转换到发送状态,最终会运行到程序的出口函数。利用xml文件进行代码入口和出口的自动化查找。入口函数作为初始状态是整个程序开始地方,它不被任何函数所调用,并且以入口函数起始生成的调用图的节点数一定是最多的,因此对每一个referenced字段为空的函数为入口建立表示调用关系的邻接链表,然后找出节点数最多的,该函数就是程序最开始的入口函数。而可能的出口则是reference字段为空的函数,并且由于要寻找的出口函数直接或间接被进行交互的功能函数调用,因此它的前置节点个数一般会比其他的处于调用图末端的函数多。当然由于它可能并不是直接被功能函数调用,前置节点的个数并不一定是最多的,所以按前置节点个数进行从大到小的排序,找到最多的几个作为备选项。由于与功能函数相关的发送函数可能存在多个,因而出口函数也可能存在多个,不同的出口可能对应到与不同实体之间的交互,而提取出来备选的其中的一些可能并不是用来将自身处理的信息移交给别的参与者的,所以需要进行选择。选择的依据是看这个函数是否是发送函数或者是否被发送函数调用。根据所选择的出口函数我们可以自动找到它所对应的功能函数。这些功能函数体现的就是这个实体所需要和其他实体进行交互的行为。
61.s3:功能函数需要通过调用出口函数来与其他实体之间进行交互。通过观察html显示的函数调用图上体现出的功能函数与出入口函数之间的关系,发现在以入口函数开始生成的调用图中,以出口函数为起始点向前查找,分支最多的层中的函数就是功能函数。因此实现以下自动提取功能函数的算法,以保存了调用关系的xml文件为输入,算法流程如
下:
62.第一步:以所选择的出口函数为根节点,递归建立函数调用关系邻接表。选择出口函数的依据可以参考生成的html函数调用图。
63.第二步:从根节点开始,利用广度优先搜索做层序遍历,将每一层中的函数加入一个队列和结果列表中,并计算该层中函数个数。如果该层函数的个数少于上一层,则保留结果列表中的函数,如果该层函数个数多于上一层,则将结果列表中的函数进行替换。并且对结果列表中的函数进行去重。
64.第三步:当所有路径都搜索到入口函数则结束搜索,输出结果列表中的函数。
65.根据入口函数和出口函数以及功能函数可以建立一个完整的通讯软件的执行链表,此执行链表可以表示为通讯软件的执行过程。出入口函数的搜索算法及函数的判断算法的代码实现如图16、17。
66.s4:根据上述步骤获得的通讯软件的执行链表,将此邻接链表的每一个结点都可以视为一个状态,将每个结点与下一个结点之间的指向过程视为状态转移的过程,中间的调用过程就是两个状态之间转移的动作,由此可以建立一个状态转移图,通过对获取的状态转移图中的状态进行形式化定义可以得到基于形式化的状态机图,此状态机图就是所需的状态机模型,邻接链表建立的算法实现如图18。
67.s5:根据s5步骤,得到状态机模型,根据已有的状态机模型(邻接链表),基于spin的软件验证工具,建立通讯软件的交互模型,编写spin脚本语言实现此状态机。
68.首先打开ispin的工具,会出现以下的界面(图19),默认标签栏处于edit/view处,最左边是建模语言的输入框,可以将你所需要建立的通讯软件模型通过promela语言描述后写在此处,或者可以通过open打开一个已经建立好的文件(文件最好是pml文件)。打开已经编写好的spin脚本,并且单击syntax check进行语法检查。
69.如果没有任何语法问题,那么选择simulate/replay选项,其中包含模型的随机、交互式或引导模拟相关的所有选项。(re)run、stop和rewind按钮分别表示(重新)开始模拟运行,停止它,并将完成的运行退回至开始。step forward/step backward通过先前的执行向前/向后移动一步。右上角的框显示了由spin执行的后台命令,以生成输出,

p表示promela过程在每个时间步的状态变化;

g显示每个时间步上全局变量的当前值;

l显示拥有局部变量的进程状态改变后的当前值,它最好与选项

p结合使用;

r显示所有消息接收事件。它显示了执行接收的流程、其名称和编号、源行号、消息参数号(每个参数对应一行)、消息类型以及消息通道号和名称;

s显示所有消息发送事件;在这里采用默认的方式进行呈现。由于模拟以随机的方式解决了不确定性选择,所以这种情况不一定总是存在。要强制可重复运行,可以使用选项

n n(后面可以加上lynch用来表示随机数生成器,n表示种子的值,也可以在rondom with seed中自行定义);

u n表示限制最大的步骤。在该框下方,对应于模拟运行的消息序列图显示了每个进程通过通道发送和接收的消息。选择run按钮,进行模拟验证,如图20为通讯软件的脚本及模拟模型。
70.然后进入verfication选项,首先,选择要进行的验证类型(safety或liveness),选择safety,那么可以选择验证deadlock(死锁)和promela自带的assert语句。选择liveness可以选择(non

process cycle)无进程环,最后一个单选框是弱公平性检查。在这里选择验证safety以及deadlock属性。
71.s6:对于通讯软件的一致性验证主要是对功能函数间可能的运行顺序和正常的交互过程进行比较,从之前所生成的这个交互流程可以看到,代码中功能函数之间的交互确实可以与设计方案中的正常交互流程对应上。最后将经过spin模拟的通讯软件过程与之前设计的通讯软件过程进行对比,发现自动化提取的通讯软件状态流程与之前设计的通讯软件流程相似,即完成了通讯软件的一致性验证,有关通讯软件的安全性验证在s6中可以得到,有关通讯软件的设计流程如图21,有关通讯软件的实现流程如图22。
72.以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1