System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种方法级Java软件供应链的构建方法技术_技高网

一种方法级Java软件供应链的构建方法技术

技术编号:40083190 阅读:6 留言:0更新日期:2024-01-23 15:03
本发明专利技术实现了一种方法级Java软件供应链的构建方法。首先通过包管理器的中央仓库获取项目的元数据、源代码以及可执行代码;然后基于项目的元数据,提出一种基于开源项目数据的包级别依赖网络构建方法;接着在包级别依赖网络的基础上,对开源软件及其依赖项构造API级别的调用依赖关系,构建方法级依赖网络,形成软件供应链。解决了组件可达性分析和漏洞影响范围分析会产生大量误报的问题,给出了方法级软件依赖网络的定义和设计方法,并在此基础上,提出并实现了方法级软件供应链的构建方法。

【技术实现步骤摘要】

本专利技术涉及软件工程(程序分析),尤其涉及一种方法级java软件供应链的构建方法。


技术介绍

1、随着开源模式的快速发展,开发者通过复用第三方软件包来构建新的软件项目。大量开源软件之间通过包引用、代码引用等形成了复杂的开源软件依赖网络,即开源软件供应链。构建软件供应链能帮助软件的开发者更快的开发和部署项目。同时,这种复杂的供应关系也给软件安全性带来了巨大挑战,一个开源软件库出现问题往往会波及许多相关的其他软件。因此,我们需要了解一个软件项目是否使用了第三方软件包、使用了哪些第三方软件包、以及如何使用这些第三方软件包,即对该软件的供应链进行分析和构建,从而在上游软件包出现漏洞、知识产权、废弃等等安全问题时能及时对下游项目进行维护,减少可能造成的损失。然而目前的软件供应链分析技术依赖于已存在的包管理器,通过分析包管理器的元数据进行供应链构建。这些包管理器(如maven和npm)将自动解析依赖性描述并连接到集中式代码存储库,以下载构建客户端程序所需的特定库版本。由于依赖关系的传递效应,开源软件之间的关系变得错综复杂,一个软件项目所引用的软件包,同时也会依赖其他的软件包,从而形成了所谓的“系统之系统”。复杂的和不断变化的依赖关系对于许多开发人员来说是一个负担,造成了“依赖地狱”现象的出现。著名网络安全公司奇安信发布的《2023中国软件供应链安全分析报告》中指出,根据其包级别的软件供应链分析工具的分析结果发现,平均每个开源项目使用了155个开源软件第三方软件库,且平均每个项目存在110个已知的开源软件漏洞。

2、然而2021年的一项实证研究指出,大量的软件依赖关系其实并不存在,即包级别的软件供应链网络中大约1/4的软件包是冗余依赖项。冗余依赖是指被开发者声明为应用程序的依赖项,但实际上该应用程序的构建或运行并不需要的软件包。冗余的依赖关系带来了许多问题,其中主要的三个包括:最终打包的二进制文件包含了更多的代码,增大了软件包占用的容量;引入更多的第三方软件库给软件的维护者增加不必要的维护成本;以及给在供应链网络基础上进行的组件可达性分析和漏洞分析造成了误报的可能。

3、在软件包级软件供应链方面,目前学术界和工业界已经有了较成熟的分析和构建工具,如dependabot、blackduck、fossid,国内的sourcecheck、fosscheck等等。这些工具依托所构建的庞大商业数据库能进行较为全面的包级别依赖网络分析和构建,但在更进一步的方法级依赖网络方面还没有产品问世。

4、在方法级软件供应链方面,一些新的分析方法已经被发表出来。方法级软件供应链指在构建了包级别软件供应链的基础上,进一步解决一个软件项目通过项目间的api调用和项目内的函数调用、继承等方式传递了哪些参数,构建一个节点细化为函数的依赖网络,从而确立实际使用的第三方软件包。现有的研究一方面局限于软件包级软件供应链的分析和构建,在此基础上进行组件可达性分析和漏洞影响范围分析会产生大量误报,增加软件项目的维护成本;另一方面,现有关于java程序之间依赖关系分析的研究工作没有考虑类的继承和接口调用等关系,使得分析结果不准确。总体上,现有的工作要么无法进行细粒度的依赖分析,且准确度较低;要么仅限于理论层面,还没有很完备的细粒度分析工具。

