CN112765031A - 一种群智化漏洞挖掘任务的分解方法 - Google Patents

一种群智化漏洞挖掘任务的分解方法 Download PDF

Info

Publication number
CN112765031A
CN112765031A CN202110093372.3A CN202110093372A CN112765031A CN 112765031 A CN112765031 A CN 112765031A CN 202110093372 A CN202110093372 A CN 202110093372A CN 112765031 A CN112765031 A CN 112765031A
Authority
CN
China
Prior art keywords
function
similarity
functions
path
vulnerability
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202110093372.3A
Other languages
English (en)
Other versions
CN112765031B (zh
Inventor
孙海龙
王惠民
王婧
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beihang University
Original Assignee
Beihang University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beihang University filed Critical Beihang University
Priority to CN202110093372.3A priority Critical patent/CN112765031B/zh
Publication of CN112765031A publication Critical patent/CN112765031A/zh
Application granted granted Critical
Publication of CN112765031B publication Critical patent/CN112765031B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明通过软件工程、信息安全和人工智能领域的方法,实现了一种群智化漏洞挖掘任务的分解方法。方法包含预处理、相关指标计算和聚类三个步骤。在提取源代码中所有函数的调用链之后,采用预处理算法对所述调用链进行处理;进而依次计算每个函数的复杂度指标、任意两个函数在功能上的相似度、任意两个函数在可能存在漏洞上的相似度三个指标;最后利用最少任务数量、最小相似度和最大工作量三个参数结合所述类的预估工作量和调用链之间的相似度形成类,并将每个类作为子任务进行输出。最终形成能够将任务分解为子任务间相关性较低、子任务内相关性较高的若干子任务,同时通过关键词提取,给出每个子任务的提示的任务分解方法。

Description

一种群智化漏洞挖掘任务的分解方法
技术领域
本发明涉及软件工程、信息安全和人工智能领域,尤其涉及一种群智化漏洞挖掘任务的分解方法。
背景技术
漏洞是由于在技术、管理和人为等因素的影响下,在系统设计、实现和运行方面所存在的无法避免的缺陷或错误。近年来,计算机软件呈现出规模扩大化、技术多元化和功能复杂化的特征,导致软件安全漏洞频现。而随着计算机软件的广泛应用,由于漏洞而产生的安全隐患不可小视。若不加以戒备,可能产生非常严重的后果。对于软件来说,漏洞不可避免,因此需要通过安全测试人员尽可能早地发现漏洞并修复漏洞,防止漏洞被利用,从而保证软件的安全。目前的漏洞挖掘工作大多依靠单个安全测试人员,然而一个人的能力是有限的,如果能够发挥群智力量,就能够提升漏洞挖掘的效率、准确性和全面性。群体智能是指在多人合作的环境中,群体表现出的能力超过每个个体的能力的一种情况。目前对于群智理论的探索得到了越来越多的重视,群智理论在许多领域已经得到了应用。然而,有效利用群智进行漏洞挖掘仍是一个有待深入研究的方向。任务分解是群智化漏洞挖掘首先要解决的问题,之后才能进行任务分配等工作。但是由于软件的复杂性和整体性以及漏洞的不可预知性,群智化漏洞挖掘任务分解工作面临着较大挑战。
在传统软件开发领域,有一些已经得到广泛应用的任务分解算法。对于软件开发工作,一般使用工作分解结构(Work Breakdown Structure,WBS)进行任务分解,这是一种比较经典的方法。WBS通过对项目要素的分解,规定了项目的内容和范围,是以交付结果为导向的项目管理方法。WBS方法不仅可以提供任务分解模板,还可以确定工作职责分配。在该方法的基础之上,有研究者提出基于设计结构矩阵(Design Structure Matrix,DSM)的解耦理论,量化了复杂任务的设计流程。
目前漏洞挖掘中任务分解和多人协作方式较为简单。HaCRS提出了一种实现方式。其将漏洞挖掘工作分解为触发程序不同特定输出的任务,将代码中有关的字符串抽取出来作为提示,安全测试人员根据提示,改进模糊测试的种子,自动测试工具接受这些种子作为额外输入,能够达到更高的代码覆盖率。
在互联网上,目前存在一些已经商用的开放的众包漏洞挖掘平台。首先,软件厂商将自己的软件产品的安全测试工作以任务的形式发布到大厅,平台上的安全测试人员可以申请加入任务,在找到漏洞后,需要在平台上上报漏洞信息。厂商在验证漏洞有效后,会给予安全测试人员一定的奖励。目前的漏洞挖掘平台,如漏洞盒子、HackerOne等,都遵循这种模式。这些平台提供了多人参与的环境,但是由于漏洞定位困难、挖掘漏洞需要软件相关知识、难以将漏洞挖掘工作分解为小任务等原因,目前的漏洞挖掘众包平台流程简单,缺乏任务分解等环节,需要安全测试人员主动接受任务,自行安排工作时间和工作内容。这种工作形式的组织结构是松散的,是一种比较低效的合作方式。总体上,群智化的漏洞挖掘平台目前还不成熟。
现有的研究较少关注任务分解之后的合理性和可行性。对于任务分解存在分解方式简单、分解之后的子任务粒度粗、分解之后任务不容易分配、子任务之间有可能产生重复工作等问题。
WBS等应用于软件开发中的任务分解方法都需要提前确定软件的文档(功能),其本质上是按照功能或代码中的模块、函数之间的关系进行分解。在漏洞挖掘领域,由于软件的复杂性和漏洞的未知性,难以应用这些方法。
HaCRS只针对二进制程序,不对程序进行任何分析,只是简单地把代码中的字符串提取出来作为提示,同时接受输入作为模糊测试种子。虽然这种方式简单易操作,但是能够参考的信息过少,不能进行深入的测试,限制了安全测试人员发挥自己的能力。并且只有那些包含输出可见字符串代码的相关路径才能被探测到。
现有的众包漏洞挖掘平台如漏洞盒子等没有进行任务分解。其流程简单、缺乏协作。本质上,安全测试人员还是在一个人进行工作,只是挖掘同一个软件中的漏洞的人数变多了。平台只是一个漏洞任务信息发布平台,作为第三方连通有需求的软件厂商和安全测试人员,具体的挖掘内容需要安全测试人员自行决定。
由于漏洞挖掘工作并不是一个简单的用人数堆积工作量的任务,因此如果不能合理安排不同的工作内容,就容易导致资源配置不均和重复工作。没有有效可行的任务分解方法,就不能高效地组织起多人协同工作。
本发明针对群智化漏洞挖掘场景下,漏洞挖掘任务难以进行子任务分解,进而导致多人难以进行高效协作的问题,提出了一种基于函数调用链聚类的漏洞挖掘任务分解方法,通过把漏洞挖掘任务分解为若干子任务,合理安排工作内容,把同一个任务中的参与者有机地结合起来,提高多人协作的效率,发挥群智优势。本发明着重解决漏洞挖掘任务中的两个问题:(1)由于软件系统的整体性、复杂性,漏洞挖掘任务难以有效进行分解(2)分解之后的子任务之间难以控制相关性,且子任务可参考信息少。
发明内容
为此,本发明首先提出一种群智化漏洞挖掘任务的分解方法,通过预处理、相关指标计算和聚类三个步骤,对输入的程序代码进行分析,将漏洞挖掘任务分解为多个子任务,具体地:
所述预处理步骤,在提取源代码中所有函数的调用链之后,采用预处理算法对所述调用链进行处理;
所述相关指标计算步骤中,依次计算每个函数的复杂度指标、任意两个函数在功能上的相似度、任意两个函数在可能存在漏洞上的相似度三个指标;
所述聚类过程通过设计聚类算法,结合所述相关指标计算步骤中计算得到的三个指标,计算每个类的预估工作量和调用链之间的相似度,进而利用最少任务数量、最小相似度和最大工作量三个参数结合所述类的预估工作量和调用链之间的相似度形成类,最终将每个类作为子任务;在所述聚类算法进行聚类之后,为每一类提取关键词;将聚类后各类的函数中的变量名和函数名进行分词和词形还原,加上函数i涉及的功能类型的关键词集合Wi,形成词集合;之后在各类的词集合上使用idf算法:
Figure BDA0002913487530000031
选取有代表性的单词,即为该类的关键词,最终输出带有关键词提示的子任务。
所述预处理算法包括三个步骤:首先对于每个调用链pathi,从main函数节点开始顺序遍历函数调用链形成的有向边Ei,在最后一个可能包含漏洞代码的节点停止,截断剩余的节点;其次,对于每个调用链pathi,如果存在另一个调用链pathj满足
Figure BDA0002913487530000041
Figure BDA0002913487530000042
则删除pathi,该步骤重复进行多次,直到没有冗余的调用链;最后,对于每个调用链pathi,遍历Ei,对于某个节点能够到达的边集合
Figure BDA0002913487530000043
检查边集合中是否存在起点和终点都在该调用链上的边,将符合条件的边加入该调用链中,该步骤为了重新加入在之前被省略的递归边。
所述每个函数的复杂度指标计算方法为:对于函数i,函数复杂度和函数内部的分支数目Pi、圈复杂度Cyci、代码风格违反数量smelli、代码语句数目Si有相关性,这些因素影响对代码进行分析的困难程度。函数复杂度计算如下所示:
Figure BDA0002913487530000044
所述圈复杂度Cyci定义为:用于表示代码复杂度的代码度量,将函数内的基本块之间的关系看作一个图GB=(EB,VB),则圈复杂度的计算方式为
Cyci=eBi-nBi+2
其中eBi、nBi为函数i的基本块所构成图的边数目和节点数目,
所述代码风格违反数量smelli表示函数i中出现的严重的违反代码风格规范的数量,包括程序的格式上的规范,如缩进、空格、变量命名规范、注释规范、面向对象设计规范;
所述任意两个函数在功能上的相似度计算方法为:对于函数i、j的功能上的相似度记为fsim(i,j),
Figure BDA0002913487530000045
其中
Figure BDA0002913487530000046
为函数i调用的函数集合,Wi为函数i涉及的功能类型的关键词集合;
所述任意两个函数在可能存在漏洞上的相似度计算方法为:对于函数i、j可能存在漏洞上的相似度记为sim(i,j):
Figure BDA0002913487530000047
其中x.c表示取函数i的所有可能存在的漏洞Vuli中漏洞x的二元组中的漏洞类型;
所述每个类的预估工作量记为work,计算方法为类中所有函数的复杂度之和:work=∑icomplexi
所述调用链之间的相似度的计算方法为:使用depth(pathi)表示调用链pathi的最大深度,使用pathi·V表示取pathi的节点集合Vi,使用pathi[:d].V表示取pathi前d层的所有节点构成的集合,
在此基础上首先计算两个调用链中的最小深度:mink=min(depth(pathi),depth(pathj)),进而计算所述最小深度层数下节点共现的节点数量之和,得到两个调用链之间的顺序相似度:
Figure BDA0002913487530000051
Figure BDA0002913487530000052
同时计算两个调用链中函数两两之间的相似度
Figure BDA0002913487530000053
最后计算两个调用链的相似度
Figure BDA0002913487530000054
所述漏洞类型包括输入验证错误、数字错误、竞争条件错误。
所述聚类算法的过程为:
步骤一:设置参数最小子任务数min_task、最大工作量max_workload、最小相似度min_similar,对于n个初始调用链,初始化n个类,每个调用链单独作为一类;
步骤二:判断此时类数量是否小于等于min_task,如果小于,跳转到步骤五;否则,跳转到步骤三;
步骤三:对于类之间产生的所有两两组合,利用所述两个调用链的相似度的公式计算所有组合之间的相似度,对这些相似度的计算结果按照相似度由大到小进行排序,记排序之后的集合为s。
步骤四:遍历s,如果相似度大于min_similar、两个类的交集大小大于1、合并之后的类的预估工作量小于max_workload,就进行合并,将两个类中的调用链合并作为新的类,之后跳转到步骤二;如果遍历之后没有能够合并的节点,跳转到步骤五。
步骤五:以每个类作为一个子任务,输出这些子任务。
本发明所要实现的技术效果在于:
本发明提出了基于函数调用链的群智化漏洞挖掘任务分解方法,通过对程序代码进行分析,将漏洞挖掘任务分解为多个子任务。在任务分解时,使用最少任务数量、最小相似度和最大工作量三个参数控制任务的分解粒度和子任务之间的相关性,使得分解后的子任务之间相关性较低,子任务内相关性较高。此外,通过关键词提取,给出每个子任务的提示。本发明可使不同子任务的安全测试人员能够专注于自己的子任务,尽量减少重复工作。同时所有安全测试人员能够在对同一个软件漏洞挖掘任务中协同工作。
附图说明
图1基于函数调用链聚类的任务分解方法;
具体实施方式
以下是本发明的优选实施例并结合附图,对本发明的技术方案作进一步的描述,但本发明并不限于此实施例。
本发明提出了一种群智化漏洞挖掘任务的分解方法,提取或计算代码度量指标、可能的漏洞存在情况和函数调用链等信息,通过对上述信息综合分析后进行任务分解工作。首先需要对上述相关信息进行收集,作为算法的基础。
相关代码度量指标:
在这一方法中,会涉及如下的相关代码度量指标。因为算法以函数为基本单元进行设计,以下指标都是函数级别的。
对于现代编程语言,函数是一个非常基本的元素。函数指可以直接被另一段程序或代码引用的代码,又叫做子程序。函数一般是一个功能的实现,函数名作为该功能的抽象表述。合理使用函数,能够减少代码量,增加代码的可读性,增加软件系统的可维护性。对于每个函数,给予其唯一标识,作为之后的索引。函数唯一标识为:函数所在文件名+函数名。
(1)代码语句数目、分支语句数目
上述指标是对于代码复杂度的一个粗略但直观的度量。代码语句数目越多,需要安全人员理解的时间就越长,同时机器进行编译和分析的时间也会越长。反之,代码行数越少,需要安全人员理解的时间就越少,同时机器进行编译和分析的时间越少。代码语句数目和分支语句数目作为初步的指标度量,大致刻画了代码的复杂程度。
这里使用Si表示函数i的代码语句数目,使用Pi表示函数i的分支语句数目。
(2)代码圈复杂度
代码的行数只能表示代码量的大小,但是不能表示代码结构的相关信息。圈复杂度是一种用于表示代码复杂度的代码度量。它是对源代码中由于分支跳转语句而产生的线性独立路径数量的度量。有研究表明,圈复杂度越高,出现问题的可能性就越高,可能存在漏洞的个数也越多。同时,圈复杂度高的代码,因为逻辑复杂,不易进行分析和调试,对于安全测试人员来说进行漏洞挖掘工作难度大。
将函数内的基本块之间的关系看作一个图GB=(EB,VB),圈复杂度的计算方式为
Cyci=eBi-nBi+2 (1)
其中eBi、nBi为函数i的基本块所构成图的边数目和节点数目。
(3)函数调用链
函数之间存在着调用关系,这些关系形成了函数调用图(Function Call Graph)。程序的执行一般从main函数开始,经过若干函数结束,因此函数调用图为一个有向弱连通图,且图中只有main节点没有入边。记函数调用图为GF=(VF,EF),其中VF为图中的所有函数节点,记为
Figure BDA0002913487530000071
lF=|VF|为节点数量。EF为函数调用形成的有向边,记为
Figure BDA0002913487530000072
kF=|EF|为边数量。其中e为一二元组,表示为e=(x,y),x和t为VF中的节点,表示从x到t的一条有向边,含义是在代码中,函数x调用了函数y。记节点v的出边集合为
Figure BDA0002913487530000073
即以v为起点的边,
Figure BDA0002913487530000074
为节点v的出边数量。记节点v沿图中的边可以在一步距离到达的节点集合为
Figure BDA0002913487530000075
Figure BDA0002913487530000076
即以v为起点的边的终点集合,
Figure BDA0002913487530000077
为节点v的下一步可达的节点数量。
函数调用链定义为函数调用图中包含main节点的弱连通子图,且满足图中只有main节点没有入边的条件。记调用链为pathp=(Vp,Ep),其中
Figure BDA0002913487530000081
Figure BDA0002913487530000082
lp=|Vp|为节点数量。
Figure BDA0002913487530000083
kp=|Ep|为边数量。
在函数调用图上,以main函数作为入口,使用深度优先搜索(Depth FirstSearch,DFS)算法,遍历所有可能的调用关系,遇到没有出边的节点或之前已经访问过的节点就停止。遍历的每个结果是从main节点开始的连续的函数调用关系,作为初始的调用链。每个初始的调用链中只有一条有向路径。一个程序中所有初始的调用链集合记为Path_all={path1,path2,…,pathm}。
在函数调用链上,使用广度优先搜索算法(Breadth-First Search,BFS),以main函数节点为第一层节点,得到调用链深度、每层节点等信息。使用depth(pathi)表示调用链pathi的最大深度,使用pathi.V表示取pathi的节点集合Vi,使用pathi[:d].V表示取pathi前d层的所有节点构成的集合。
(4)代码风格规范
在大型的合作项目中,代码风格规范是一个重要的约束。对于一个确定的功能,可以有多种不同形式的代码实现,这些实现在输入输出结果上保持一致。但是如果希望代码简洁、可读、易维护,那么需要对代码风格进行一定的约束,在遵循这个约束的前提之下,项目中的开发者能够更高效率地协作。代码风格不仅包括程序的格式上的规范,如缩进、空格等,更重要的是对代码组织形式的规范,这些包括变量命名规范、注释规范、面向对象设计规范等。良好的代码风格,有助于减少可能出现的编程错误。
函数i中出现的严重的违反代码风格规范的数量,记为smell1
(5)代码所使用的库所涉及的领域知识
在代码编写的过程中,经常会使用到库函数。库函数是一些已经编写好的函数,被放在外部文件中,需要时直接引入就可以使用。库函数一般遵循一些规范,实现了很多常用的功能。对于底层或常用的功能,开发者不需要自己编写这些功能,只需要引入相关的文件,即可直接使用。库函数使得开发者不需要深入了解系统底层的知识,不需要重复开发别人可能已经开发过的功能,能够把精力集中于自己要实现的功能上。库函数种类繁多,涉及的相关技术也很多。开发者在使用时,需要了解这些库的基本功能和调用方式,以便在自己的代码中正确使用。开发者在开发不同功能时,使用的库是不同的,因此分析代码中相关库函数的使用情况,就可以大概了解相关代码涉及的技术甚至功能。
本发明预先收集了标准C库的关键词,如表1所示
表1 C语言库相关的关键词
Figure BDA0002913487530000091
记函数i涉及的功能类型的关键词集合为Wi
(6)可能的漏洞位置
对于可能存在漏洞的代码,可以使用现有的漏洞挖掘工具来检测代码中可能存在的漏洞。这里采用基于静态分析的工具,得到代码中可能含有的漏洞的类型和位置。这些信息,将在任务分解算法设计中,用于指导任务分解的方式和粒度。
对于每个函数i,记其中可能存在的漏洞为
Figure BDA0002913487530000092
di=|Vuli|为函数i中可能的漏洞数量。其中u为一个二元组,记录漏洞的位置和类型,表示为u=(p,c),其中p为该漏洞所在位置,记录方式为文件名+函数名+行数,c为漏洞类型,可能为输入验证错误、数字错误、竞争条件错误等。例如:u=(“project_main.c+parse_string+23”,“输入验证错误”),表明在文件project_main.c的parse_string函数的23行存在一个漏洞,漏洞的类型是输入验证错误。
任务分解方法的具体方案:
任务分解方法的总体思路为:通过预处理、相关指标计算和聚类三个步骤,对输入的程序代码进行分析,将漏洞挖掘任务分解为多个子任务,具体地:
预处理步骤,在提取源代码中所有函数的调用链之后,采用预处理算法对所述调用链进行处理;
相关指标计算步骤,依次计算每个函数的复杂度指标、任意两个函数在功能上的相似度、任意两个函数在可能存在漏洞上的相似度三个指标;
聚类步骤,通过设计聚类算法,结合相关指标计算步骤中计算得到的三个指标,计算每个类的预估工作量和调用链之间的相似度,进而利用最少任务数量、最小相似度和最大工作量三个参数结合所述类的预估工作量和调用链之间的相似度形成类,最终将每个类作为子任务进行输出。
预处理算法:
首先对源代码进行预处理,得到符合要求的函数调用链作为聚类算法的输入。具体方法如下:提取源代码中所有函数调用链,即Path_all,之后对其中的调用链进行处理,其算法描述如下所示。
(1)对于每个调用链pathi,从main节点开始顺序遍历Ei,在最后一个包含可能漏洞代码的节点停止,截断剩余的节点。
(2)对于每个调用链pathi,如果存在另一个调用链pathj满足
Figure BDA0002913487530000101
Figure BDA0002913487530000102
Figure BDA0002913487530000103
则删除pathi。该步骤重复进行多次,直到没有冗余的调用链。
(3)对于每个调用链pathi,遍历Ei,对于某个节点能够到达的边集合
Figure BDA0002913487530000104
检查边集合中是否存在起点和终点都在该调用链上的边。将符合条件的边加入该调用链中。该步骤为了重新加入在之前被省略的递归边。
相关指标计算:
在进行聚类之前,需要对函数一些相关指标进行计算,以便聚类中计算相似度时使用。
(1)计算每个函数的复杂度指标complexi
显然,函数复杂度和函数内部的分支数目Pi、圈复杂度Cyci、代码风格违反数量smelli、代码语句数目Si有相关性,这些因素影响对代码进行分析的困难程度。函数复杂度计算如公式(2)所示。
Figure BDA0002913487530000111
(2)计算两个函数i、j在功能上的相似度,公式如(3)所示。
Figure BDA0002913487530000112
其中
Figure BDA0002913487530000113
为函数i调用的函数集合,Wi为函数i涉及的功能类型的关键词集合。
函数相似度表示两个函数在功能上和调用子函数上的相似程度。越相似的两个函数实现的功能可能越类似。
(3)计算两个函数i、j在可能存在漏洞上的相似度,公式如(4)所示。
Figure BDA0002913487530000114
其中x.c表示取函数i的所有可能存在的漏洞Vuli中漏洞x的二元组中的漏洞类型。
(4)计算每个类的预估工作量,预估工作量为类中所有函数的复杂度之和,公式如(5)所示。
Figure BDA0002913487530000115
(5)计算调用链之间的相似度,公式如(9)所示。
mink=min(depth(pathi),depth(pathj)) (6)
Figure BDA0002913487530000116
Figure BDA0002913487530000121
Figure BDA0002913487530000122
其中公式(6)计算两个调用链中的最小深度。公式(7)通过计算前d层节点中共现的节点数量之和,得到两个调用链之间的顺序相似度。公式(8)考虑两个调用链中函数两两之间的相似度。公式(9)计算两个调用链的相似度,在考虑函数顺序位置的同时,也关注可能存在的漏洞对相似度做的贡献。
聚类算法:
完成以上的准备工作之后,就可以进行层次聚类,算法思路为:首先初始化n个类,n为初始调用链数目。每个调用链单独作为一类。如果聚类结果数量大于最小子任务数,重复计算每两个类之间的相似度,合并相似度最大的两个类,将两个类中的调用链合并作为新的类。在合并中,如果发现合并后一个类的预估工作量大于最大工作量,或在合并时两个类除main外没有相同节点,则不进行合并。如果两个类只有main节点相同,合并之后的意义不大,因为类之间的节点大部分都不相同。若不能合并,则跳过不能合并的类,根据类间的相似度排序,继续向下顺延,查看是否能够合并。直到相似度小于最小相似度。重复上述步骤直到不能满足预设的参数条件。聚类结束后输出所有子任务,每个子任务为若干个函数调用链的合并,实际上是函数调用图GF的子图,同时也满足函数调用链的定义。算法流程如下所示:
(1)设置参数最小子任务数min_task、最大工作量max_workload、最小相似度min_similar。对于n个初始调用链,初始化n个类,每个调用链单独作为一类。
(2)判断此时类数量是否小于等于min_task,如果小于,跳转到(5);否则,跳转到(3)。
(3)对于类之间产生的所有两两组合,使用公式(9)计算所有组合之间的相似度,对这些相似度的计算结果按照相似度由大到小进行排序,记排序之后的集合为s。跳转到(4)。
(4)遍历s,如果相似度大于min_similar、两个类的交集大小大于1、合并之后的类的预估工作量小于max_workload,就进行合并,将两个类中的调用链合并作为新的类,之后跳转到(2)。如果遍历之后没有能够合并的节点,跳转到(5)。
(5)以每个类作为一个子任务,输出这些子任务。
该算法自底向上不断聚类,示意图如图1所示。其中圆圈代表一次函数调用,箭头表示调用的父子关系。加粗圆圈表示该函数中存在被静态分析工具认为可能有漏洞的代码。初始状态下,每个调用链都是一个以main函数为起点的、以可能存在漏洞的函数为终点的只有一条路径的图,在聚类过程中,图中的节点和边会逐渐增多。
在聚类之后,为每一类提取关键词。将类内函数中的变量名和函数名进行分词和词形还原,加上函数i涉及的功能类型的关键词集合Wi,形成词集合。之后在类的词集合上使用idf算法选取有代表性的单词,,即为该类的关键词。使用关键词,方便开发者对子任务涉及的功能有初步了解。公式(10)为idf的计算方法。
Figure BDA0002913487530000131

Claims (5)

1.一种群智化漏洞挖掘任务的分解方法,其特征在于:
通过预处理、相关指标计算和聚类三个步骤,对输入的程序代码进行分析,将漏洞挖掘任务分解为多个子任务,具体地:
所述预处理步骤,在提取源代码中所有函数的调用链之后,采用预处理算法对所述调用链进行处理;
所述相关指标计算步骤中,依次计算每个函数的复杂度指标、任意两个函数在功能上的相似度、任意两个函数在可能存在漏洞上的相似度三个指标;
所述聚类过程通过设计聚类算法,结合所述相关指标计算步骤中计算得到的三个指标,计算每个类的预估工作量和调用链之间的相似度,进而利用最少任务数量、最小相似度和最大工作量三个参数结合所述类的预估工作量和调用链之间的相似度形成类,最终将每个类作为子任务;在所述聚类算法进行聚类之后,为每一类提取关键词;将聚类后各类的函数中的变量名和函数名进行分词和词形还原,加上函数i涉及的功能类型的关键词集合Wi,形成词集合;之后在各类的词集合上使用idf算法:
Figure FDA0002913487520000011
选取有代表性的单词,即为该类的关键词,最终输出带有关键词提示的子任务。
2.如权利要求1所述的一种群智化漏洞挖掘任务的分解方法,其特征在于:所述预处理算法包括三个步骤:首先对于每个调用链pathi,从main函数节点开始顺序遍历函数调用链形成的有向边Ei,在最后一个可能包含漏洞代码的节点停止,截断剩余的节点;其次,对于每个调用链pathi,如果存在另一个调用链pathj满足
Figure FDA0002913487520000012
Figure FDA0002913487520000013
则删除pathi,该步骤重复进行多次,直到没有冗余的调用链;最后,对于每个调用链pathi,遍历Ei,对于某个节点能够到达的边集合
Figure FDA0002913487520000014
检查边集合中是否存在起点和终点都在该调用链上的边,将符合条件的边加入该调用链中,该步骤为了重新加入在之前被省略的递归边。
3.如权利要求2所述的一种群智化漏洞挖掘任务的分解方法,其特征在于:所述每个函数的复杂度指标计算方法为:对于函数i,函数复杂度和函数内部的分支数目Pi、圈复杂度Cyci、代码风格违反数量smelli、代码语句数目Si有相关性,这些因素影响对代码进行分析的困难程度。函数复杂度计算如下所示:
Figure FDA0002913487520000021
所述圈复杂度Cyci定义为:用于表示代码复杂度的代码度量,将函数内的基本块之间的关系看作一个图GB=(EB,VB),则圈复杂度的计算方式为
Cyci=eBi-nBi+2
其中eBi、nBi为函数i的基本块所构成图的边数目和节点数目,
所述代码风格违反数量smelli表示函数i中出现的严重的违反代码风格规范的数量,包括程序的格式上的规范,如缩进、空格、变量命名规范、注释规范、面向对象设计规范;
所述任意两个函数在功能上的相似度计算方法为:对于函数i、j的功能上的相似度记为fsim(i,j),
Figure FDA0002913487520000022
其中
Figure FDA0002913487520000023
为函数i调用的函数集合,Wi为函数i涉及的功能类型的关键词集合;
所述任意两个函数在可能存在漏洞上的相似度计算方法为:对于函数i、j可能存在漏洞上的相似度记为sim(i,j):
Figure FDA0002913487520000024
其中x.c表示取函数i的所有可能存在的漏洞Vuli中漏洞x的二元组中的漏洞类型;
所述每个类的预估工作量记为work,计算方法为类中所有函数的复杂度之和:work=∑icomplexi
所述调用链之间的相似度的计算方法为:使用depth(pathi)表示调用链pathi的最大深度,使用pathi.V表示取pathi的节点集合Vi,使用pathi[:d].V表示取pathi前d层的所有节点构成的集合,
在此基础上首先计算两个调用链中的最小深度:mink=min(depth(pathi),depth(pathj)),进而计算所述最小深度层数下节点共现的节点数量之和,得到两个调用链之间的顺序相似度:
Figure FDA0002913487520000025
Figure FDA0002913487520000031
同时计算两个调用链中函数两两之间的相似度
Figure FDA0002913487520000032
最后计算两个调用链的相似度
Figure FDA0002913487520000033
4.如权利要求3所述的一种群智化漏洞挖掘任务的分解方法,其特征在于:所述漏洞类型包括输入验证错误、数字错误、竞争条件错误。
5.如权利要求4所述的一种群智化漏洞挖掘任务的分解方法,其特征在于:所述聚类算法的过程为:
步骤一:设置参数最小子任务数min_task、最大工作量max_workload、最小相似度min_similar,对于n个初始调用链,初始化n个类,每个调用链单独作为一类;
步骤二:判断此时类数量是否小于等于min_task,如果小于,跳转到步骤五;否则,跳转到步骤三;
步骤三:对于类之间产生的所有两两组合,利用所述两个调用链的相似度的公式计算所有组合之间的相似度,对这些相似度的计算结果按照相似度由大到小进行排序,记排序之后的集合为s;
步骤四:遍历s,如果相似度大于min_similar、两个类的交集大小大于1、合并之后的类的预估工作量小于max_workload,就进行合并,将两个类中的调用链合并作为新的类,之后跳转到步骤二;如果遍历之后没有能够合并的节点,跳转到步骤五。
步骤五:以每个类作为一个子任务,输出这些子任务。
CN202110093372.3A 2021-01-25 2021-01-25 一种群智化漏洞挖掘任务的分解方法 Active CN112765031B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110093372.3A CN112765031B (zh) 2021-01-25 2021-01-25 一种群智化漏洞挖掘任务的分解方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110093372.3A CN112765031B (zh) 2021-01-25 2021-01-25 一种群智化漏洞挖掘任务的分解方法

Publications (2)

Publication Number Publication Date
CN112765031A true CN112765031A (zh) 2021-05-07
CN112765031B CN112765031B (zh) 2022-08-19

Family

ID=75706935

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110093372.3A Active CN112765031B (zh) 2021-01-25 2021-01-25 一种群智化漏洞挖掘任务的分解方法

Country Status (1)

Country Link
CN (1) CN112765031B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113467908A (zh) * 2021-06-23 2021-10-01 深圳市蘑菇财富技术有限公司 任务执行方法、装置、计算机可读存储介质及终端设备
CN113656807A (zh) * 2021-08-23 2021-11-16 杭州安恒信息技术股份有限公司 一种漏洞管理方法、装置、设备及存储介质
CN114968826A (zh) * 2022-07-28 2022-08-30 深圳开源互联网安全技术有限公司 应用程序漏洞修复验证方法及系统
CN115345462A (zh) * 2022-08-09 2022-11-15 航天神舟智慧系统技术有限公司 一种用于省域治理的任务统筹归并方法及系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102446254A (zh) * 2011-12-30 2012-05-09 中国信息安全测评中心 一种基于文本挖掘的相似漏洞查询方法
CN104166680A (zh) * 2014-07-12 2014-11-26 中国信息安全测评中心 一种基于开源库与文本挖掘的并行漏洞挖掘方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102446254A (zh) * 2011-12-30 2012-05-09 中国信息安全测评中心 一种基于文本挖掘的相似漏洞查询方法
CN104166680A (zh) * 2014-07-12 2014-11-26 中国信息安全测评中心 一种基于开源库与文本挖掘的并行漏洞挖掘方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
GUOYAN HUANG ET AL.: "Automatic Classification Method for Software Vulnerability Based on Deep Neural Network", 《IEEE ACCESS》 *
JINFU CHEN ET AL.: "An automatic software vulnerability classification framework using term frequency-inverse gravity moment and feature selection", 《THE JOURNAL OF SYSTEMS AND SOFTWARE》 *
PATRICK KWAKU KUDJO ET AL.: "Improving the Accuracy of Vulnerability Report Classification Using Term Frequency-Inverse Gravity Moment", 《2019 IEEE 19TH INTERNATIONAL CONFERENCE ON SOFTWARE QUALITY, RELIABILITY AND SECURITY》 *
XIANG LI ET AL.: "A Mining Approach to Obtain the Software Vulnerability Characteristics", 《2017 FIFTH INTERNATIONAL CONFERENCE ON ADVANCED CLOUD AND BIG DATA》 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113467908A (zh) * 2021-06-23 2021-10-01 深圳市蘑菇财富技术有限公司 任务执行方法、装置、计算机可读存储介质及终端设备
CN113467908B (zh) * 2021-06-23 2024-02-20 深圳市蘑菇财富技术有限公司 任务执行方法、装置、计算机可读存储介质及终端设备
CN113656807A (zh) * 2021-08-23 2021-11-16 杭州安恒信息技术股份有限公司 一种漏洞管理方法、装置、设备及存储介质
CN113656807B (zh) * 2021-08-23 2024-04-16 杭州安恒信息技术股份有限公司 一种漏洞管理方法、装置、设备及存储介质
CN114968826A (zh) * 2022-07-28 2022-08-30 深圳开源互联网安全技术有限公司 应用程序漏洞修复验证方法及系统
CN115345462A (zh) * 2022-08-09 2022-11-15 航天神舟智慧系统技术有限公司 一种用于省域治理的任务统筹归并方法及系统

Also Published As

Publication number Publication date
CN112765031B (zh) 2022-08-19

Similar Documents

Publication Publication Date Title
CN112765031B (zh) 一种群智化漏洞挖掘任务的分解方法
Tsantalis et al. Assessing the refactorability of software clones
CN110908640B (zh) 实现业务功能的方法和脚本引擎
Nguyen et al. Graph-based mining of in-the-wild, fine-grained, semantic code change patterns
Maggi et al. Parallel algorithms for the automated discovery of declarative process models
de Freitas Farias et al. A contextualized vocabulary model for identifying technical debt on code comments
Le et al. Synergizing specification miners through model fissions and fusions (t)
US20070033440A1 (en) Parameterized unit tests
Nguyen et al. Topic-based defect prediction (nier track)
CN113239358A (zh) 基于知识图谱的开源软件漏洞挖掘方法
Walkinshaw et al. Inferring computational state machine models from program executions
Li et al. Mutation testing in practice using ruby
US11662998B2 (en) Detecting duplicated code patterns in visual programming language code instances
Mover et al. Mining framework usage graphs from app corpora
Saini et al. Towards automating precision studies of clone detectors
CN116702157B (zh) 一种基于神经网络的智能合约漏洞检测方法
US20140325490A1 (en) Classifying Source Code Using an Expertise Model
Şora Finding the right needles in hay helping program comprehension of large software systems
Agrawal et al. A hybrid-token and textual based approach to find similar code segments
Shepherd et al. Case study: supplementing program analysis with natural language analysis to improve a reverse engineering task
CN114546836A (zh) 基于下推自动机引导的公共组件库自动化测试方法及装置
Singh et al. Design and implementation of testing tool for code smell rectification using c-mean algorithm
Mishra et al. Data mining techniques for software quality prediction
Saha Detection and analysis of near-miss clone genealogies
CN113721977B (zh) 编程数据的处理方法与装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant