CN114356405B - 开源组件函数的匹配方法、装置、计算机设备和存储介质 - Google Patents

开源组件函数的匹配方法、装置、计算机设备和存储介质 Download PDF

Info

Publication number
CN114356405B
CN114356405B CN202210274214.2A CN202210274214A CN114356405B CN 114356405 B CN114356405 B CN 114356405B CN 202210274214 A CN202210274214 A CN 202210274214A CN 114356405 B CN114356405 B CN 114356405B
Authority
CN
China
Prior art keywords
function
open source
core
functions
matching
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.)
Active
Application number
CN202210274214.2A
Other languages
English (en)
Other versions
CN114356405A (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.)
Sitanming Information Technology Nanjing Co ltd
Original Assignee
Sitanming Information Technology Nanjing Co ltd
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 Sitanming Information Technology Nanjing Co ltd filed Critical Sitanming Information Technology Nanjing Co ltd
Priority to CN202210274214.2A priority Critical patent/CN114356405B/zh
Publication of CN114356405A publication Critical patent/CN114356405A/zh
Application granted granted Critical
Publication of CN114356405B publication Critical patent/CN114356405B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明适用于开源识别技术领域,提供了一种开源组件函数的匹配方法,所述开源组件函数的匹配方法包括:获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;对所述目标函数进行筛选,得到第二核心函数;对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。该匹配方法大大提升了组件识别的速度和组件识别得精确度,有效压缩数据库,从而使得大规模组件识别工作变得可行。

Description