5、本专利技术针对软件开发和维护场景下,现有java生态中软件包级软件供应链分析工具的结果存在误报,进而在供应链构建过程中引用了过多冗余依赖包的问题,提出了一种方法级java软件供应链分析与构建方法,通过分析软件项目的方法调用关系、接口实现关系和类继承关系,并逐层构建软件项目直接使用的依赖包和间接使用的依赖包,最终实现一个完整的方法级软件供应链分析和构建工具。本专利技术着重解决软件供应链构建任务中的三个问题:(1)方法级依赖网络的定义和构建;(2)软件包依赖关系约束解析;(3)完整方法级软件供应链的构建。


技术实现思路

1、为此,本专利技术首先提出一种方法级java软件供应链的构建方法,首先通过包管理器的中央仓库获取项目的元数据、源代码以及可执行代码;然后基于项目的元数据,提出一种基于开源项目数据的包级别依赖网络构建方法;接着在包级别依赖网络的基础上,基于开源软件及其依赖项api级别的调用关系,构建方法级依赖网络,形成细粒度软件供应链;

2、将依赖网络划分为包级别粒度、方法粒度、类粒度三个粒度的依赖网络,每个粒度的依赖网络均可视为一个由节点和边构成的有向图,其中节点代表相应粒度上的软件组成单元,有向边代表软件组成单元之间的联系;包级别依赖网络定义为根据包管理器提供的元数据构建出初步的依赖关系;进一步方法级依赖网络定义为:在包级别依赖网络的基础上,基于开源软件及其依赖项api级别的调用关系,构建出的包含类依赖、方法依赖的依赖关系。

3、所述基于开源项目数据的包级别依赖网络构建方法的构建方法具体为:给定一个目标软件包集合,首先为每个软件包的每个版本收集分布在中央仓库以及开源社区的元数据信息,保存到本地的一个单一存储库中;之后对于获取到的元数据,进行清洗并从中抽取出需要的节点信息;抽取出所述节点信息后,对软件包的直接依赖关系进行解析,基于semver实现一个依赖项约束解析器,处理各种依赖项约束条件;最后通过广度优先算法实现对目标软件包集合依赖网络的构建,存取到图数据库中。

4、所述元数据信息包括软件包名字、中央仓库地址、项目软件库托管地址、直接依赖项以及对直接依赖项的版本约束条件。

5、所述依赖项约束解析器的具体实现方式为:首先需要确定版本之间优先级比较规则,根据semver规范采用优先级比较规则实现,具体规则为:1.版本号的优先级按major、minor、patch、pre-release顺序比较;2.优先级由从左至右第一个不同的标识符确定,且major、minor、patch总是以数值方式比较;3.当major、minor、patch相同时,带pre-release标签的版本号优先级更低;4.只包含数字的标识符通过数值方式比较;5.包含字母的标识符逐个字符按ascii顺序比较;6.只包含数字的标识符优先级低于非数字标识符;7.前缀标识符相同时有更多标识符部分的优先级更高;并根据包生态系统相关文档以及前文描述的semver优先级比较规则,将其翻译成相对应版本范围,归一化依赖约束与对应的版本范围映射规则。

6、所述对目标软件包集合依赖网络的构建方法为:输入为一个待分析的软件包队列,先对已访问软件包列表seenpkg、待提交指令数ordercnt、输出包级别依赖网络cgdn置空,之后遍历初始队列里的每一个软件包pkg,首先访问本地是否有pkg的元数据文件metadata,如果不存在需要访问对应编程语言中央仓库给出的api,并将其缓存到本地,接着根据获取到的元数据文件,获取当前软件包的基本信息并进行依赖项解析;取软件名称和版本信息作为唯一id,在ne04j数据库生成节点,上述基本信息作为节点属性,同时将当前软件包id加入到已访问的队列seenpk本文档来自技高网...

