一种软件开源代码成分的识别方法及系统技术方案

技术编号:36503694 阅读:15 留言:0更新日期:2023-02-01 15:27
本申请提供了一种软件开源代码成分的识别方法及系统,属于软件开源代码成分检测技术领域,包括:获取待测软件的源代码,得到第一源代码文件;对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;接着进行第二预处理,得到关系孤岛;使用深度遍历算法对关系孤岛进行补点,得到巨岛;获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。可协助使用者梳理自有软件资产风险面,控制组件漏洞影响范围,规避使用三方组件库所带来的知识产权风险。带来的知识产权风险。带来的知识产权风险。

【技术实现步骤摘要】
一种软件开源代码成分的识别方法及系统


[0001]本专利技术属于软件开源代码成分检测
,尤其涉及一种软件开源代码成分的识别方法及系统。

技术介绍

[0002]软件成分分析是一种用于管理开源组件应用安全的方法。目的是为了开发团队可以快速跟踪和分析引入项目的开源组件。同时,软件成分分析工具可以发现所有相关组件、支持库以及它们之间直接和间接依赖关系。软件成分分析工具还可以检测软件许可证、已弃用的依赖项以及漏洞和潜在威胁。扫描过程会生成物料清单Bill of Materials(BOM),从而提供项目软件资产的完整清单。软件成分是衡量软件供应链是否安全的重要指标,但是目前市面上暂无完整的、高准确率的软件成分分析产品的统计方案。
[0003]现有公开了基于simhash的源代码中开源成分筛选识别方法及系统(本方案申请号为:CN202210337119.2),其包括:构建基础源码库;采用simhash算法,分别对基础源码库中的每一开源文件中的源代码进行解析处理,以得到数据匹配表;采用与开源文件相同的解析处理方式对待测源码组件中的每一源码文件进行解析处理,以获得若干第二数码组;分别将第二数码组中的字符串与数据匹配表中每一第一数码组中的字符串整体匹配;判断任一第一数码组中是否存在与当前第二数码组中相同的字符串,如果是,则将该第一数码组定义为待选数码组;根据待选数码组在基础源码库中找出与该待测源码组件相关的若干开源组件。
[0004]该方案是基于simhash算法进行的开源成分识别,simhash算法是进行源代码中从别人那复制来的开源代码成分的识别,但是开源组件成分不仅仅通过复制别人的源代码这一种方式,还有配置文件的直接引用,simhash算法没办法分析配置文件元数据,因此该方案的分析方法不够全面,不能对软件进行全面的开源成分分析识别,识别结果不够精准。

技术实现思路

