CN115658080A - 一种软件开源代码成分的识别方法及系统 - Google Patents
一种软件开源代码成分的识别方法及系统 Download PDFInfo
- Publication number
- CN115658080A CN115658080A CN202211411373.9A CN202211411373A CN115658080A CN 115658080 A CN115658080 A CN 115658080A CN 202211411373 A CN202211411373 A CN 202211411373A CN 115658080 A CN115658080 A CN 115658080A
- Authority
- CN
- China
- Prior art keywords
- source code
- island
- directed acyclic
- acyclic graph
- software
- 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
Landscapes
- Stored Programmes (AREA)
Abstract
本申请提供了一种软件开源代码成分的识别方法及系统,属于软件开源代码成分检测技术领域,包括:获取待测软件的源代码,得到第一源代码文件;对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;接着进行第二预处理,得到关系孤岛;使用深度遍历算法对关系孤岛进行补点,得到巨岛;获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。可协助使用者梳理自有软件资产风险面,控制组件漏洞影响范围,规避使用三方组件库所带来的知识产权风险。
Description
技术领域
本发明属于软件开源代码成分检测技术领域,尤其涉及一种软件开源代码成分的识别方法及系统。
背景技术
软件成分分析是一种用于管理开源组件应用安全的方法。目的是为了开发团队可以快速跟踪和分析引入项目的开源组件。同时,软件成分分析工具可以发现所有相关组件、支持库以及它们之间直接和间接依赖关系。软件成分分析工具还可以检测软件许可证、已弃用的依赖项以及漏洞和潜在威胁。扫描过程会生成物料清单Bill of Materials(BOM),从而提供项目软件资产的完整清单。软件成分是衡量软件供应链是否安全的重要指标,但是目前市面上暂无完整的、高准确率的软件成分分析产品的统计方案。
现有公开了基于simhash的源代码中开源成分筛选识别方法及系统(本方案申请号为:CN202210337119.2),其包括:构建基础源码库;采用simhash算法,分别对基础源码库中的每一开源文件中的源代码进行解析处理,以得到数据匹配表;采用与开源文件相同的解析处理方式对待测源码组件中的每一源码文件进行解析处理,以获得若干第二数码组;分别将第二数码组中的字符串与数据匹配表中每一第一数码组中的字符串整体匹配;判断任一第一数码组中是否存在与当前第二数码组中相同的字符串,如果是,则将该第一数码组定义为待选数码组;根据待选数码组在基础源码库中找出与该待测源码组件相关的若干开源组件。
该方案是基于simhash算法进行的开源成分识别,simhash算法是进行源代码中从别人那复制来的开源代码成分的识别,但是开源组件成分不仅仅通过复制别人的源代码这一种方式,还有配置文件的直接引用,simhash算法没办法分析配置文件元数据,因此该方案的分析方法不够全面,不能对软件进行全面的开源成分分析识别,识别结果不够精准。
发明内容
本申请提供了一种软件开源代码成分的识别方法及系统,旨在解决上述中对软件开源成分分析不够全面,只能分析源代码元数据而不能分析配置文件元数据的问题。
为了实现上述目的,本发明采用以下技术方案,包括:
获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
使用深度遍历算法对关系孤岛进行补点,得到巨岛;
获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
作为优选,GIT获取方式,包括个人访问令牌方式和用户名密码方式;
个人访问令牌方式为:访问GIT仓库主站地址的首页和子页,分别提取首页和子页的特征并利用SHA1算法形成特征值,将特征值代入知识库中进行SHA值比对,得到GIT仓库的类型版本数据,根据类型版本数据确定访问令牌的正确接口,进而获取GIT仓库中待测软件的源代码;
用户名密码方式为:根据类型版本数据建立网络爬虫,通过网络爬虫获取GIT中所有待测软件仓库的源代码。
作为优选,对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图,包括:
使用遍历目录算法和文件类型识别算法筛选第一源代码文件中具有特殊特征的文件,并对文件的元数据进行特征提取、内容清洗,得到第一组件信息,然后将第一组件信息中每个组件作为图中的点,依赖关系为有向边,建立第一依赖组件有向无环图,特殊特征包括xml文件格式、json文件格式、ini文件格式、text文件格式和lock文件格式;
将第一源代码文件中代码切分成固定粒度,得到比较代码单元,从比较代码单元中抽取度量值建立颗粒度矩阵,使用向量相似度算法将颗粒度矩阵代入知识库中进行向量相似度的计算,将知识库中相似度满足阈值的组件汇总,得到第二组件信息,将第二组件信息中每个组件作为图中的点,依赖关系为有向边,建立第二依赖组件有向无环图,度量值包括代码变量、关键字、变量循环次数、参数、返回值、常量和符号。
作为优选,向量相似度算法包括:
其中,SimCM为颗粒度矩阵与知识库中对应矩阵的相似度值,CM1[i]为知识库中矩阵的第i个向量,CM2[match(i)]为颗粒度矩阵中相匹配的第i个向量,A为CM1中向量,B为CM2中向量,α为A向量与B向量的夹角,n和m为自然数,Similarity(A,B)为A向量与B向量的相似度,balance为平均数,SimThres为相似度输入值,a为关键字的度量值,b为符号的度量值,CompareResult为运算结果,Sima为关键字矩阵与知识库中对应矩阵的相似度值,Simb为符号矩阵与知识库中对应矩阵的相似度值。
作为优选,对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛,包括:
判断第一依赖组件有向无环图和第二依赖组件有向无环图有无重复的组件;
若有,则使用深度遍历算法、递归算法和边收缩算法对具有重复组件的有向无环图进行合并,得到第一处理图;
若无,则不做处理,直接得到第二处理图;
将第一处理图和第二处理图汇总,得到关系孤岛。
作为优选,使用深度遍历算法对关系孤岛进行补点,得到巨岛,包括:
确定关系孤岛中的根节点,使用深度遍历算法对与根节点相连的其它节点进行标识提取,得到第一标识,将第一标识代入知识库中进行依赖关系数据的查找,得到第三组件信息;
根据第三组件信息对第一标识对应的节点进行补点,得到新点,获取使用者参数值并根据使用者参数值判断是否对新点进行补点,若是,则使用深度遍历算法遍历新点,若否,则剔除新点,得到最终的巨岛。
作为优选,将巨岛代入相应计算机语言的分析引擎中进行读取分析,具体为:
对第一源代码文件进行字符串、符号、函数以及变量的去除,并分别按照声明语句、成员访问符号、指针符号、闭合符号和包引用关键字生成主语言特征值,将主语言特征值带入知识库中进行比对,得到第一源代码文件的主语言类型;
根据主语言类型确定分析引擎后,将巨岛代入确定的分析引擎中进行读取分析。
一种软件开源代码成分的识别系统,包括:
源代码获取模块:用于获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
有向无环图建立模块:用于对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
关系孤岛生成模块:用于对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
巨岛生成模块:用于使用深度遍历算法对关系孤岛进行补点,得到巨岛;
开源代码成分识别结果模块:用于获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
一种软件开源代码成分的识别系统,包括存储器和处理器,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现如上述中任一项所述的一种软件开源代码成分的识别方法。
一种存储有计算机程序的计算机可读存储介质,所述计算机程序被计算机执行时实现如上述中任一项所述的一种软件开源代码成分的识别方法。
本发明具有以下有益效果:
(1)支持多种方式获取软件第一源代码文件,有效的减少软件成分分析的分析前工作量,提高开发效率;
(2)可协助使用者梳理自有软件资产风险面,控制组件漏洞影响范围,规避使用三方组件库所带来的知识产权风险;
(3)提供标准的软件物料清单(SBOM),对风险进行可视化展示;
(4)特有的组件分析算法,有向图生成算法、多维度信息识别算法。对比现有市面技术,本方案可以对软件的源代码元数据和配置文件元数据都进行识别,对软件开源成分的识别更加全面,具有更高的识别率,更低的误报率、更佳的准确率、更丰富的信息展示;
(5)本方案中所涉及到的度量值提取方式、相似度算法可以推广到代码克隆检测,并不只可用来识别开源组件,因此本方案更具有价值性和实用性;
(6)本方案中进行相似度的计算涉及一个颗粒度的问题,如果颗粒度选的太大准确率就低下去了,太小生成值的速度就下去了,属于一种可以自己控制速度和准确率平衡的算法,常规的simhash算法,生成hash值的速度很快,但是准确率不高,其无法做出速度和准确率调整,因此本方案中采用的相似度算法与常规的相比,可以自定义控制速度和准确率,有更好的适用性。
附图说明
图1为本发明中一种软件开源代码成分的识别方法的流程图
图2为本发明中组件相似度计算的算法流程图
图3为本发明中巨岛的示例图
图4为本发明中实施例1中方案的流程图
图5为本发明中一种软件开源代码成分的识别系统的结构示意图
图6为本发明中一种软件开源代码成分的识别系统的电子设备结构示意图
具体实施方式
实施例1
如图1所示,一种软件开源代码成分的识别方法,包括以下步骤:
S11、获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
S12、对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
S13、对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
S14、使用深度遍历算法对关系孤岛进行补点,得到巨岛;
S15、获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
上述方案的一种实施方式为:
1.获取被检测自研软件的第一源代码文件。文件获取支持代码仓库主动获取方式,也支持使用者主动上传方式。同时为了支持后面的操作,建立知识库,知识库是每家安全公司的机密数据,是安全人员通过技术手段形成的数据库。数据来源于(非全部):github、bitbuck、gitee等知名源代码仓库,cve(通用漏洞披露)、cwe(通用缺陷枚举数据库)、nvd(美国国家通用漏洞数据库)、cnvd(中国国家信息安全漏洞共享平台)、cnnvd(中国国家信息安全漏洞库)等。本方案是通过现有的数据库,将能够获取到的所有开源的源代码和组件都汇总一下,存入数据库中,建立知识库,用于支持对自研软件的开源成分分析。本方案中建立的知识库含有以下信息:组件特征向量,组件特征矩阵,组件关联漏洞,组件关联许可证。
2.源代码从代码库获取,包括GIT、SVN、TFS、Mercurial等方式进行获取。其中SVN、TFS、Mercurial等调用现有官方提供的命令进行获取,是常规的现有技术,本方案中不再赘述。对于GIT仓库的源代码的全量库获取,分为个人访问令牌和用户名密码方式两种。上述两种获取方式为本方案中的特有技术点。个人访问令牌获取GIT仓库全量源代码方式如下:由于不同git仓库获取个人访问令牌方法是不同的,本方案做法为:首先访问git仓库主站地址首页以及子页,提取页面特征,对页面特征的提取包含图片提取、关键字提取、NLP页面内容处理等多维度信息,利用SHA1算法形成特征值,与知识库进行SHA值对比,从而判断GIT仓库的类型以及版本,从而决定对应获取访问令牌的正确接口,进而获取GIT仓库中待测软件的源代码(该源代码即“第一源代码文件”),由于获取特征是多个维度的,从而获取准确率达到98%。用户名密码获取GIT仓库全量源代码方式如下:同样使用上述判断仓库版本的方法确定GIT仓库准确版本,针对源码的获取使用对应版本的爬虫(即“网络爬虫”)进行爬取,由于GIT仓库页面都是不同的,所以需要自研爬虫来解决各种仓库的获取,采用爬虫获取的源代码也为“第一源代码文件”。
3.获取到第一源代码文件后,需要提取配置文件元数据,形成组件依赖图。(元数据(Metadata)为描述数据的数据,主要是描述代码依赖组件属性的信息,用来支持如应用名称、依赖组件版本、编译选项、测试用例等功能,元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的)方法如下:遍历源代码下包管理工具的配置文件,这里涉及使用遍历目录、文件类型识别算法找到具有特殊特征的文件,比如:xml、json、ini、text、lock等通用配置文件格式。对上述文件的元数据进行特征提取、内容清洗,从而保证元数据均为组件信息(提取、清洗后的元数据即“第一组件信息”),然后把每个组件作为图中的点,依赖关系为有向边,最终把所有数据转化为依赖组件有向无环图(处理环的方法较为暴力,目前针对出现环的路径上的点进行暴力去重),该有向无环图即“第一依赖组件有向无环图”。
4.获取到第一源代码文件后,提取源代码文件元数据,生成源代码度量值,拿取度量值与知识库进行比对从而获取依赖组件,形成组件依赖图。方法如下:将代码切分成固定粒度(代码function)的比较代码单元,从比较代码单元中抽取度量值,度量值包含:代码变量、关键字、变量循环次数、参数、返回值、常量、符号等。根据以上度量值形成颗粒度矩阵。而后与知识库中预先生成的矩阵进行向量相似值计算(相似度算法采用boreas算法中的向量相似度算法),达到相似度阈值的则认为包含此组件。通过上述方法获取到依赖组件总集(依赖组件总集即“第二组件信息”),同时根据3中方法生成依赖组件有向无环图,该有向无环图即“第二依赖组件有向无环图”。
步骤3、4中对第一源代码文件进行处理,建立依赖组件有向无环图的过程就是“第一预处理”的过程。
本步骤的算法过程如图2所示,将代码切分成固定粒度的比较单元代码(图左上部分),下划线部分则为从比较代码单元中抽取的度量值。度量值包含:代码变量、关键字、变量循环次数、参数、返回值、常量、符号等。图中表格为向量矩阵,分别为量、关键字、符号矩阵。图右下CM2图表为生成的度量值矩阵(即“颗粒度矩阵”),CM1为知识库中对开源组件预先生成的矩阵(即“知识库中对应矩阵”),两个矩阵根据图表下面的算法公式进行相似度计算。其中,向量相似度算法包括:
其中,SimCM为颗粒度矩阵与知识库中对应矩阵的相似度值,CM1[i]为知识库中矩阵的第i个向量,CM2[match(i)]为颗粒度矩阵中相匹配的第i个向量,A为CM1中向量,B为CM2中向量,α为A向量与B向量的夹角,n和m为自然数,Similarity(A,B)为A向量与B向量的相似度,balance为平均数,SimThres为相似度输入值,a为关键字的度量值,b为符号的度量值,CompareResult为运算结果,Sima为关键字矩阵与知识库中对应矩阵的相似度值,Simb为符号矩阵与知识库中对应矩阵的相似度值。
CM1和CM2分辨多维矩阵,步骤里面已经说明且图中也表明,那么每一行在数学意义上代表一个多维向量,我们简称为V。从CM1取一行是A,从CM2取一行是B,这就是取得两个向量,例如二位空间向量只由(x,y)组成,从原点到(x,y)可以确定一条有方向的线叫做向量,同理A和B同属于向量,且是多维的,同从原点出发,那么两条线必然有个夹角,这个夹角度数α,如果α为0则向量相同,即为cos(α)=cos(0)=1。在多维空间中,cos(α)就是Similarity(A,B);
Ai为A向量的第i个数值,Bi为B向量的第i个数值,CM1和CM2都是多维的,把他们相匹配的向量得出的Similarity(A,B)值连乘求积,就得到了SimCM,也就是说,将两个矩阵中的所有的A向量和B向量分别带入上述第二个公式中,求出此时Similarity(A,B)的值,然后依次求出矩阵中所有的Similarity(A,B)值,将这些Similarity(A,B)值连乘求积得到SimCM,该过程就是上述第一个公式表示的意思;
Sima和Simb的数值与SimCM的计算原理相同,将第一和第二个公式中的相关参数替换一下就可以了;
接着依次通过上述剩下的三个公式,代入数值计算,得到最终(CompareResult)的计算结果,得到向量相似度的值,接着判断该值是否达到相似度阈值(阈值为一个动态调整的值,学习数量越大,阈值会越来越合理),若达到,则认为包含此组件。
将知识库中经计算满足阈值的组件汇总,得到与第一源代码文件中源代码文件元数据相似度满足阈值的所有组件,该组件即“第二组件信息”。
5.根据3、4中的方法获取到两个有向无环图(即“第一依赖组件有向无环图和第二依赖组件有向无环图”),判断两个图中是否有重复的点(组件),如果有重复点,那么开始进行两个图的合并,算法主要涉及深度遍历、递归、边收缩。如果两图没有重复的点,则不做多余处理,本方案中称该现象为多起点情况,将每个图称作关系孤岛。
举例说明:合并前的有向图数据只是从元数据得来的,有可能会有多个,假如有3个分别叫做A、B、C。
A、B两图由于有公共点就代表有关系,那么需要合并成一个图,称之为D。此时就变成C、D两张图,D为合并后的图(即“第一处理图”),C(由于与别的图没有公共点从而没法合并(C即“第二处理图”),但C、D在补点之前的图都被称为关系孤岛。
上述对有向无环图处理最终得到关系孤岛的过程,就是“第二预处理”的过程。
6.接下来对所有关系孤岛进行补点。方法如下:此步骤的关系孤岛只含有直接依赖组件,本方案中根据使用者参数定制,从而给出最高5层的依赖关系溯源。接下来讲间接依赖的补点过程,其他层以此类推即可。从有上述得到的有向图的根节点出发,利用深度遍历算法,当到达每一个节点时,取出节点唯一标识(唯一标识即“第一标识”),根据标识到知识库进行查找依赖关系数据,从而得到该节点的直接依赖组件总集(直接依赖组件总集即“第三组件信息”),根据此总集开始对该节点进行补点,直接依赖为新点,依赖关系为边,根据使用者参数的值,来确定是否对新点进行补点,如果是,则使用深度遍历算法遍历新点,如果否,则剔除新节点,不做遍历。最终得到一个更加丰富的有向无环图,本方案中将该图称之为巨岛,巨岛最终图像如图3所示。
接着步骤5中的例子进行说明,C、D经过补点之后的图被称为E、F。E、F的结构看起来就是图3这张图的样子,此时E、F被称为巨岛。
7.得到的巨岛(数量大于等于1)后,需要针对第一源代码文件进行主语言判断,而后将巨岛数据抛给对应语言的分析引擎。方法如下:提取第一源代码文件的元信息,剔除第一源代码文件中字符串、符号、函数、变量等,留下声明语句、成员访问符号、指针符号、闭合符号、包引用关键字。根据以上五个维度生成特征值(该特征值即“主语言特征值”),其生成算法具体为:对字符串按照字母、数字、特殊符号排序,同种类型字符按照ASCII码排序,最后进行MD5得到特征值,与知识库中特征值进行比对,确定第一源代码文件的主语言。得到对应语言后,就可以把巨岛抛给对应语言的分析引擎进行分析。
分析引擎每个语言虽然不相同,但是上层逻辑大体是一样的,此处举例JAVA语言进行重点描述,其他语言以此类推即可。JAVA分析引擎收到巨岛之后,对有向图中的点所包含信息进行读取,点包含如下信息:组件唯一标识,组件版本,调用位置。根据组件唯一标识+组件版本,可到知识库中查找组件关联漏洞、依赖关系、开源许可证信息。漏洞种类包括CVE、CNVD、CNNVD等漏洞编号,开源许可证包括1400+开源许可类型,依赖为该点的直接依赖以及依赖该点的所有父组件集合(直接依赖改点的父组件不仅仅是巨岛中的总集,而是目前整个开源生态下的总集),根据以上所有得到的数据,按照SBOM标准格式生成报告,该报告即“识别结果报告”。整体流程如图4所示。
至此识别方法结束,可以得到巨岛图、漏洞集合、许可证集合、组件关系图和软件清单报告。
实施例2
如图5所示,一种软件开源代码成分的识别系统,包括:
源代码获取模块10:用于获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
有向无环图建立模块20:用于对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
关系孤岛生成模块30:用于对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
巨岛生成模块40:用于使用深度遍历算法对关系孤岛进行补点,得到巨岛;
开源代码成分识别结果模块50:用于获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
上述系统的一种实施方式为,在源代码获取模块10中,获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial,在有向无环图建立模块20中,对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图,在关系孤岛生成模块30中,对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛,在巨岛生成模块40中,使用深度遍历算法对关系孤岛进行补点,得到巨岛,在开源代码成分识别结果模块50中,获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
实施例3
在上述实施例基础上,本实施例提供了一种电子设备,如图6所示。
实施例4
在上述实施例基础上,本实施例提供了一种存储介质。
以上所述仅为本发明的具体实施例,但本发明的技术特征并不局限于此,任何本领域的技术人员在本发明的领域内,所作的变化或修饰皆涵盖在本发明的专利范围之中。
Claims (10)
1.一种软件开源代码成分的识别方法,其特征在于,包括:
获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
使用深度遍历算法对关系孤岛进行补点,得到巨岛;
获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
2.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,GIT获取方式,包括个人访问令牌方式和用户名密码方式;
个人访问令牌方式为:访问GIT仓库主站地址的首页和子页,分别提取首页和子页的特征并利用SHA1算法形成特征值,将特征值代入知识库中进行SHA值比对,得到GIT仓库的类型版本数据,根据类型版本数据确定访问令牌的正确接口,进而获取GIT仓库中待测软件的源代码;
用户名密码方式为:根据类型版本数据建立网络爬虫,通过网络爬虫获取GIT中所有待测软件仓库的源代码。
3.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图,包括:
使用遍历目录算法和文件类型识别算法筛选第一源代码文件中具有特殊特征的文件,并对文件的元数据进行特征提取、内容清洗,得到第一组件信息,然后将第一组件信息中每个组件作为图中的点,依赖关系为有向边,建立第一依赖组件有向无环图,特殊特征包括xml文件格式、json文件格式、ini文件格式、text文件格式和lock文件格式;
将第一源代码文件中代码切分成固定粒度,得到比较代码单元,从比较代码单元中抽取度量值建立颗粒度矩阵,使用向量相似度算法将颗粒度矩阵代入知识库中进行向量相似度的计算,将知识库中相似度满足阈值的组件汇总,得到第二组件信息,将第二组件信息中每个组件作为图中的点,依赖关系为有向边,建立第二依赖组件有向无环图,度量值包括代码变量、关键字、变量循环次数、参数、返回值、常量和符号。
4.根据权利要求3所述的一种软件开源代码成分的识别方法,其特征在于,向量相似度算法包括:
其中,SimCM为颗粒度矩阵与知识库中对应矩阵的相似度值,CM1[i]为知识库中矩阵的第i个向量,CM2[match(i)]为颗粒度矩阵中相匹配的第i个向量,A为CM1中向量,B为CM2中向量,α为A向量与B向量的夹角,n和m为自然数,Similarity(A,B)为A向量与B向量的相似度,balance为平均数,SimThres为相似度输入值,a为关键字的度量值,b为符号的度量值,CompareResult为运算结果,Sima为关键字矩阵与知识库中对应矩阵的相似度值,Simb为符号矩阵与知识库中对应矩阵的相似度值。
5.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛,包括:
判断第一依赖组件有向无环图和第二依赖组件有向无环图有无重复的组件;
若有,则使用深度遍历算法、递归算法和边收缩算法对具有重复组件的有向无环图进行合并,得到第一处理图;
若无,则不做处理,直接得到第二处理图;
将第一处理图和第二处理图汇总,得到关系孤岛。
6.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,使用深度遍历算法对关系孤岛进行补点,得到巨岛,包括:
确定关系孤岛中的根节点,使用深度遍历算法对与根节点相连的其它节点进行标识提取,得到第一标识,将第一标识代入知识库中进行依赖关系数据的查找,得到第三组件信息;
根据第三组件信息对第一标识对应的节点进行补点,得到新点,获取使用者参数值并根据使用者参数值判断是否对新点进行补点,若是,则使用深度遍历算法遍历新点,若否,则剔除新点,得到最终的巨岛。
7.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,将巨岛代入相应计算机语言的分析引擎中进行读取分析,具体为:
对第一源代码文件进行字符串、符号、函数以及变量的去除,并分别按照声明语句、成员访问符号、指针符号、闭合符号和包引用关键字生成主语言特征值,将主语言特征值带入知识库中进行比对,得到第一源代码文件的主语言类型;
根据主语言类型确定分析引擎后,将巨岛代入确定的分析引擎中进行读取分析。
8.一种软件开源代码成分的识别系统,其特征在于,包括:
源代码获取模块:用于获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
有向无环图建立模块:用于对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
关系孤岛生成模块:用于对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
巨岛生成模块:用于使用深度遍历算法对关系孤岛进行补点,得到巨岛;
开源代码成分识别结果模块:用于获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
9.一种软件开源代码成分的识别系统,其特征在于,包括存储器和处理器,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现如权利要求1-7中任一项所述的一种软件开源代码成分的识别方法。
10.一种存储有计算机程序的计算机可读存储介质,其特征在于,所述计算机程序被计算机执行时实现如权利要求1-7中任一项所述的一种软件开源代码成分的识别方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211411373.9A CN115658080A (zh) | 2022-11-11 | 2022-11-11 | 一种软件开源代码成分的识别方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211411373.9A CN115658080A (zh) | 2022-11-11 | 2022-11-11 | 一种软件开源代码成分的识别方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115658080A true CN115658080A (zh) | 2023-01-31 |
Family
ID=85022293
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211411373.9A Pending CN115658080A (zh) | 2022-11-11 | 2022-11-11 | 一种软件开源代码成分的识别方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115658080A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115905895A (zh) * | 2023-03-08 | 2023-04-04 | 云加速(北京)科技有限公司 | 一种基于区块链的sbom标识聚类模型实现方法 |
CN116483435A (zh) * | 2023-06-19 | 2023-07-25 | 国网数字科技控股有限公司 | 一种软件物料清单的生成方法、装置和计算机可读介质 |
CN117850756A (zh) * | 2023-11-17 | 2024-04-09 | 深圳微米信息服务有限公司 | 一种web前端组件的管理系统及方法 |
-
2022
- 2022-11-11 CN CN202211411373.9A patent/CN115658080A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115905895A (zh) * | 2023-03-08 | 2023-04-04 | 云加速(北京)科技有限公司 | 一种基于区块链的sbom标识聚类模型实现方法 |
CN116483435A (zh) * | 2023-06-19 | 2023-07-25 | 国网数字科技控股有限公司 | 一种软件物料清单的生成方法、装置和计算机可读介质 |
CN116483435B (zh) * | 2023-06-19 | 2023-09-01 | 国网数字科技控股有限公司 | 一种软件物料清单的生成方法、装置和计算机可读介质 |
CN117850756A (zh) * | 2023-11-17 | 2024-04-09 | 深圳微米信息服务有限公司 | 一种web前端组件的管理系统及方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109697162B (zh) | 一种基于开源代码库的软件缺陷自动检测方法 | |
CN102054149B (zh) | 一种恶意代码行为特征提取方法 | |
CN115658080A (zh) | 一种软件开源代码成分的识别方法及系统 | |
CN112579155B (zh) | 代码相似性检测方法、装置以及存储介质 | |
CN112733156B (zh) | 基于代码属性图的软件脆弱性智能检测方法、系统及介质 | |
CN113139192B (zh) | 基于知识图谱的第三方库安全风险分析方法及系统 | |
WO2016130542A1 (en) | Code relatives detection | |
Sakr et al. | An efficient fast-response content-based image retrieval framework for big data | |
Yasaswi et al. | Unsupervised learning based approach for plagiarism detection in programming assignments | |
CN114329455B (zh) | 基于异构图嵌入的用户异常行为检测方法及装置 | |
Martínez et al. | Efficient model similarity estimation with robust hashing | |
Fan et al. | Detecting difference between process models based on the refined process structure tree | |
Cheers et al. | Spplagiarise: A tool for generating simulated semantics-preserving plagiarism of java source code | |
Karnalim et al. | Layered similarity detection for programming plagiarism and collusion on weekly assessments | |
CN117093556A (zh) | 日志分类方法、装置、计算机设备及计算机可读存储介质 | |
CN103678111A (zh) | 源代码类似度评价方法以及源代码类似度评价装置 | |
CN115859273A (zh) | 一种数据库异常访问的检测方法、装置、设备及存储介质 | |
CN112163217A (zh) | 恶意软件变种识别方法、装置、设备及计算机存储介质 | |
Soltani et al. | Detecting the software usage on a compromised system: A triage solution for digital forensics | |
Keivanloo et al. | Source code clone search | |
Ding et al. | Automatic semantic annotation of images based on Web data | |
Chen | Constructing bug knowledge graph as a service for bug search | |
Jiang et al. | Software vulnerability detection method based on code attribute graph presentation and Bi-LSTM neural network extraction | |
CN114398069B (zh) | 一种基于交叉指纹分析的公共组件库精确版本识别方法及系统 | |
CN117591624B (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 |