【技术保护点】

1.一种方法级Java软件供应链的构建方法,其特征在于:首先通过包管理器的中央仓库获取项目的元数据、源代码以及可执行代码;然后基于项目的元数据,提出一种基于开源项目数据的包级别依赖网络构建方法;接着在包级别依赖网络的基础上,基于开源软件及其依赖项API级别的调用关系,构建方法级依赖网络,形成细粒度软件供应链;

2.如权利要求1所述的一种方法级Java软件供应链的构建方法,其特征在于:所述元数据信息包括软件包名字、中央仓库地址、项目软件库托管地址、直接依赖项以及对直接依赖项的版本约束条件。

3.如权利要求2所述的一种方法级Java软件供应链的构建方法,其特征在于:所述依赖项约束解析器的具体实现方式为:首先需要确定版本之间优先级比较规则,根据semver规范采用优先级比较规则实现,具体规则为:规则1,版本号的优先级按major、minor、patch、pre-release顺序比较;规则2,优先级由从左至右第一个不同的标识符确定,且major、minor、patch总是以数值方式比较;规则3,当major、minor、patch相同时,带pre-release标签的版本号优先级更低;规则4,只包含数字的标识符通过数值方式比较;规则5,包含字母的标识符逐个字符按ASCII顺序比较;规则6,只包含数字的标识符优先级低于非数字标识符;规则7,前缀标识符相同时有更多标识符部分的优先级更高;并根据包生态系统相关文档以及前文描述的semver优先级比较规则,将其翻译成相对应版本范围,归一化依赖约束与对应的版本范围映射规则。

4.如权利要求3所述的一种方法级Java软件供应链的构建方法,其特征在于:所述对目标软件包集合依赖网络的构建方法为:输入为一个待分析的软件包队列,先对已访问软件包列表seenpkg、待提交指令数orderCnt、输出包级别依赖网络cgdn置空,之后遍历初始队列里的每一个软件包pkg,首先访问本地是否有pkg的元数据文件metadata,如果不存在需要访问对应编程语言中央仓库给出的API,并将其缓存到本地,接着根据获取到的元数据文件,获取当前软件包的基本信息并进行依赖项解析;取软件名称和版本信息作为唯一id,在neo4j数据库生成节点,上述基本信息作为节点属性,同时将当前软件包id加入到已访问的队列seenPkg中避免重复访问;遍历从元数据文件里获取解析出当前软件包的所有直接依赖项,对每一个依赖项dep,生成依赖边pkg→dep;为了获取软件包的传递依赖,先判断依赖项dep是否在已访问软件包列表seenPkg中,或者在之前的执行过程中是否已经在数据库中生成了dep的依赖网络,否则就将其加入待构建队列;当待分析队列为空时,说明每个软件包及其所有的直接、传递依赖都已经解析完成;在执行数据库插入操作时,将一定数量的节点生成或边生成操作指令放入一个事务中进行提交,检查当前的待提交指令数是否达到阈值BATCH_SIZE,如果是则提交当前所有指令;最后提交剩余的指令,完成输入队列中所有软件包级别依赖网络cdnkg的构建。