[0005]本申请提供了一种软件开源代码成分的识别方法及系统,旨在解决上述中对软件开源成分分析不够全面,只能分析源代码元数据而不能分析配置文件元数据的问题。
[0006]为了实现上述目的,本专利技术采用以下技术方案,包括:
[0007]获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;
[0008]对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;
[0009]对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;
[0010]使用深度遍历算法对关系孤岛进行补点,得到巨岛;
[0011]获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中
进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。
[0012]作为优选,GIT获取方式,包括个人访问令牌方式和用户名密码方式;
[0013]个人访问令牌方式为:访问GIT仓库主站地址的首页和子页,分别提取首页和子页的特征并利用SHA1算法形成特征值,将特征值代入知识库中进行SHA值比对,得到GIT仓库的类型版本数据,根据类型版本数据确定访问令牌的正确接口,进而获取GIT仓库中待测软件的源代码;
[0014]用户名密码方式为:根据类型版本数据建立网络爬虫,通过网络爬虫获取GIT中所有待测软件仓库的源代码。
[0015]作为优选,对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图,包括:
[0016]使用遍历目录算法和文件类型识别算法筛选第一源代码文件中具有特殊特征的文件,并对文件的元数据进行特征提取、内容清洗,得到第一组件信息,然后将第一组件信息中每个组件作为图中的点,依赖关系为有向边,建立第一依赖组件有向无环图,特殊特征包括xml文件格式、json文件格式、ini文件格式、text文件格式和lock文件格式;
[0017]将第一源代码文件中代码切分成固定粒度,得到比较代码单元,从比较代码单元中抽取度量值建立颗粒度矩阵,使用向量相似度算法将颗粒度矩阵代入知识库中进行向量相似度的计算,将知识库中相似度满足阈值的组件汇总,得到第二组件信息,将第二组件信息中每个组件作为图中的点,依赖关系为有向边,建立第二依赖组件有向无环图,度量值包括代码变量、关键字、变量循环次数、参数、返回值、常量和符号。
[0018]作为优选,向量相似度算法包括:
[0019][0020]其中,Sim
CM
为颗粒度矩阵与知识库中对应矩阵的相似度值,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为运算结果,Sim
a
为关键字矩阵与知识库中对应矩阵的相似度值,Sim
b
为符号矩阵与知识库中对应矩阵的相似度值。
[0021]作为优选,对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛,包括:
[0022]判断第一依赖组件有向无环图和第二依赖组件有向无环图有无重复的组件;
[0023]若有,则使用深度遍历算法、递归算法和边收缩算法对具有重复组件的有向无环图进行合并,得到第一处理图;
[0024]若无,则不做处理,直接得到第二处理图;
[0025]将第一处理图和第二处理图汇总,得到关系孤岛。
[0026]作为优选,使用深度遍历算法对关系孤岛进行补点,得到巨岛,包括:
[0027]确定关系孤岛中的根节点,使用深度遍历算法对与根节点相连的其它节点进行标识提取,得到第一标识,将第一标识代入知识库中进行依赖关系数据的查找,得到第三组件信息;
[0028]根据第三组件信息对第一标识对应的节点进行补点,得到新点,获取使用者参数值并根据使用者参数值判断是否对新点进行补点,若是,则使用深度遍历算法遍历新点,若否,则剔除新点,得到最终的巨岛。
[0029]作为优选,将巨岛代入相应计算机语言的分析引擎中进行读取分析,具体为:
[0030]对第一源代码文件进行字符串、符号、函数以及变量的去除,并分别按照声明语句、成员访问符号、指针符号、闭合符号和包引用关键字生成主语言特征值,将主语言特征值带入知识库中进行比对,得到第一源代码文件的主语言类型;
[0031]根据主语言类型确定分析引擎后,将巨岛代入确定的分析引擎中进行读取分析。
[0032]一种软件开源代码成分的识别系统,包括:
[0033]源代码获取模块:用于获取待测软本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种软件开源代码成分的识别方法,其特征在于,包括:获取待测软件的源代码,得到第一源代码文件,获取方式包括GIT、SVN、TFS和Mercurial;对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图;对第一依赖组件有向无环图和第二依赖组件有向无环图进行第二预处理,得到关系孤岛;使用深度遍历算法对关系孤岛进行补点,得到巨岛;获取所有开源的源代码并建立知识库,将巨岛代入相应计算机语言的分析引擎中进行读取分析,并将读取分析结果代入知识库中进行关联数据的筛选,按照SBOM格式生成识别结果报告。2.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,GIT获取方式,包括个人访问令牌方式和用户名密码方式;个人访问令牌方式为:访问GIT仓库主站地址的首页和子页,分别提取首页和子页的特征并利用SHA1算法形成特征值,将特征值代入知识库中进行SHA值比对,得到GIT仓库的类型版本数据,根据类型版本数据确定访问令牌的正确接口,进而获取GIT仓库中待测软件的源代码;用户名密码方式为:根据类型版本数据建立网络爬虫,通过网络爬虫获取GIT中所有待测软件仓库的源代码。3.根据权利要求1所述的一种软件开源代码成分的识别方法,其特征在于,对第一源代码文件分别进行配置文件元数据和源代码文件元数据的提取和第一预处理,得到第一依赖组件有向无环图和第二依赖组件有向无环图,包括:使用遍历目录算法和文件类型识别算法筛选第一源代码文件中具有特殊特征的文件,并对文件的元数据进行特征提取、内容清洗,得到第一组件信息,然后将第一组件信息中每个组件作为图中的点,依赖关系为有向边,建立第一依赖组件有向无环图,特殊特征包括xml文件格式、json文件格式、ini文件格式、text文件格式和lock文件格式;将第一源代码文件中代码切分成固定粒度,得到比较代码单元,从比较代码单元中抽取度量值建立颗粒度矩阵,使用向量相似度算法将颗粒度矩阵代入知识库中进行向量相似度的计算,将知识库中相似度满足阈值的组件汇总,得到第二组件信息,将第二组件信息中每个组件作为图中的点,依赖关系为有向边,建立第二依赖组件有向无环图,度量值包括代码变量、关键字、变量循环次数、参数、返回值、常量和符号。4.根据权利要求3所述的一种软件开源代码成分的识别方法,其特征在于,向量相似度算法包括:
其中,Sim
CM
为颗粒度矩阵与知识库中对应矩阵的相似度值,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为运算结果,Sim
a
...

【专利技术属性】
技术研发人员:宋秉嵘
申请(专利权)人:浙江路为科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1