CN114924790A - 基于源码分析的开源成分检测方法及系统 - Google Patents
基于源码分析的开源成分检测方法及系统 Download PDFInfo
- Publication number
- CN114924790A CN114924790A CN202210340961.1A CN202210340961A CN114924790A CN 114924790 A CN114924790 A CN 114924790A CN 202210340961 A CN202210340961 A CN 202210340961A CN 114924790 A CN114924790 A CN 114924790A
- Authority
- CN
- China
- Prior art keywords
- code
- component
- open source
- file
- detection method
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/13—File access structures, e.g. distributed indices
- G06F16/137—Hash-based
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Computing Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开一种基于源码分析的开源成分检测方法及系统,其中该方法包括:获取若干开源组件,以构建基础源码数据库;对基础源码数据库中的开源组件进行解析,以得到片段索引库,片段索引库包括若干第一索引文件;检测方法包括代码行匹配检测方法:分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码,根据该哈希码在片段索引库中查找相应地第一索引文件,以获得与该代码行相对应的开源组件信息;计算各个开源组件与该待测源码组件的相似度;上述检测方法从软件项目的最底层(代码层面)进行分析,并通过哈希码进行变换查找,从而不但实现了开源成分的精准检测,而且检测效率得到有效提高,可基于海量源代码知识库进行检测。
Description
技术领域
本发明涉及混源软件的开源成分分析技术领域,尤其涉及一种基于源码分析的开源成分检测方法及系统。
背景技术
现如今,一般在软件开发项目中都会采用大量的开源代码,以提高软件开发的效率,然而,这虽然可提高开发效率,但是却会引来一些严重的漏洞,所以,在开发过程中以及开发完成后,需要着重对项目中的开源成分进行分析,以检测其中隐藏的漏洞。针对开源成分的分析,就是分析项目中的引用的开源成分,包括使用的开源组件或者拷贝的部分开源代码。目前已经有很多SCA(软件成分分析工具)工具已经可以支持开源成分的分析,但是这些工具大多是基于项目的特征文件来分析项目的开源成分,也就是分析项目中使用到的开源组件。而基于代码的开源成分分析则很少,究其主要原因,是因为基于海量的开源代码进行开源成分的分析的难度很大,检测效率是很大的难点。
发明内容
本发明的目的是为解决上述技术问题的不足而提供一种可从代码层面对软件项目中的开源成分进行分析且检测效率和精准度都比较高的基于源码分析的开源成分检测方法及系统。
为了实现上述目的,本发明公开了一种基于源码分析的开源成分检测方法,其包括:
获取若干开源组件,以构建基础源码数据库;
对所述基础源码数据库中的所述开源组件进行解析,以得到片段索引库,所述片段索引库包括若干第一索引文件,每一所述第一索引文件记录具有相同哈希码的代码行所属的开源组件信息,且,根据与所述第一索引文件相对应的哈希码可查找到该第一索引文件;
所述检测方法包括代码行匹配检测方法:分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码,根据该哈希码在所述片段索引库中查找相应地第一索引文件,以获得与该代码行相对应的开源组件信息,并将连续匹配行数最多者作为与该源码文件对应的开源组件;根据所查找到的各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
较佳地,对所述基础源码数据库中的所述开源组件进行解析,还获得有组件索引库和文件索引库;
所述组件索引库,包括第二索引文件,所述第二索引文件记录开源组件信息和与其所对应的哈希码的对应关系;
所述文件索引库,包括若干第三索引文件,每一所述第三索引文件记录具有相同哈希码的源码文件所对应的开源组件信息,且,根据与所述第三索引文件相对应的哈希码可查找到该第三索引文件;
所述检测方法还包括设置在所述代码行匹配检测方法之前的文件匹配检测方法和设置在所述文件匹配检测方法之前的组件匹配检测方法;
所述组件匹配检测方法为:计算待测源码组件的哈希码,并在所述第二索引文件中查找是否存在相同的哈希码,如果是,则获得该待测源码组件的开源组件信息,并退出对当前待测源码组件的检测,如果否,则进入所述文件匹配检测方法;
所述文件匹配检测方法为:计算待测源码组件中每个源码文件的哈希码,根据该哈希码在所述文件索引库中查找相应地所述第三索引文件,并根据找出的所述第三索引文件获得与该源码文件相对应的开源组件信息,以此,获得该待测源码组件中所有源码文件的开源组件信息,并统计查找到的每一开源组件所对应的源码文件的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度;
对于在所述文件匹配检测方法中未查找到相应开源组件信息的源码文件,通过所述代码行匹配检测方法进行处理,并结合通过所述文件匹配检测方法获取到的各个开源组件与该待测源码组件的相似度综合计算各个开源组件与该待测源码组件的相似度。
较佳地,对所述基础源码数据库中的所述开源组件进行解析,还获得有函数索引库,所述函数索引库包括若干第四索引文件,每一所述第四索引文件记录具有相同哈希码的函数结构所对应的开源组件信息,且,根据与所述第四索引文件相对应的哈希码可查找到该第四索引文件;
所述检测方法还包括位于所述文件匹配检测方法和所述代码行匹配检测方法之间的函数匹配检测方法,对于在所述文件匹配检测方法中未查找到相应开源组件信息的源码文件,通过所述函数匹配检测方法进行处理;
所述函数匹配检测方法包括:提取待测源码文件中的语法树,并计算语法树的哈希码,根据该哈希码在所述函数索引库中查找相应地所述第四索引文件,并根据找出的所述第四索引文件获得与该语法树相对应的开源组件信息,以此,获得该待测源码组件中所有语法树的开源组件信息,并统计查找到的每一开源组件所对应的语法树的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度;
对于在所述函数匹配检测方法中未查找到相应开源组件信息的源码文件,通过所述代码行匹配检测方法进行处理,并结合通过所述文件匹配检测方法和通过所述函数匹配检测方法获取到的各个开源组件与该待测源码组件的相似度综合计算各个开源组件与该待测源码组件的相似度。
较佳地,所述第一索引文件的存储及匹配方法包括:
计算出代码行的哈希码后,将该哈希码分为若干连续的哈希数码段,并以若干连续的所述哈希数码段为目录名建立多级存储目录,将所述第一索引文件存储在该存储目录中;
对待测源码文件中的代码行执行哈希计算并获得哈希码后,通过与建立所述多级存储目录相同的分段原则将该哈希码分为若干连续的哈希数码段,根据该哈希数码段在所述片段索引库中逐级查找。
较佳地,对通过所述文件匹配检测方法、所述函数匹配检测方法以及所述代码行匹配检测方法获取到的相似度分配不同的权重,且分配给通过所述文件匹配检测方法所述获取到的相似度的权重大于通过所述函数匹配检测方法获取到的相似度的权重,分配给通过所述函数匹配检测方法获取到的相似度的权重大于通过所述片段匹配检测方法获取到的相似度的权重,然后综合计算各个开源组件与该待测源码组件的相似度。
较佳地,在所述文件匹配检测方法中,如果任一开源组件与待测源码组件的相似度大于第一预设值,则将该开源组件认定为所检测到的目标对象,并停止继续通过函数匹配检测方法和代码行匹配检测方法对待测源码组件进行开源成分的检测。
较佳地,在所述文件匹配检测方法中,如果任一开源组件与待测源码组件的相似度大于第二预设值,则,将该开源组件定义为待选开源组件,并在后续的所述函数匹配检测方法和代码行匹配检测方法中,以所述待选开源组件作为查找对象。
本发明还公开一种基于源码分析的开源成分检测系统,其包括基础数据收集模块、解析模块以及代码行检测模块;
所述基础数据收集模块,用于获取若干开源组件,以构建基础源码数据库;
所述解析模块,用于对所述基础源码数据库中的所述开源组件进行解析,以得到片段索引库,所述片段索引库包括若干第一索引文件,每一所述第一索引文件记录具有相同哈希码的代码行所属的开源组件信息,且,根据与所述第一索引文件相对应的哈希码可查找到该第一索引文件;
所述代码行检测模块,包括哈希计算模块、匹配模块和相似度计算模块;
所述哈希计算模块,用于分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码;
所述匹配模块,用于根据该哈希码在所述片段索引库中查找相应地第一索引文件,以获得与该代码行相对应的开源组件信息,并将连续匹配行数最多者作为与该源码文件对应的开源组件;
所述相似度计算模块,用于根据所查找到的各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
本发明还公开一种基于源码分析的开源成分检测系统,其包括:
一个或多个处理器;
存储器;
以及一个或多个程序,其中一个或多个程序被存储在所述存储器中,并且被配置成由所述一个或多个处理器执行,所述程序包括用于执行如上所述的基于源码分析的开源成分检测方法的指令。
本发明还公开一种计算机可读存储介质,其特征在于,包括计算机程序,所述计算机程序可被处理器执行以完成如上所述的基于源码分析的开源成分检测方法。
与现有技术相比,本发明开源成分检测方法,构建有包括若干开源组件的基础源码数据库,并预先对该基础源码数据库中的开源组件进行解析处理,以得到包括若干第一索引文件的片段索引库,针对某一开源组件进行检测时,只需对开源组件中每一开源文件的每一代码行进行哈希计算,然后即可通过片段索引库查找出与待测源码组件相关的开源组件,并统计出所找出的各个开源组件与待测源码组件的相似度,从而为软件项目的开源成分分析提供依据;由此可知,上述检测方法从软件项目的最底层(代码层面)进行分析,并通过哈希码进行变换查找,从而不但从代码层面实现了对软件项目开源成分的精准检测,而且检测效率得到有效提高,可基于海量源代码知识库进行检测,检测覆盖率高,而且检测过程中无需操作任性进行主动分析,操作简单。
附图说明
图1为本发明其中一实施例中开源成分检测方法流程图。
图2为图1中代码行匹配检测方法流程图。
图3为发明另一实施例中开源成分检测方法流程图。
图4为图3中组件匹配检测方法流程图。
图5为图3中文件匹配检测方法流程图。
图6为本发明再一实施例中开源成分检测方法流程图。
图7为图6中函数匹配检测方法流程图。
图8为本发明实施例中对代码行执行哈希计算的处理示意图。
图9为本发明实施例中其中一第一索引文件记录示意图。
图10为本发明实施例中另一第一索引文件记录示意图。
具体实施方式
为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。
本实施例公开了一种开源成分检测方法,以基于源码分析的方式实现从代码层面对软件项目中的开源成分进行检测,并确保检测效率,在本实施例中,如图1,该检测方法包括如下步骤:
SA:获取若干开源组件(也即源码包),以构建基础源码数据库。
具体地,在该步骤中,先从maven、npm、pypi等远程仓库里获取开源组件的信息,包括组件名称、版本、源代码托管平台url等信息,并生成组件库(如图),然后根据组件库中源代码托管平台url信息找到对应的源代码的位置,下载源码。接着,继续找到该开源组件的源代码对应的仓库信息,下载该仓库下的所有项目的源代码,并将所有项目对应的开源组件信息维护到组件库中,从而尽可能全面收集开源组件。后续在对基础源码数据库进行更新时,可遍历组件库的信息,查找未下载源码的记录,去对应的源代码托管平台下载源代码。另外需要说明的是,本实施例中的开源组件一般是zip,tar,tar.gz等压缩包格式,其中包括若干开源文件,而每一开源文件又包括若干行源代码。
SB:对基础源码数据库中的开源组件进行解析,以得到片段索引库,片段索引库包括若干第一索引文件,每一第一索引文件记录具有相同哈希码的代码行所属的开源组件信息,且,根据与第一索引文件相对应的哈希码可查找到该第一索引文件。
在本步骤,开源组件信息包括开源组件名、版本、开源组件存储位置以及具有相同哈希码的代码行的行号,如图10所示的第一索引文件表示:开源组件commonio中的开源文件a.java的第一行和开源文件c.java的第九行具有相同的哈希码0101tywq9821ksj1,该开源组件的存储目录为/opt/commonio/src。
SG:上述准备工作完成后,通过代码行匹配检测方法对待测源码组件(待测的源码包)进行检测,具体地,如图2,该代码行匹配检测方法为:
SG1:分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码;
SG2:根据该哈希码在片段索引库中查找相应地第一索引文件,从而,根据该第一索引文件可获得与该代码行相对应的开源组件信息,并将连续匹配行数最多者作为与该源码文件对应的开源组件;
SG3:根据所查找到的各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
对于上述步骤SG中,具体地,对于待测源码组件中任一源码文件,从第一行代码开始顺序读取,并计算所读取到的每一行源代码的哈希码,然后根据该哈希码找到对应的第一索引文件A,并将该第一索引文件A中的信息存储到内存map1中,根据该第一索引文件A中的信息,与该代码行相对应的开源组件和开源文件可能有多个。
同理,读取该源码文件的第二行代码,并计算该第二行源代码的哈希码,并找到所对应的第一索引文件B,并读取第一索引文件B中的信息,根据该第一索引文件B中的信息,与该代码行相对应的开源组件和开源文件也可能有多个。
然后将第一索引文件B中的信息与存储在内存map1中的第一索引文件A中的信息进行比对,以找到相同开源组件、相同开源文件,且行号是连续的开源组件,并将找到的信息存入内存map2中。
以此类推,可以找到若干分别与当前源码文件连续N行代码相同的开源组件,然后,将连续匹配行数最多者作为与该源码文件对应的开源组件。例如,对于对于源码文件1,如果查找结果显示,开源组件A中有50行与之连续匹配的代码,开源组件B中有20行与之连续匹配的代码,开源组件C有10行与之连续匹配的代码,那么结果保留50行与之连续匹配的开源组件A,从而得到与源码文件1匹配的开源组件为开源组件A。在此需要说明的是,本实施例中的数值仅用作举例说明,并不对具体方案构成限定。
最后,根据所查找到的各个开源组件所对应的源码文件的数量计算各个开源组件与该待测源码组件的相似度。例如,当前待测源码组件中有100个源码文件,上述步骤查找结束后,通过统计得知,找到三个相关的开源组件,分别为开源组件A、开源组件B以及开源组件C,且与开源组件A相对应的源码文件有60个,与开源组件B相对应的源码文件有30个,与开源组件C相对应的源码文件有10个,那么,开源组件A与该待测源码组件的相似度为60%,开源组件B与该待测源码组件的相似度为30%,开源组件C与该待测源码组件的相似度为10%。当然,也有可能仅找到一个开源组件,该开源组件对应100个源码文件,所以,该开源组件与该待测源码组件的相似度为100%.
根据上述实施例可知,通过代码行匹配检测方法,只需对开源组件中每一开源文件的每一代码行进行哈希计算,然后即可通过片段索引库查找出与待测源码组件相关的开源组件,并统计出所找出的各个开源组件与待测源码组件的相似度,从而为软件项目的开源成分分析提供依据。该检测方法从软件项目的最底层(代码层面)进行分析,并通过哈希码进行变换查找,从而不但从代码层面实现了对软件项目开源成分的精准检测,而且检测效率得到有效提高,可基于海量源代码知识库进行检测,检测覆盖率高,而且检测过程中无需操作任性进行主动分析,操作简单。
为了兼顾检测效率和准确度,本发明开源成分检测方法另一较佳实施例中,如图3,还包括设置在代码行匹配检测方法之前的文件匹配检测方法(SE)和设置在文件匹配检测方法之前的组件匹配检测方法(SC)。对此,在上述对基础源码数据库中的开源组件进行解析的步骤SB中,还获得有组件索引库和文件索引库。
组件索引库,包括第二索引文件,第二索引文件记录开源组件信息和与其所对应的哈希码的对应关系。
文件索引库,包括若干第三索引文件,每一第三索引文件记录具有相同哈希码的源码文件所对应的开源组件信息,且,根据与第三索引文件相对应的哈希码可查找到该第三索引文件。
如图4,组件匹配检测方法为:
SC1:计算待测源码组件的哈希码;
SC2:并在第二索引文件中查找是否存在相同的哈希码,如果是,则进入SC3,如果否,则进入进入文件匹配检测方法(SE);
SC3:获得该待测源码组件的开源组件信息,并退出对当前待测源码组件的检测。
本实施例中,通过组件匹配检测方法的设置,当有开源组件与待测源码组件完全一致时,可快速完成检测,从而有效提高检测速度。
如图5,文件匹配检测方法SE为:
SE1:计算待测源码组件中每个源码文件的哈希码;
SE2:根据该哈希码在文件索引库中查找相应地第三索引文件,并根据找出的第三索引文件获得与该源码文件相对应的开源组件信息,以此,获得该待测源码组件中所有源码文件的开源组件信息;
SE3:统计查找到的每一开源组件所对应的源码文件的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度。
为便于理解上述文件匹配检测方法,下面举例说明:在某一待测源码组件中,有100个源码文件,其中有20个源码文件能匹配到相同的开源文件,例如,源码文件1匹配到开源文件1,源码文件2匹配到开源文件2、源码文件3匹配到开源文件3……,而开源文件1、开源文件2、开源文件3……对应的开源组件可能是不同的,因此,通过统计可能得到这样的结果:这20个开源文件中,有10个与开源组件A相对应,有5个与开源组件B相对应,有5个与开源组件C相对应。因此,该待测源码组件与开源组件A的相似度为50%,与开源组件B和开源组件C的相似度均为25%。对于另外80个未查找到相应开源组件信息的源码文件,通过代码行匹配检测方法进行处理。
对于在文件匹配检测方法中未查找到相应开源组件信息的源码文件,通过代码行匹配检测方法进行处理,并结合通过文件匹配检测方法获取到的各个开源组件与该待测源码组件的相似度综合计算各个开源组件与该待测源码组件的相似度(如图3中步骤SH)。
进一步地,为进一步提高对源码组件中开源成分检测的精准度,本发明开源成分检测方法另一较佳实施例中,如图6,还包括有设置于文件匹配检测方法(SE)和代码行匹配检测方法(SG)之间的函数匹配检测方法(SF),对于在文件匹配检测方法中未查找到相应开源组件信息的源码文件,通过函数匹配检测方法进行处理。对此,对基础源码数据库中的开源组件进行解析时,还获得有函数索引库,函数索引库包括若干第四索引文件,每一第四索引文件记录具有相同哈希码的函数结构所对应的开源组件信息,且,根据与第四索引文件相对应的哈希码可查找到该第四索引文件。
如图7,该函数匹配检测方法SF包括:
SF1:提取待测源码文件中的语法树;
SF2:计算语法树的哈希码;
SF3:根据该哈希码在函数索引库中查找相应地第四索引文件,并根据找出的第四索引文件获得与该语法树相对应的开源组件信息,以此,获得该待测源码组件中所有语法树的开源组件信息;
SF4:并统计查找到的每一开源组件所对应的语法树的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度。例如,从待测源码组件的所有源码文件(在文件匹配检测方法中未查找到相应开源组件信息的部分)中提取出的语法树有100个,查找出的开源组件有三个,分别为开源组件A、开源组件B、开源组件C,开源组件A对应的语法树有50个,开源组件B对应的语法树有30个,开源组件C对应的语法树有20个,那么,开源组件A与该待测源码组件的相似度为50%,开源组件B与该待测源码组件的相似度为30%,开源组件C与该待测源码组件的相似度为20%。然后,对于在函数匹配检测方法中未查找到相应开源组件信息的源码文件,通过代码行匹配检测方法进行处理,并结合通过文件匹配检测方法和通过函数匹配检测方法获取到的各个开源组件与该待测源码组件的相似度综合计算各个开源组件与该待测源码组件的相似度(如图6中步骤SH)。
进一步地,对通过文件匹配检测方法、函数匹配检测方法以及代码行匹配检测方法获取到的相似度分配不同的权重,且分配给通过文件匹配检测方法获取到的相似度的权重大于通过函数匹配检测方法获取到的相似度的权重,分配给通过函数匹配检测方法获取到的相似度的权重大于通过片段匹配检测方法获取到的相似度的权重,然后综合计算各个开源组件与该待测源码组件的相似度。例如,分别为通过文件匹配检测方法、函数匹配检测方法以及代码行匹配检测方法获取到的相似度分配的权重为q1、q2、q3。通过文件匹配检测方法获得的开源组件A的相似度为a1,开源组件B的相似度为b1,开源组件C的相似度为c1;通过函数匹配检测方法获得的开源组件A的相似度为a2,开源组件B的相似度为b2,开源组件C的相似度为c2;通过代码行匹配检测方法获得的开源组件A的相似度为a3,开源组件B的相似度为b3,开源组件C的相似度为c3;那么,最终综合计算出的各个开源组件与该待测源码组件的相似度结果为:开源组件A的相似度=a1*q1+a2*q2+a3*q3,开源组件B的相似度=b1*q1+b2*q2+b3*q3,开源组件C的相似度=c1*q1+c2*q2+c3*q3。
综上,根据上述公开的开源成分检测方法对某一源码组件进行开源成分检测时,如图6,步骤如下:
SC:进入组件匹配检测方法,对该源码组件整体进行哈希计算,以得到哈希码A;
SD:根据该哈希码A在组件索引库中的第二索引文件中查找,以判断是否查找到与待测源码组件相对应的开源组件,如果否,则进入SE,如果是,说明当前源码组件整体为开源组件,从而完成对该源码组件的开源成分检测,直接结束;
SE:进入文件匹配检测方法,以继续对当前源码组件进行开源成分的检测。
进入文件匹配检测方法后,首先对当前源码组件解压,以得到其中的若干源码文件,如,a.java、b.java等。然后,对每一源码文件执行哈希计算,以得到与源码文件相对应的哈希码B。接着,根据该哈希码B在文件索引库中查找相应地第三索引文件,如果查找成功,则根据第三索引文件的记录即可获得与该源码文件相对应的开源组件信息。以此,获得该源码组件中所有源码文件的开源组件信息,并统计查找到的每一开源组件所对应的源码文件的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度。对于未查找到相应地第三索引文件的源码文件,通过函数匹配检测方法对其进行分析。
SF:进入函数匹配检测方法后,首先提取目标源码文件中的语法树,然后对语法树执行哈希计算,以获得哈希码C,然后根据该哈希码C在函数索引库中查找相应地第四索引文件,并根据第四索引文件的记录获取相应地开源组件信息。因此,获得所有语法树的开源组件信息,并统计查找到的每一开源组件所对应的语法树的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度。对于通过函数匹配检测方法仍然未查找到对应开源组件的源码文件,通过代码行匹配方法对其进行处理。
SG:进入代码行匹配方法后,逐行计算目标源码文件中每一行代码的哈希值,以得到哈希码D,然后根据哈希码D在片段索引库中查找相应地第一索引文件,并根据第一索引文件的记录获得与该代码行相对应的开源组件,进而获得若干分别具有连续N行代码与源码文件相同的开源组件,从而根据各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
SH:当代码行匹配方法执行完毕后,根据文件匹配检测方法、函数匹配检测方法以及代码行匹配检测方法的检测结果以及分配给各个匹配方法的权重综合计算各个开源组件与待测源码组件的相似度。
为进一步提高检测速度,在文件匹配检测方法中,如果任一开源组件与待测源码组件的相似度大于第一预设值(如60%或80%),则将该开源组件认定为所检测到的目标对象,并停止继续通过函数匹配检测方法和代码行匹配检测方法对待测源码组件进行开源成分的检测。
另外,为逐步提高检测精度,在文件匹配检测方法中,如果任一开源组件与待测源码组件的相似度大于第二预设值(如50%),则,将该开源组件定义为待选开源组件,并在后续的函数匹配检测方法和代码行匹配检测方法中,以待选开源组件作为查找对象,从而在函数匹配检测方法和代码行匹配检测方法中,有效拼除小概率的干扰项,有效提高检测精度。
进一步地,上述实施例中的第一索引文件的存储及匹配方法包括:
计算出代码行的哈希码后,将该哈希码分为若干连续的哈希数码段,并以若干连续的哈希数码段为目录名建立多级存储目录,将第一索引文件存储在该存储目录中;
对待测源码文件中的代码行执行哈希计算并获得哈希码后,通过与建立多级存储目录相同的分段原则将该哈希码分为若干连续的哈希数码段,根据该哈希数码段在片段索引库中逐级查找。
如图8,某一开源文件a.java中有十行代码,计算出每一行代码的16位哈希码后,将哈希码分为四段,每一段有四位,所以,以四位哈希值命名目录,例如,由于第一行代码的哈希值为0101tywq9821ksj1,因此,生成一四级存储目录0101/tywq/9821/ksj1,并在该存储目录下生成一第一索引文件,在该第一索引文件中记录哈希值为0101tywq9821ksj1的代码行所属的开源组件、开源文件、开源组件存储位置,以及代码行的行号。由于在开源文件a.java中,第八行与第十行的代码相同,因此哈希值(0101tywq9821ksj1)也相同,所以,与第八行和第十行相对应同一个第一索引文件,如图9,在该第一索引文件中同时记录第八行和第十行所对应的开源组件信息。
另外,如图10,由于开源文件a.java的第一行与开源文件c.java的第九行具有相同的哈希码0101tywq9821ksj1,因此,生成一四级存储目录0101/tywq/9821/ksj1,与开源文件a.java的第一行和开源文件c.java的第九行相对应的第一索引文件即存储在该四级存储目录0101/tywq/9821/ksj1下。
本发明还公开一种基于源码分析的开源成分检测系统,其包括基础数据收集模块、解析模块以及代码行检测模块。
基础数据收集模块,用于获取若干开源组件,以构建基础源码数据库。
解析模块,用于对基础源码数据库中的开源组件进行解析,以得到片段索引库,片段索引库包括若干第一索引文件,每一第一索引文件记录具有相同哈希码的代码行所属的开源组件信息,且,根据与第一索引文件相对应的哈希码可查找到该第一索引文件。
代码行检测模块,包括哈希计算模块、匹配模块和相似度计算模块;
哈希计算模块,用于分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码。
匹配模块,用于根据该哈希码在片段索引库中查找相应地第一索引文件,以获得与该代码行相对应的开源组件信息,并将连续匹配行数最多者作为与该源码文件对应的开源组件。
相似度计算模块,用于根据所查找到的各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
对于本实施例中的开源成分检测系统的工作原理和工作方式详见上述开源成分检测方法,在此不再赘述。
本发明还公开另一种开源成分检测系统,其包括一个或多个处理器、存储器以及一个或多个程序,其中一个或多个程序被存储在存储器中,并且被配置成由一个或多个处理器执行,程序包括用于执行如上的开源成分检测方法的指令。处理器可以采用通用的中央处理器(Central Processing Unit,CPU),微处理器,应用专用集成电路(ApplicationSpecific Integrated Circuit,ASIC),或者一个或多个集成电路,用于执行相关程序,以实现本申请实施例的开源成分检测系统中的模块所需执行的功能,或者执行本申请方法实施例的开源成分检测方法。
本发明还公开一种计算机可读存储介质,其包括计算机程序,所述计算机程序可被处理器执行以完成如上所述的开源成分检测方法。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是只读存储器(read-onlymemory,ROM),或随机存取存储器(random access memory,RAM),或磁性介质,例如,软盘、硬盘、磁带、磁碟、或光介质,例如,数字通用光盘(digital versatile disc,DVD)、或者半导体介质,例如,固态硬盘(solidstate disk,SSD)等。
本申请实施例还公开了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。电子设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该电子设备执行上述开源成分检测方法。
以上所揭露的仅为本发明的优选实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明申请专利范围所作的等同变化,仍属本发明所涵盖的范围。
Claims (10)
1.一种基于源码分析的开源成分检测方法,其特征在于,包括:
获取若干开源组件,以构建基础源码数据库;
对所述基础源码数据库中的所述开源组件进行解析,以得到片段索引库,所述片段索引库包括若干第一索引文件,每一所述第一索引文件记录具有相同哈希码的代码行所属的开源组件信息,且,根据与所述第一索引文件相对应的哈希码可查找到该第一索引文件;
所述检测方法包括代码行匹配检测方法:分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码,根据该哈希码在所述片段索引库中查找相应地第一索引文件,以获得与该代码行相对应的开源组件信息,并将连续匹配行数最多者作为与该源码文件对应的开源组件;根据所查找到的各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
2.根据权利要求1所述的基于源码分析的开源成分检测方法,其特征在于,对所述基础源码数据库中的所述开源组件进行解析,还获得有组件索引库和文件索引库;
所述组件索引库,包括第二索引文件,所述第二索引文件记录开源组件信息和与其所对应的哈希码的对应关系;
所述文件索引库,包括若干第三索引文件,每一所述第三索引文件记录具有相同哈希码的源码文件所对应的开源组件信息,且,根据与所述第三索引文件相对应的哈希码可查找到该第三索引文件;
所述检测方法还包括设置在所述代码行匹配检测方法之前的文件匹配检测方法和设置在所述文件匹配检测方法之前的组件匹配检测方法;
所述组件匹配检测方法为:计算待测源码组件的哈希码,并在所述第二索引文件中查找是否存在相同的哈希码,如果是,则获得该待测源码组件的开源组件信息,并退出对当前待测源码组件的检测,如果否,则进入所述文件匹配检测方法;
所述文件匹配检测方法为:计算待测源码组件中每个源码文件的哈希码,根据该哈希码在所述文件索引库中查找相应地所述第三索引文件,并根据找出的所述第三索引文件获得与该源码文件相对应的开源组件信息,以此,获得该待测源码组件中所有源码文件的开源组件信息,并统计查找到的每一开源组件所对应的源码文件的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度;
对于在所述文件匹配检测方法中未查找到相应开源组件信息的源码文件,通过所述代码行匹配检测方法进行处理,并结合通过所述文件匹配检测方法获取到的各个开源组件与该待测源码组件的相似度综合计算各个开源组件与该待测源码组件的相似度。
3.根据权利要求2所述的基于源码分析的开源成分检测方法,其特征在于,对所述基础源码数据库中的所述开源组件进行解析,还获得有函数索引库,所述函数索引库包括若干第四索引文件,每一所述第四索引文件记录具有相同哈希码的函数结构所对应的开源组件信息,且,根据与所述第四索引文件相对应的哈希码可查找到该第四索引文件;
所述检测方法还包括位于所述文件匹配检测方法和所述代码行匹配检测方法之间的函数匹配检测方法,对于在所述文件匹配检测方法中未查找到相应开源组件信息的源码文件,通过所述函数匹配检测方法进行处理;
所述函数匹配检测方法包括:提取待测源码文件中的语法树,并计算语法树的哈希码,根据该哈希码在所述函数索引库中查找相应地所述第四索引文件,并根据找出的所述第四索引文件获得与该语法树相对应的开源组件信息,以此,获得该待测源码组件中所有语法树的开源组件信息,并统计查找到的每一开源组件所对应的语法树的数量,根据统计数量计算各个开源组件与该待测源码组件的相似度;
对于在所述函数匹配检测方法中未查找到相应开源组件信息的源码文件,通过所述代码行匹配检测方法进行处理,并结合通过所述文件匹配检测方法和通过所述函数匹配检测方法获取到的各个开源组件与该待测源码组件的相似度综合计算各个开源组件与该待测源码组件的相似度。
4.根据权利要求1所述的基于源码分析的开源成分检测方法,其特征在于,所述第一索引文件的存储及匹配方法包括:
计算出代码行的哈希码后,将该哈希码分为若干连续的哈希数码段,并以若干连续的所述哈希数码段为目录名建立多级存储目录,将所述第一索引文件存储在该存储目录中;
对待测源码文件中的代码行执行哈希计算并获得哈希码后,通过与建立所述多级存储目录相同的分段原则将该哈希码分为若干连续的哈希数码段,根据该哈希数码段在所述片段索引库中逐级查找。
5.根据权利要求3所述的基于源码分析的开源成分检测方法,其特征在于,对通过所述文件匹配检测方法、所述函数匹配检测方法以及所述代码行匹配检测方法获取到的相似度分配不同的权重,且分配给通过所述文件匹配检测方法所述获取到的相似度的权重大于通过所述函数匹配检测方法获取到的相似度的权重,分配给通过所述函数匹配检测方法获取到的相似度的权重大于通过所述片段匹配检测方法获取到的相似度的权重,然后综合计算各个开源组件与该待测源码组件的相似度。
6.根据权利要求3所述的基于源码分析的开源成分检测方法,其特征在于,在所述文件匹配检测方法中,如果任一开源组件与待测源码组件的相似度大于第一预设值,则将该开源组件认定为所检测到的目标对象,并停止继续通过函数匹配检测方法和代码行匹配检测方法对待测源码组件进行开源成分的检测。
7.根据权利要求3所述的基于源码分析的开源成分检测方法,其特征在于,在所述文件匹配检测方法中,如果任一开源组件与待测源码组件的相似度大于第二预设值,则,将该开源组件定义为待选开源组件,并在后续的所述函数匹配检测方法和代码行匹配检测方法中,以所述待选开源组件作为查找对象。
8.一种基于源码分析的开源成分检测系统,其特征在于,包括基础数据收集模块、解析模块以及代码行检测模块;
所述基础数据收集模块,用于获取若干开源组件,以构建基础源码数据库;
所述解析模块,用于对所述基础源码数据库中的所述开源组件进行解析,以得到片段索引库,所述片段索引库包括若干第一索引文件,每一所述第一索引文件记录具有相同哈希码的代码行所属的开源组件信息,且,根据与所述第一索引文件相对应的哈希码可查找到该第一索引文件;
所述代码行检测模块,包括哈希计算模块、匹配模块和相似度计算模块;
所述哈希计算模块,用于分别对待测源码组件中每一源码文件的每一行代码进行哈希计算,以得到哈希码;
所述匹配模块,用于根据该哈希码在所述片段索引库中查找相应地第一索引文件,以获得与该代码行相对应的开源组件信息,并将连续匹配行数最多者作为与该源码文件对应的开源组件;
所述相似度计算模块,用于根据所查找到的各个开源组件所对应的源码文件的数量,计算各个开源组件与该待测源码组件的相似度。
9.一种基于源码分析的开源成分检测系统,其特征在于,包括:
一个或多个处理器;
存储器;
以及一个或多个程序,其中一个或多个程序被存储在所述存储器中,并且被配置成由所述一个或多个处理器执行,所述程序包括用于执行如权利要求1至7任一项所述的基于源码分析的开源成分检测方法的指令。
10.一种计算机可读存储介质,其特征在于,包括计算机程序,所述计算机程序可被处理器执行以完成如权利要求1至7任一项所述的基于源码分析的开源成分检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210340961.1A CN114924790A (zh) | 2022-04-01 | 2022-04-01 | 基于源码分析的开源成分检测方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210340961.1A CN114924790A (zh) | 2022-04-01 | 2022-04-01 | 基于源码分析的开源成分检测方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114924790A true CN114924790A (zh) | 2022-08-19 |
Family
ID=82804983
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210340961.1A Pending CN114924790A (zh) | 2022-04-01 | 2022-04-01 | 基于源码分析的开源成分检测方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114924790A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820556A (zh) * | 2023-08-30 | 2023-09-29 | 深圳开源互联网安全技术有限公司 | 一种检测可执行文件引用的开源组件的方法及相关产品 |
-
2022
- 2022-04-01 CN CN202210340961.1A patent/CN114924790A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820556A (zh) * | 2023-08-30 | 2023-09-29 | 深圳开源互联网安全技术有限公司 | 一种检测可执行文件引用的开源组件的方法及相关产品 |
CN116820556B (zh) * | 2023-08-30 | 2023-12-01 | 深圳开源互联网安全技术有限公司 | 一种检测可执行文件引用的开源组件的方法及相关产品 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108628751B (zh) | 一种无用依赖项检测方法及装置 | |
CN111400724B (zh) | 基于代码相似性分析的操作系统脆弱性检测方法、系统及介质 | |
US10394694B2 (en) | Unexplored branch search in hybrid fuzz testing of software binaries | |
CN108334515B (zh) | 一种处理崩溃文件中堆栈地址的方法、装置及系统 | |
US8990792B2 (en) | Method for constructing dynamic call graph of application | |
CN112395305B (zh) | 一种sql语句分析方法、装置、电子设备及存储介质 | |
US12124825B2 (en) | Method and apparatus for compatibility detection, device and non-transitory computer-readable storage medium | |
CN111597243A (zh) | 基于数据仓库抽象数据加载的方法及系统 | |
CN114924790A (zh) | 基于源码分析的开源成分检测方法及系统 | |
CN112364024A (zh) | 一种表数据批量自动比对的控制方法及装置 | |
CN114860573A (zh) | 软件成分的分析方法、装置、电子设备及存储介质 | |
CN113918658A (zh) | 恢复数据的方法及装置 | |
CN112698861A (zh) | 源代码克隆识别方法及系统 | |
CN111427976B (zh) | 道路鲜度的获取方法及装置 | |
CN114201759A (zh) | 一种基于软件包命名矩阵的软件漏洞识别方法与系统 | |
CN114253850A (zh) | 代码的增量覆盖率统计方法、装置、设备及存储介质 | |
CN112181808B (zh) | 一种程序并发缺陷检测方法、装置、设备以及存储介质 | |
CN114756586A (zh) | 代码匹配分析方法、装置、电子设备及存储介质 | |
CN110457046B (zh) | 混合指令集程序的反汇编方法、装置、存储介质及终端 | |
CN114969446B (zh) | 一种基于敏感度模型的分组混合精度配置方案搜索方法 | |
CN116880847A (zh) | 基于开源项目的溯源方法、装置电子设备及存储介质 | |
CN115757174A (zh) | 一种数据库的差异检测方法及装置 | |
CN113495901B (zh) | 一种面向可变长数据块的快速检索方法 | |
CN113568662B (zh) | 一种基于调用关系的代码变更影响范围分析方法及系统 | |
CN116483735B (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 |