开源组件函数的匹配方法、装置、计算机设备和存储介质
技术领域
本发明属于开源识别技术领域,尤其涉及开源组件函数的匹配方法、装置、计算机设备和存储介质。
背景技术
第三方开源组件被广泛应用于软件开发的过程中,以提高开发速度,提升代码质量,避免重复开发已有功能。然而,过于依赖于第三方开源组件,在没有合理的管理的情况下,引入开源组件会存在很多问题,比如,第三方开源组件可能会带入自身组件所包含的安全漏洞,对软件构成威胁;第三方开源组件本版更新维护情况依赖于第三方的开发者,从而不能保证能够无缝升级更新;第三方开源组件所依赖的授权许可(License)不尽相同,引入组件可能会有软件合规的问题产生。因此,管理维护软件中所用的第三方开源组件是对于软件开发中安全把控,软件合规,软件维护至关重要的。
然而,随着软件开发规模的增大,开发者的增多,对于第三方组件的管理变得越来越难。因此,如何快速的扫描大规模代码,从中识别第三方组件,变成开源组件管理,在软件公司的实际运用中的最重要的一环。现有的第三方组件扫描工具,通常会收集第三方组件的源码信息,并将其中的源代码文件做哈希处理,存入数据库中。在组件扫描时,扫描工具会将数据库中的哈希值与目标软件中文件的哈希值进行比较;如果一个开源组件中的每个文件的哈希值可以与目标软件中的哈希值一一匹配,那么扫描工具会认为该目标软件包含该第三方组件。
而现有开源组件扫描方法会匹配一个开源组件中的所有文件,这样的作法造成数据扫描及匹配开销较大,降低匹配精度和效率。
发明内容
本发明实施例的目的在于提供一种开源组件函数的匹配方法,旨在解决第三方开源组件数据匹配开销较大、匹配精度和效率低的技术问题。
本发明实施例是这样实现的,一种开源组件函数的匹配方法,所述开源组件函数的匹配方法包括:
获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;
对所述目标函数进行筛选,得到第二核心函数;
对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
本发明实施例的另一目的在于一种开源组件函数的匹配装置,所述开源组件函数的匹配装置包括:
函数获取模块,用于获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
函数提取模块,剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;对所述目标函数进行筛选,得到第二核心函数;
函数匹配模块,对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
本发明实施例的另一目的在于一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行所述开源组件函数的匹配方法的步骤。
本发明实施例的另一目的在于一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行所述开源组件函数的匹配方法的步骤。
本发明实施例提供的一种开源组件函数的匹配方法,通过将开源组件和目标组件中的大部分函数进行了筛除,只保护核心的第一核心函数和第二核心函数,然后进行特征提取以及匹配工作。该匹配方法大大提升了组件识别的速度和组件识别得精确度,有效压缩数据库,从而使得大规模组件识别工作变得可行。
附图说明
图1为一个实施例提供的开源组件函数的匹配方法的应用环境图;
图2为一个实施例提供的开源组件函数的匹配方法的流程图;
图3为一个实施例提供的剔除克隆函数的方法的流程图;
图4为一个实施例提供的剔除测试函数的方法的流程图;
图5为一个实施例提供的剔除工具函数的方法的流程图;
图6为一个实施例提供的筛选目标函数的方法的流程图;
图7为一个实施例提供的两步匹配策略的流程图;
图8为一个实施例提供的开源组件函数的匹配装置的结构框图;
图9为一个实施例中计算机设备的内部结构框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
可以理解,本申请所使用的术语“第一”、“第二”等可在本文中用于描述各种元件,但除非特别说明,这些元件不受这些术语限制。这些术语仅用于将第一个元件与另一个元件区分。举例来说,在不脱离本申请的范围的情况下,可以将第一xx脚本称为第二xx脚本,且类似地,可将第二xx脚本称为第一xx脚本。
图1为本发明实施例提供的开源组件函数的匹配方法的应用环境图,如图1所示,在该应用环境中,包括终端110以及计算机设备120。
计算机设备120可以是独立的物理服务器或终端,也可以是多个物理服务器构成的服务器集群,可以是提供云服务器、云数据库、云存储和CDN等基础云计算服务的云服务器。
终端110可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端110以及计算机设备120可以通过网络进行连接,本发明在此不做限制。
如图2所示,在一个实施例中,提出了一种开源组件函数的匹配方法,本实施例主要以该方法应用于上述图1中的计算机设备120来举例说明,具体可以包括步骤S202~步骤S208:
步骤S202,获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数。
具体的,开源组件是一类可应用于软件应用程序开发的第三方组件,开发人员可基于现有的开源组件来快速开发软件应用程序。开源组件由各式各样的源代码组成,而开源函数指的是开源代码中所包含的函数。目标组件是待检测的组件,其中所包含的各式各样的函数就是所述目标函数。
现有的第三方组件扫描工具通常会收集第三方组件的源码信息,并将其中的源代码文件做哈希处理,存入数据库中。在组件扫描时,这些工具会比较目标软件中文件的哈希值,与数据库中的哈希值,如果一个开源组件中的每个文件的哈希值可以与目标软件中的哈希值一一匹配,那么,扫描工具会认为该目标软件包含该第三方组件。现有技术会匹配一个开源组件中的所有文件,这样的作法存在以下几个问题:
第一,因为要针对所有文件都进行一次匹配,因此随着数据库中收录的开源组件增多,软件扫描的匹配次数也随之增加。扫描一个软件往往需要非常长的时间。
第二,数据库中也需要记录每个文件的哈希值,数据储存的开销也会非常大。特别对于线下的扫描服务,部署数据库的成本非常之大。
第三,现有方法对于扫描的文件的重要性不做考虑。一个开源组件中,可能会存在一下辅助文件,例如实现网路的链接,错误的处理等,这些辅助文件可能被多个开源组件所共享。因此,匹配这些文件不仅需要时间,而且有可能造成误报,影响匹配精确度。
为了解决这些问题,本实施例提出了一个在目标软件与开源组件中的函数提取算法。在对于一个开源组件生成哈希值特征之前,先利用该算法找出开源组件中的核心函数,然后之对这些核心函数进行特征提取以及后续的匹配工作,因此可以极大程度上缩减数据库中所储存的文件特征个数,提高匹配扫描的速度,而且也能很好的有针对性的匹配重要的文件,消除不重要文件的错误匹配对于扫描结果的影响。
步骤S204,剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数。
具体的,本实施例的目的在于从开源组件中提取与目标组件关联的第一核心函数,并通过第一核心函数建构开源建数据库。在数据库建构阶段,本实施例将开源组件中的文件中的函数分为了四个类:克隆函数、测试函数、工具函数和第一核心函数。
克隆函数是指开源组件中通过复制的方法用到其它开源组件的函数。测试函数是指组件在开发过程中用做单元测试所涉及的函数。工具函数是指一些相对于核心函数的辅助函数。而本实施例所说的核心函数包括第一核心函数和第二核心函数,都是指用于组件中不可或缺的函数类型。其中,第一核心函数是指为实现开源组件基本功能所必不可少的函数。本实施例将开源组件中的大部分函数给予筛除,仅仅保留大约十分之一的第一核心函数,一方面,第一核心函数用于后续的特征提取以及匹配工作,大大提高了第三方开源组件的识别速度和识别精度,另一方面,第一核心函数用于数据库的建构,有效地缩小了数据库的规模。
步骤S206,获取目标软件中的目标函数,对所述目标函数进行筛选,得到第二核心函数。
具体的,目标软件是指目标软件是待检测的软件,可以是一般的用户软件,目的是为了检测目标软件中是否包含有开源组件的第一核心函数;检测方法就是剔除不相关的函数,只匹配相关度高的核心函数。其中,目标软件中的第二核心函数是指为实现目标软件基本功能所不可缺少的函数。
在本实施例中,对于目标软件,本实施例同样对目标软件中的相关函数进行筛选,目的与开源组件数据库的构建相同,都是通过缩小匹配范围,提高匹配精确度。
步骤S208,对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判 断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
在本实施例中,由于得到了经过筛选之后的第一核心函数和第二核心函数,需要根据数据库中的第一核心函数来识别目标软件中的第二核心函数,进而判断与第二核心函数相对应的目标软件是否使用了现有的开源组件。
本实施例采用特征哈希法以提取函数的哈希特征。特征哈希法的目标是把原始的高维特征向量压缩成较低维特征向量,且尽量不损失原始特征的表达能力。特征哈希法实现简单,可以降低特征数量,从而加速算法训练与预测过程,以及降低内存消耗;因此通过哈希特征可快速判断第一核心函数和第二核心函数是否匹配,进而快速判断目标软件是否使用了开源组件。
在一个实施例中,如图3所示,步骤S204中剔除克隆函数的步骤具体可以包括步骤S302~S308:
步骤S302,获取所述开源函数。
步骤S304,对所述开源函数进行哈希处理,将哈希值相同的函数追溯到最早创建的源函数。
步骤S306,根据所述源函数得到克隆文件,从所述克隆文件中提取所述克隆函数。
步骤S308,剔除所述开源函数中的所述克隆函数。
具体的,对于克隆函数,首先收集所有热门开源项目的源代码,其来源可以是现有的资源网站,如Github、CSDN等等;其次,对于这些开源项目中的每个文件,使用预处理脚本删除其中包含的多余空格、换行符等与内容无关的字符;然后,对于预处理好的文件或函数做哈希处理,把哈希值相同的文件或函数通过git commit命令与blame命令进行溯源,找到相同哈希值文件中创建时间最早的一个作为这些文件或函数的源文件,将其它余下的文件视为通过复制克隆的文件。这些克隆文件中所包含的函数视为克隆函数;最后,在数据库中只保留源文件,剔除开源函数中的所有克隆函数。
在本实施例中,不同的开源组件之间存在强相互的依赖,因为开源组件中包含了大量的克隆函数。匹配这些克隆函数会导致组件识别出现误报。例如,组件A中包含了函数a,通过克隆的方式得到了组件B中的函数b。而目标程序P中使用了组件A。在对于P的组件识别时,现有工具会同时匹配到函数a和函数b。因此,组件的匹配结果可能为P中同时包含了组件A与B,其中组件B为误报。为了消除这种依赖引入的错误,需要直接定位到组件A中的b函数,并且将其从组件A的特征库中剔除,只在组件B的特征库中保留b函数特征。从而防止这样由于间接依赖(P依赖于A,A依赖于B)导致的组件识别不精确的问题。
因此,通过剔除开源函数中的克隆函数,极大的保证了组件识别中不出现因间接依赖而产生的误报;在组件识别最后软件代码所有权归属审计的工作中,剔除克隆函数也会提高数据库中真实值(ground truth)的精确度。
在一个实施例中,如图4所示,步骤S204中剔除测试函数的步骤具体可以包括步骤S402~S408:
步骤S402,获取开源函数,建构所述开源函数的函数调用图。
步骤S404,根据所述函数调用图中的函数参数计算函数的特征分值
Figure 806419DEST_PATH_IMAGE001
其中,P为函数的特征分值;w是对于每个特征值所取得权重,取值在[0,1];v是每个特征值计算出得具体值;x是每个特征的系数,取值为-1或1。
步骤S406,根据预设的动态阈值对所述特征分值进行评估,将所述特征分值小于所述动态阈值的函数设置为所述测试函数。
步骤S408,剔除所述开源函数中的所述测试函数。
具体的,对于测试函数的检测,首先,构建开源组件中的函数调用图,该函数调用图中节点代表一个函数,一条有向边代表函数之间的调用关系。然后,从函数调用图中提取信息用于识别测试函数,提取的信息如下:
1、函数的入度 ,指该函数被其它函数调用次数;
2、函数的出度,指该函数调用其它函数次数;
3、函数的霍尔斯的体积;
4、函数所使用的运算符个数;
5、函数所使用的数值的个数;
6、函数中用到的词汇的个数。
再次,通过公式来计算函数的特征分值
Figure 884359DEST_PATH_IMAGE002
其中,P为函数的特征分值;w是对于每个特征值所取得权重,取值在[0,1];v是每个特征值计算出得具体值;x是每个特征的系数,取值为-1或1。
求得特征分值后,通过设置动态的阈值,使得小于该阈值的函数比例占总函数的X%,小于该阈值的函数即为测试函数。在此,本实施例不对阈值X的取值做限定,阈值X的值可以通过学习算法训练得到,也可以根据实际实验衡量得到,或者是其他基于算法得到的阈值X。
在本实施例中,测试函数不包含特殊的逻辑,主要是调用被测试的其它函数。因为每个组件库对于测试函数的管理策略不同,很难确认特定组件库到底包不包含一些特定的测试函数。例如,组件A与B分别都包含了测试函数a和b。目标程序P使用了A与B两个组件。但是,在引入组件A与B的过程中,P只引入了组件A的测试函数a;对于B,为了缩减P的程序体积,选择忽略了测试函数部分。使用测试函数作为特征进行匹配的话,可以正确的检测出组件A。但是对于B的检测,由于无法找个函数b,可能会对B的匹配度有影响。对于测试函数占比大的组件,可能B的匹配度会非常低,从而产生漏报。另外的,对于测试函数的管理,还会影响克隆代码函数的检测。有时候可能无法正确找出克隆代码的代码源。因此,在做组件分析检测特征生成之前,将测试函数识别出来并剔除开源大大提高数据的匹配精度和效率。
在一个实施例中,如图4所示,步骤S406还包括补充所述测试函数,补充所述测试函数的方法包括步骤S502~S504:
步骤S502,从所述开源组件中提取包含所述测试函数的文件,将文件中除所述测试函数以外的函数也设置为测试函数。
步骤S504,调用任意一个测试函数,通过所述函数调用图和组群检测算法识别测试函数,剔除不符合要求的测试函数,得到所述测试函数。
在本实施例中,根据设置的阈值X和特征分值可以判断一个函数是否为测试函数,但是通过阈值判定方法并不能得到全部的测试函数。因此,本实施例通过第二步算法补全剩下的没有被识别出来的测试函数。
具体来讲,首先,将与已经被识别的测试函数在同一个文件中的其它函数也标记为测试函数;其次,将调用任意一个测试函数的函数也标记为测试函数;最后,通过之前构建的函数调用图,并通过组群检测算法,再进行最后一步识别测试函数。本实施例已尽可能全的找到所有的测试函数,并将其从数据库中剔除,不进行特征提取以及后续的匹配工作,提高了后续函数的匹配的精度。
在一个实施例中,如图5所示,步骤S204中剔除工具函数的步骤具体可以包括步骤S602~S610:
步骤S602,获取所述开源函数。
步骤S604,选取所述开源函数中任一函数,用函数分析工具生成该函数的抽象语法树和控制流图。
步骤S606,从所述抽象语法树和所述控制流图中提取代码和函数的参数指标。
步骤S608,通过随机森林模型分析所述参数指标对函数的贡献度,判断该函数是否为工具函数;若是,则得到所述工具函数。
步骤S610,剔除所述开源函数中的所述工具函数。
本实施例通过计算函数的复杂程度检测工具函数。具体的,首先利用函数分析工具生成该函数的的抽象语法树与控制流图,并通过脚本提取以下指标。
1、函数代码所占函数;
2、函数代码质量数目;
3、函数中圈复杂的;
4、函数中循环的数量;
5、函数中嵌套循环最深的层数;
6、函数中算数运算个数;
7、函数中控制流数量;
8、函数中系统调用数量。
在求得上述8个指标后,通过随机森林模型分析每个指标对于区分工具函数的贡献度。最后利用随机森林模型实现工具函数的检测工作。
在本实施例中,工具函数通常实现了常见的功能,并被其它函数多次调用,实现的功能也通常比较简单且独立。比如,在java等面向对象编程的语言中,对于所有的field,都会有对应的访问与修改函数(通常命名为get和set)。这两类函数实现的是读取,与储存特定field的值的简单功能。在组件识别的过程中,匹配这些工具函数对于识别精确度的提高意义不大,相反,有时候还会对精确度造成影响。主要原因是这些函数逻辑过于简单,函数数量占比又比较大,很容易出现目标程序中的工具函数匹配到多个组件中的相似工具函数。如果匹配比例变大,组件扫描工具很难准确的识别工具函数属于哪一个组件。因此,应该先识别这些不重要的工具函数,并将其从开源组件特征库中删除,以提高后续第三方开源组件的识别速度和识别精度。
在一个实施例中,如图6所示,步骤S206包括步骤S702~S708:
步骤S702,获取所述目标函数。
步骤S704,提取所述目标函数中的语法特征,统计所述语法特征在数据库中分布情况,得到所述语法特征的分布均值。
步骤S706,根据所述分布均值得到所述语法特征的特征阈值。
步骤S708,根据所述语法特征和所述特征阈值生成决策树,判断所述目标函数是否符合与所述第一核心函数的匹配要求;若是,得到所述第二核心函数。
在本实施例中,目标软件是待检测和待匹配的软件。本实施例同样对目标软件中的函数进行识别和剔除,与筛选开源组件中函数相同,其目的都在于缩小匹配范围,提高匹配精确度。具体的,假设目标软件中原本有M个函数,数据库中原本有N个函数,那么匹配次数为M*N。如果将N缩小为原本的十分之一,M也缩小到十分之一,那么需要匹配的次数变为0.01M*N。
然而,本实施例的所采用的函数筛选方法与上述实施例中的开源组件函数的筛选方法不同,具体方法如下:
首先,本实施例不删除克隆代码,因为克隆代码本身是寻找的第三方组件的引用。其次,不从目标组件的函数中提取控制流图或数据流图,而只针对函数本身语法特征进行提取。然后,计算对应语法特征在数据库的分布情况,计算该语法特征的平均值,再根据该语法特征选取一个特征阈值;在此,本实施例不对特征阈值的选取做限定,特征阈值可以通过学习算法训练得到,也可以根据实际实验衡量得到。最后,根据每个语法特征和其对应的特征阈值生成一个决策树,可快速判断目标函数是否是为所需的函数,即第二核心函数。
在本实施例中,因为数据库可以离线构建,其时间开销可以忽略不记,但处理目标程序为线上执行,函数缩减带来工作时间减少,函数分析对应工作时间增加。因此,为了平衡时间上的差异,本实施例采用轻量级的函数删减方法,优化开源组件函数匹配方法的整体工作流程。
在一个实施例中,步骤S208包括步骤S802~S806:
步骤S802,对所述第一核心函数和所述第二核心函数进行哈希处理,将所述第一核心函数和所述第二核心函数的哈希特征进行匹配,从所述第二核心函数中提取符合匹配要求的函数,得到匹配函数。
步骤S804,利用源码分词器,从所述第一核心函数和所述匹配函数中提取函数特征词,对函数特征词进行组合,得到函数特征词组。
步骤S806,利用滑动窗口算法,对所述第一核心函数和所述匹配函数的函数特征词组进行匹配,判断所述第一核心函数和所述匹配函数是否匹配;若匹配,得到含有所述开源组件的所述目标软件。
在本实施例中,通过第一核心函数与数据库中开源组件函数进行匹配以明确目标软件中用到的开源函数。如图7所示,为了进一步提高匹配速度并保证匹配的精确度,本实施例通过两步匹配策略执行匹配工作。
第一步,对第一核心函数和第二核心函数做哈希处理,利用弹性搜索进行哈希匹配。如果第二核心函数中集中的某些函数与开源组件A,B,C中的第一核心函数的哈希值一致,将A、B、C单独从数据库中提取出来,并进行第二步的精确匹配以确认这三个库是否真正被目标组件所引用。
第二步,采用源码分词器与滑动窗口算法提取开源组件A、B、C中每个函数的特征,将其逐一与第二核心函数的特征来进行匹配。具体的,首先,对与开源组件A、B、C每个函数中的每个词语用antlr定义分为一个个词语,并去除其中多余的空格与注释等。然后,用长度为1到3的划动窗口来提取词组包;例如,一个函数中包含a、b、c、d 四个词用,那么提取出来的词用特征为a,b,c,d (窗口为1);ab,bc,cd(窗口为2);abc,bcd(窗口为3)。之后,将开源组件A、B、C函数中的词组与第二核心函数中的词组进行匹配,如果匹配程度大于预设阈值,则认定这两个函数匹配成功。当目标组件的第二核心函数匹配上数据库中开源组件的函数时,我们认为该程序使用了这个组件。
相对于只采用哈希匹配方法,本实施例采用的两步匹配方法的优点在于:可以允许函数做细微的改变,即使将函数中的某些变量名进行了更换,通过词组匹配方式依然可以匹配该函数,从而快速识别可能的组件,并且在小范围内进行精确确认组件。
如图8所示,在一个实施例中,提供了一种开源组件函数的匹配装置,该开源组件函数的匹配装置可以集成于上述的计算机设备120中,具体可以包括:
函数获取模块200,用于获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
函数提取模块300,剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;对所述目标函数进行筛选,得到第二核心函数;
函数匹配模块400,对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
图9示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110。如图9所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现开源组件函数的匹配方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行开源组件函数的匹配方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图9中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供的开源组件函数的匹配装置可以实现为一种计算机程序的形式,计算机程序可在如图9所示的计算机设备上运行。计算机设备的存储器中可存储组成该开源组件函数的匹配装置的各个程序模块,比如,图8所示的函数获取模块200、函数提取模块300和函数匹配模块400。 各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的开源组件函数的匹配方法中的步骤。
例如,图9所示的计算机设备可以通过如图8所示的开源组件函数的匹配装置中的函数获取模块200执行步骤S202。计算机设备可通过函数提取模块300执行步骤S204和步骤S206。计算机设备可通过函数匹配模块400执行步骤S208。
在一个实施例中,提出了一种计算机设备,所述计算机设备包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;
对所述目标函数进行筛选,得到第二核心函数;
对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
在一个实施例中,提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时,使得处理器执行以下步骤:
获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;
对所述目标函数进行筛选,得到第二核心函数;
对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
应该理解的是,虽然本发明各实施例的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,各实施例中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (8)

