本发明涉及软件代码溯源检测
技术领域:
,特别涉及一种基于软件复用特征学习的开源代码溯源检测方法。
背景技术:
:随着互联网技术和开源软件的蓬勃发展,越来越多的开发者参与到开源软件开发中,开源社区也因此积累了海量优秀的开源软件资源和开源知识资源。开源软件的免费、开放、可定制、受整个社区监督等特性,使其可为软件开发提供技术快速应用、增加创新、减少成本和开发时间等有利条件。在如今软件开发效率和质量亟需提高的背景下,开源已经成为it行业中势力庞大的一支生力军。开源的好处却也是风险的来源。根据synopsys公司发布的《“2018年开源代码安全和风险分析blackduck(黑鸭)”》报告,每个代码库中开源漏洞数量较去年增长了134%。此外,开源软件需要用户自行负责跟踪他们所使用的开源软件的漏洞、修复和更新。如果一个组织机构不了解其所使用的所有开源成分,就不可能抵御针对这些组件中已知漏洞的常见攻击,并将自己暴露在许可证合规风险和知识产权等法律风险之中,带来不同程度的安全威胁及经济或名誉损失。但是由于软件项目对开源代码的使用方式多样,代码被使用的开源软件范围难以提前预知,且同一个软件中可能会同时引入来自于不同开源软件的代码,因此溯源检测中参与代码比对的开源软件数量将非常庞大。如果将被检测软件与所有开源软件一一对比,将极为耗时耗力且实现起来很不现实。因此如何准确确定出参与溯源检测比对的开源软件范围,从海量的开源软件库中选取代码最有可能被使用的开源软件参与溯源比对,对于提高代码溯源检测的精度和效率有着很大的影响。因此,本发明旨在通过机器学习具有复用关系的开源软件特征,建立复用特征关联模型,分析软件复用关系,实现通过被检测软件的特征,快速确定出参与溯源比对的开源软件范围,显著提高溯源检测的效率和精度。技术实现要素:本发明的目的是提供一种基于软件复用特征学习的开源代码溯源检测方法。为此,本发明技术方案如下:一种基于软件复用特征学习的开源代码溯源检测方法,包括如下步骤:1)搭建复用特征关联模型;该模型的搭建方法如下:1-1)对具有复用关系软件项目中的复用软件和被复用软件的特征数据分别进行选取与收集,其中,上述复用关系已经在开源软件社区中明确:1-2)利用apriori算法对复用特征关联规则进行挖掘:从而得到关联规则表,即复用特征关联模型;2)根据进行溯源检测的软件特征,从关联规则表中查询到对应的被复用开源软件特征集合及其复用概率,按照复用概率从高到低的顺序从比对开源软件库中搜索出具有这些特征的软件代码,逐一与被检测代码进行溯源比对。进一步的,所述的步骤1-1)中选取与收集的软件特征数据包括编程语言、开源许可证、软件类型、软件标签和收藏量。进一步的,所述的步骤1-1)中软件特征数据的选取与收集方法为:a)根据需要获取软件特征的软件项目名称和所有者信息,获得项目git地址;b)利用开源社区提供的数据框架和api,访问开源社区的接口;c)使用java网络爬虫技术,利用开源的java依赖库操作开源社区网站的开源项目托管平台的远程库,从而抓取到所需的软件特征数据;d)将采集到的目标数据存储到数据库,完成软件特征数据的采集工作。进一步的,利用apriori算法对复用特征关联规则挖掘时包括如下步骤:1-21)挖掘特征数据中的频繁项集;1-22)基于频繁项集,挖掘关联规则;1-23)将获得的关联规则形成关联规则表,并存放于数据库中。进一步的,所述的频繁项集的挖掘方法为:设定一个支持度最小值,计算所有项集的支持度,删减掉数据库中支持度小于最小值的项集以及该项集对应的所有超项集,剩余的项集即为频繁项集。进一步的,所述的频繁项集关联规则挖掘的方法为:设定可信度的最小值,对每一个频繁项集的关联规则进行筛选,排除掉可信度小于最小值的频繁项集对应的关联规则及该频繁项集的子集对应的该关联规则;计算出每一个由复用软件特征和非复用软件特征组成的频繁项集的支持度,和与之对应的由复用软件特征组成的频繁项集的支持度,二者的比值即为关联规则的可信度。与现有技术相比,该基于软件复用特征学习的开源代码溯源检测方法根据被溯源检测的软件的一些特征,迅速找到具有代码复用可能的开源软件集合,从而缩减溯源检测比对的开源软件范围,极大地提高开源代码溯源检测的效率和精度。附图说明图1为本发明提供的方法框架图。图2为软件特征数据采集的流程图。图3为复用软件特征关联模型建立的流程图。图4为基于apriori算法的支持度剪枝原则示意图。图5为基于apriori算法的可信度剪枝原则示意图。具体实施方式下面结合附图及具体实施例对本发明做进一步的说明,但下述实施例绝非对本发明有任何限制。一种基于软件复用特征学习的开源代码溯源检测方法,该方法主要是根据进行溯源检测的软件特征,从搭建的复用特征关联模型的关联规则表中查询到对应的被复用开源软件特征集合及其复用概率,按照复用概率从高到低的顺序从比对开源软件库中搜索出具有这些特征的软件代码,逐一与被检测代码进行溯源比对,该方法的好处是能够迅速找到具有代码复用可能的开源软件集合,缩减溯源检测比对的开源软件范围,极大地提高开源代码溯源检测的效率和精度。其中,上述复用特征关联模型搭建方法框架图如图1所示:首先,对具有复用关系软件项目中的复用软件和被复用软件的特征数据分别进行选取与收集,其中,上述复用关系已经在开源软件社区中明确:选取与收集的软件特征数据包括编程语言、开源许可证、软件类型、软件标签和收藏量;其中,编程语言即软件开发所使用的语言,一个开源软件项目中可能会涉及到几种不同语言,但会有一种主要编程语言。本专利所研究的是代码级别的复用,因此将编程语言列入软件复用特征。开源许可证通过一些条款,对开源软件的使用进行了规范,因此开源许可证是本专利所需的软件复用特征之一。对于大部分开源项目都会设有标签,标签主要描述了项目的类型、功能、语言等相关信息。开源项目类型、功能、语言等信息是代码复用时选取软件的重要因素,因此应将软件标签列入软件复用特征。在github和gitee等开源社区网站中,都会有开源项目的收藏功能,同时对收藏量进行记录。一个开源项目的收藏量是项目流行、受欢迎程度的体现,也可以从一定程度上反映该软件的质量和好用程度,因此将软件收藏量列入软件复用特征。其中,软件特征数据的选取与收集方法,包括如下步骤:a)根据需要获取软件特征的软件项目名称和所有者信息,获得项目git地址;b)利用开源社区提供的数据框架和api,访问开源社区的接口;c)使用java网络爬虫技术,利用开源的java依赖库操作开源社区网站的开源项目托管平台的远程库,从而抓取到所需的软件特征数据;d)通过hibernate框架连接java和mysql,将采集到的目标数据存储到数据库,完成软件特征数据的采集工作,需要说明的是,此处收集的软件特征包括复用开源软件特征和被复用开源软件特征。在github开源社区中进行软件特征收集的流程图如图2所示。在软件特征收集工作完成之后,紧接着,利用apriori算法对复用特征关联规则进行挖掘,从而得到关联规则表,即复用特征关联模型,流程图如图3所示;复用特征关联规则挖掘时,首先需要挖掘特征数据中的频繁项集;频繁项集是指频繁一起出现的物品的集合。这里的“频繁”用支持度来衡量,对于一个项集,它的支持度的定义是,在数据集中含有该项集的记录所占有的比例。支持度是关于项集的概念,通常设定一个支持度的最小值,支持度不小于最小值的项集被认为是频繁项集。在软件复用特征关联规则挖掘中,可能得到的频繁项集即是软件的编程语言、开源许可证、软件类型或软件标签等软件特征的集合,比如频繁项集{android,java}就说明“android”和“java”经常一起出现。apriori算法为频繁项集的筛选提供了一个用于剪枝的原则,即如果一个项集是非频繁的,那么它的所有超集也一定是非频繁的,剪枝方法如图4所示,如果项集{a,b}是非频繁的,那么被虚线圈出并打叉的它的所有的超集也都是非频繁的。因此,所述的频繁项集在挖掘时,要设定一个支持度最小值,计算所有项集的支持度,删减掉数据库中支持度小于最小值的项集以及该项集对应的所有超项集,剩余的项集即为频繁项集。其次,基于频繁项集,挖掘关联规则;关联规则是指暗示在两种不同的物品间可能存在某种很强的关联。这里的“很强”用可信度来衡量。可信度是关于关联规则的概念,是一个条件概率,即在事件a发生的前提下,事件b与事件a同时发生的概率。由一个频繁项集可以得到若干关联规则,根据项集的支持度可以计算得到关联规则的可信度,一个关联规则的可信度值越高,说明该规则发生的概率越高。为可信度设定最小值,排除掉小于最小值的关联规则,留下的满足最小值要求的关联规则就是我们感兴趣的特征间的联系。当数据量较大时,同样面临由频繁项集生成的关联规则很多的问题,利用apriori原理可以减少关联规则筛选数量。这里遵循以下原则:如果规则x→y-x不满足最小可信度,那么对于x的子集x′,规则x′m→y-x′n也不满足最小可信度。以一个频繁项集{a,b,c,d}为例,进行关联规则挖掘。首先,生成该项集所有可能的关联规则,如图5所示,根据上述定理,如果规则b,c,d→a的可信度值低于设置的最小可信度,那么由{b,c,d}的子集构成的所有规则,都是可信度值低于最小可信度的。所述的频繁项集关联规则挖掘的方法为:设定可信度的最小值,对每一个频繁项集的关联规则进行筛选,排除掉可信度小于最小值的频繁项集对应的关联规则及该频繁项集的子集对应的该关联规则;计算出每一个由复用软件特征和非复用软件特征组成的频繁项集的支持度,和与之对应的由复用软件特征组成的频繁项集的支持度,二者的比值即为关联规则的可信度。在gitee开源社区选取了103组具有复用关系的开源软件,作为软件复用关系分析实验的实验对象,表1选取了其中的20组展示如下:表1开源软件复用案例将收集并处理后的数据输入到apriori算法中,学习开源软件复用特征间的关联规则,输出实验结果,并对输出试验结果进行分析到表所示的关联规则分析结果:表2关联规则分析结果序号如果复用软件具有特征那么被复用软件可能具有的特征可信度1mobiledevelopmentandroid0.712mobiledevelopmentandroid,java0.863managementmonitoringmit0.854mobiledevelopmentapache2.00.735androidandroid0.866mobiledevelopment,androidapache2.0,java0.997mobiledevelopment,androidandroid,java0.75在表2中,对于每一行所代表的一条关联规则,复用开源软件项目具备第二列中的特征,那么被它复用的软件可能具有第三列中的特征,这条关联规则的可信度值为第四列中的数值。这里我们设定最小可信度值为0.7,可信度值越高,规则发生的可能性越大,也就越有参考和使用价值。以表2中第二行序号1的关联规则为例,开源软件项目是手机或移动开发类的项目(mobiledevelopment),那么它有71%的可能性复用了标签中包含“android”的开源软件项目。再以第七行序号为6的关联规则为例,开源软件项目是手机或移动开发类的项目(mobiledevelopment)且主要编程语言是android,那么它有99%的可能性复用了apache2.0开源许可证且主要编程语言是java的开源软件项目。当前第1页1 2 3 
技术特征:1.一种基于软件复用特征学习的开源代码溯源检测方法,其特征在于,包括如下步骤:
1)搭建复用特征关联模型;该模型的搭建方法如下:
1-1)对具有复用关系软件项目中的复用软件和被复用软件的特征数据分别进行选取与收集,其中,上述复用关系已经在开源软件社区中明确:
1-2)利用apriori算法对复用特征关联规则进行挖掘:从而得到关联规则表,即复用特征关联模型;
2)根据进行溯源检测的软件特征,从关联规则表中查询到对应的被复用开源软件特征集合及其复用概率,按照复用概率从高到低的顺序从比对开源软件库中搜索出具有这些特征的软件代码,逐一与被检测代码进行溯源比对。
2.根据权利要求1所述的基于软件复用特征学习的开源代码溯源检测方法,其特征在于,所述的步骤1-1)中选取与收集的软件特征数据包括编程语言、开源许可证、软件类型、软件标签和收藏量。
3.根据权利要求1所述的基于软件复用特征学习的开源代码溯源检测方法,其特征在于,所述的步骤1-1)中软件特征数据的选取与收集方法为:
a)根据需要获取软件特征的软件项目名称和所有者信息,获得项目git地址;
b)利用开源社区提供的数据框架和api,访问开源社区的接口;
c)使用java网络爬虫技术,利用开源的java依赖库操作开源社区网站的开源项目托管平台的远程库,从而抓取到所需的软件特征数据;
d)将采集到的目标数据存储到数据库,完成软件特征数据的采集工作。
4.根据权利要求1所述的基于软件复用特征学习的开源代码溯源检测方法,其特征在于,利用apriori算法对复用特征关联规则挖掘时包括如下步骤:
1-21)挖掘特征数据中的频繁项集;
1-22)基于频繁项集,挖掘关联规则;
1-23)将获得的关联规则形成关联规则表,并存放于数据库中。
5.根据权利要求4所述的基于软件复用特征学习的开源代码溯源检测方法,其特征在于,所述的频繁项集的挖掘方法为:设定一个支持度最小值,计算所有项集的支持度,删减掉数据库中支持度小于最小值的项集以及该项集对应的所有超项集,剩余的项集即为频繁项集。
6.根据权利要求4或5所述的基于软件复用特征学习的开源代码溯源检测方法,其特征在于,所述的频繁项集关联规则挖掘的方法为:
设定可信度的最小值,对每一个频繁项集的关联规则进行筛选,排除掉可信度小于最小值的频繁项集对应的关联规则及该频繁项集的子集对应的该关联规则;
计算出每一个由复用软件特征和非复用软件特征组成的频繁项集的支持度,和与之对应的由复用软件特征组成的频繁项集的支持度,二者的比值即为关联规则的可信度。
技术总结本发明公开了一种基于软件复用特征学习的开源代码溯源检测方法,该方法主要是根据进行溯源检测的软件特征,从搭建的复用特征关联模型的关联规则表中查询到对应的被复用开源软件特征集合及其复用概率,按照复用概率从高到低的顺序从比对开源软件库中搜索出具有这些特征的软件代码,逐一与被检测代码进行溯源比对,该方法的好处是能够迅速找到具有代码复用可能的开源软件集合,缩减溯源检测比对的开源软件范围,极大地提高开源代码溯源检测的效率和精度。
技术研发人员:严亮
受保护的技术使用者:北京高质系统科技有限公司
技术研发日:2020.02.13
技术公布日:2020.06.05