5.如权利要求4所述的一种方法级Java软件供应链的构建方法,其特征在于:所述构建方法级依赖网络的具体方法为:基于程序静态分析技术、针对Maven托管的Java项目进行,分为三个阶段:第一阶段,给定一个待构建方法级依赖网络的Maven项目坐标集,使用自定义的下载模块从Maven中央仓库将每一个Maven坐标对应的元数据文件pom.xml与字节码文件JAR保存到本地存储库;第二阶段,对于项目集中每一个Maven项目,首先通过将其pom.xml文件输入依赖解析器,得到在当前时间节点t的该项目的软件包依赖网络SPDN0,这个依赖图包含了该项目的所有直接依赖项和传递依赖项,然后对依赖图中的每一个依赖项,首先查询本地存储库是否存在其字节码文件,如果有则直接取出,否则访问中央仓库将其保存到本地;接着将该Maven项目与其所有依赖项的字节码文件路径作为输入传递给静态代码分析器;静态代码分析器通过读取每个字节码文件,提取出其中的方法依赖关系,为每个字节码文件生成一个方法依赖关系图,此时图中的方法节点标识符并未统一,且一个方法依赖关系图中的某个外部节点可能映射到另一个方法依赖关系图中的一个内部节点上,因此需要重新对其中的节点进行统一标识和内外节点映射,得到了本专利技术前一节定义的方法粒度依赖网络MDN;第三阶段,使用多级粗化技术,以MDN作为输入,将具有相同名称空间的方法节点折叠到单个类节点中,生成类粒度依赖网络CDN,对CDN进行合并得到了初始Maven项目的一个新的软件包依赖网络SPDN,将不同粒度的依赖网络存在一个统一的图数据库中。

6.如权利要求5所述的一种方法级Ja...

【技术特征摘要】

1.一种方法级java软件供应链的构建方法,其特征在于:首先通过包管理器的中央仓库获取项目的元数据、源代码以及可执行代码;然后基于项目的元数据,提出一种基于开源项目数据的包级别依赖网络构建方法;接着在包级别依赖网络的基础上,基于开源软件及其依赖项api级别的调用关系,构建方法级依赖网络,形成细粒度软件供应链;

2.如权利要求1所述的一种方法级java软件供应链的构建方法,其特征在于:所述元数据信息包括软件包名字、中央仓库地址、项目软件库托管地址、直接依赖项以及对直接依赖项的版本约束条件。

3.如权利要求2所述的一种方法级java软件供应链的构建方法,其特征在于:所述依赖项约束解析器的具体实现方式为:首先需要确定版本之间优先级比较规则,根据semver规范采用优先级比较规则实现,具体规则为:规则1,版本号的优先级按major、minor、patch、pre-release顺序比较;规则2,优先级由从左至右第一个不同的标识符确定,且major、minor、patch总是以数值方式比较;规则3,当major、minor、patch相同时,带pre-release标签的版本号优先级更低;规则4,只包含数字的标识符通过数值方式比较;规则5,包含字母的标识符逐个字符按ascii顺序比较;规则6,只包含数字的标识符优先级低于非数字标识符;规则7,前缀标识符相同时有更多标识符部分的优先级更高;并根据包生态系统相关文档以及前文描述的semver优先级比较规则,将其翻译成相对应版本范围,归一化依赖约束与对应的版本范围映射规则。

4.如权利要求3所述的一种方法级java软件供应链的构建方法,其特征在于:所述对目标软件包集合依赖网络的构建方法为:输入为一个待分析的软件包队列,先对已访问软件包列表seenpkg、待提交指令数ordercnt、输出包级别依赖网络cgdn置空,之后遍历初始队列里的每一个软件包pkg,首先访问本地是否有pkg的元数据文件metadata,如果不存在需要访问对应编程语言中央仓库给出的api,并将其缓存到本地,接着根据获取到的元数据文件,获取当前软件包的基本信息并进行依赖项解析;取软件名称和版本信息作为唯一id,在neo4j数据库生成节点,上述基本信息作为节点属性,同时将当前软件包id加入到已访问的队列seenpkg中避免重复访问;遍历从元数据文件里获取解析出当前软件包的所有直接依赖项,对每一个依赖项dep,生成依赖边pkg→dep;为了获取软件包的传递依赖,先判断依赖项dep是否在已访问软件包列表seenpkg中...

【专利技术属性】
技术研发人员:孙海龙高祥沈逸君
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:

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

1