1.一种开源组件函数的匹配方法,其特征在于,所述开源组件函数的匹配方法包括:
获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;
对所述目标函数进行筛选,得到第二核心函数;
对所述第一核心函数和所述第二核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的目标软件;
剔除所述测试函数的方法包括:
获取开源函数,建构所述开源函数的函数调用图;
根据所述函数调用图中的函数参数计算函数的特征分值
Figure DEST_PATH_IMAGE002
其中,P为函数的特征分值;w是对于每个特征值所取得权重,取值在[0,1];v是每个特征值计算出得具体值;x是每个特征的系数,取值为-1或1;
根据预设的动态阈值对所述特征分值进行评估,将所述特征分值小于所述动态阈值的函数设置为所述测试函数;
剔除所述开源函数中的所述测试函数;
剔除所述工具函数的方法包括:
获取所述开源函数;
选取所述开源函数中任一函数,用函数分析工具生成该函数的抽象语法树和控制流图;
从所述抽象语法树和所述控制流图中提取代码和函数的参数指标;
通过随机森林模型分析所述参数指标对函数的贡献度,判断该函数是否为工具函数;若是,则得到所述工具函数;
剔除所述开源函数中的所述工具函数。
2.根据权利要求1所述的开源组件函数的匹配方法,其特征在于,剔除所述克隆函数的方法包括:
获取所述开源函数;
对所述开源函数进行哈希处理,将哈希值相同的函数追溯到最早创建的源函数;
根据所述源函数得到克隆文件,从所述克隆文件中提取所述克隆函数;
剔除所述开源函数中的所述克隆函数。
3.根据权利要求1所述的开源组件函数的匹配方法,其特征在于,所述根据预设的动态阈值对所述特征分值进行评估,将所述特征分值小于所述动态阈值的函数设置为所述测试函数,之后还包括补充所述测试函数;补充所述测试函数的方法包括:
从所述开源组件中提取包含所述测试函数的文件,将文件中除所述测试函数以外的函数也设置为测试函数;
调用任意一个测试函数,通过所述函数调用图和组群检测算法识别测试函数,剔除不符合要求的测试函数,得到所述测试函数。
4.根据权利要求1所述的开源组件函数的匹配方法,其特征在于,所述目标函数进行筛选,得到第二核心函数,包括:
获取所述目标函数;
提取所述目标函数中的语法特征,统计所述语法特征在数据库中分布情况,得到所述语法特征的分布均值;
根据所述分布均值得到所述语法特征的特征阈值;
根据所述语法特征和所述特征阈值生成决策树,判断所述目标函数是否符合与所述第一核心函数的匹配要求;若是,得到所述第二核心函数。
5.根据权利要求1所述的开源组件函数的匹配方法,其特征在于,所述根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配,包括:
对所述第一核心函数和所述第二核心函数进行哈希处理,将所述第一核心函数和所述第二核心函数的哈希特征进行匹配,从所述第二核心函数中提取符合匹配要求的函数,得到匹配函数;
利用源码分词器,从所述第一核心函数和所述匹配函数中提取函数特征词,对函数特征词进行组合,得到函数特征词组;
利用滑动窗口算法,对所述第一核心函数和所述匹配函数的函数特征词组进行匹配,判断所述第一核心函数和所述匹配函数是否匹配;若匹配,得到含有所述开源组件的所述目标软件。
6.一种开源组件函数的匹配装置,其特征在于,执行权利要求1至5中任一项权利要求,所述开源组件函数的匹配装置包括:
函数获取模块,用于获取开源函数和目标函数;所述开源函数为开源组件中的所有函数,所述目标函数为目标组件中的所有函数;
函数提取模块,剔除所述开源函数中的克隆函数、测试函数和工具函数,得到第一核心函数;对所述目标函数进行筛选,得到第二核心函数;
函数匹配模块,对所述第一核心函数和所述核心函数进行哈希处理,根据所述第一核心函数和所述第二核心函数的哈希特征,判断所述第一核心函数和所述第二核心函数是否匹配;若匹配,得到含有所述开源函数的所述目标软件。
7.一种计算机设备,其特征在于,包括存储器和处理器,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行权利要求1至5中任一项权利要求所述开源组件函数的匹配方法的步骤。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行权利要求1至5中任一项权利要求所述开源组件函数的匹配方法的步骤。
CN202210274214.2A 2022-03-21 2022-03-21 开源组件函数的匹配方法、装置、计算机设备和存储介质 Active CN114356405B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210274214.2A CN114356405B (zh) 2022-03-21 2022-03-21 开源组件函数的匹配方法、装置、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210274214.2A CN114356405B (zh) 2022-03-21 2022-03-21 开源组件函数的匹配方法、装置、计算机设备和存储介质

Publications (2)

Publication Number Publication Date
CN114356405A CN114356405A (zh) 2022-04-15
CN114356405B true CN114356405B (zh) 2022-05-17

Family

ID=81094712

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210274214.2A Active CN114356405B (zh) 2022-03-21 2022-03-21 开源组件函数的匹配方法、装置、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN114356405B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9158514B2 (en) * 2012-09-26 2015-10-13 International Business Machines Corporation Method and apparatus for providing change-related information
CN109189374A (zh) * 2018-06-22 2019-01-11 北京大学 基于对象引用链的对象构造代码生成方法及系统
CN110990273A (zh) * 2019-11-29 2020-04-10 中国银行股份有限公司 克隆代码检测方法及装置
WO2021258789A1 (zh) * 2020-06-22 2021-12-30 深信服科技股份有限公司 一种恶意软件识别的方法、系统、设备及可读存储介质
CN113901474A (zh) * 2021-09-13 2022-01-07 四川大学 一种基于函数级代码相似性的漏洞检测方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10116681B2 (en) * 2016-12-21 2018-10-30 Denim Group, Ltd. Method of detecting shared vulnerable code

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9158514B2 (en) * 2012-09-26 2015-10-13 International Business Machines Corporation Method and apparatus for providing change-related information
CN109189374A (zh) * 2018-06-22 2019-01-11 北京大学 基于对象引用链的对象构造代码生成方法及系统
CN110990273A (zh) * 2019-11-29 2020-04-10 中国银行股份有限公司 克隆代码检测方法及装置
WO2021258789A1 (zh) * 2020-06-22 2021-12-30 深信服科技股份有限公司 一种恶意软件识别的方法、系统、设备及可读存储介质
CN113901474A (zh) * 2021-09-13 2022-01-07 四川大学 一种基于函数级代码相似性的漏洞检测方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
"Identifying Cross-Version Function Similarity Using Contextual Features";Paul Black 等;《2020 IEEE 19th International Conference on Trust, Security and Privacy in Computing and Communications》;20210209;810-818 *
"基于候选函数组的固件间函数对应关系构建方法";肖睿卿 等;《网络与信息安全学报》;20210415;第7卷(第2期);110-125 *
"基于属性图匹配的漏洞代码检测技术";童瀛 等;《中国人民公安大学学报(自然科学版)》;20210815(第3期);66-73 *

Also Published As

Publication number Publication date
CN114356405A (zh) 2022-04-15

Similar Documents

Publication Publication Date Title
US10303874B2 (en) Malicious code detection method based on community structure analysis
CN109063217B (zh) 电力营销系统中的工单分类方法、装置及其相关设备
US20220222372A1 (en) Automated data masking with false positive detection and avoidance
CN111176990A (zh) 基于数据决策的测试数据生成方法、装置、计算机设备
CN110458324B (zh) 风险概率的计算方法、装置和计算机设备
CN111861463A (zh) 基于区块链和人工智能的信息智能识别方法及大数据平台
CN110888625B (zh) 基于需求变更和项目风险对代码质量进行控制的方法
US20210142169A1 (en) Prediction interpretation
CN114036531A (zh) 一种基于多尺度代码度量的软件安全漏洞检测方法
CN114610635A (zh) 接口测试用例生成方法、装置、计算机设备及存储介质
CN111191443A (zh) 基于区块链的敏感词检测方法、装置、计算机设备和存储介质
CN112613072B (zh) 基于档案大数据的信息管理方法、管理系统及管理云平台
CN112464660B (zh) 文本分类模型构建方法以及文本数据处理方法
CN113268567A (zh) 多属性文本匹配方法、装置、设备和存储介质
CN114356405B (zh) 开源组件函数的匹配方法、装置、计算机设备和存储介质
CN116991455A (zh) 一种api资产识别方法和装置
CN113821251B (zh) 基于人工智能的代码优化方法、装置、设备和存储介质
CN114792007A (zh) 代码检测方法、装置、设备、存储介质和计算机程序产品
Ju et al. Detection of malicious code using the direct hashing and pruning and support vector machine
CN117312833B (zh) 一种应用于数字资产环境中的数据识别方法及系统
CN113268647B (zh) 一种网络安全情报数据的分类方法、系统及装置
CN117292304B (zh) 一种多媒体数据传输控制方法及系统
CN117614681B (zh) 智能合约的重入漏洞检测方法、系统、设备和存储介质
CN115809466B (zh) 基于stride模型的安全需求生成方法、装置、电子设备及介质
CN110177006B (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