安全术语 | 软件包purl详解:跨工具、数据库、API和语言之间可靠地识别和定位软件包

软件包URL(purl,Package URL)是一个URL字符串,用于在编程语言、包管理器、包约定、工具、API和数据库中以最通用和统一的方式识别和定位软件包。purl是对现有方法进行标准化的尝试,以可靠地识别和定位软件包。 有望取代CPE成为软件包识别的统一标准。

1. 背景介绍

我们通过大量消费和生产软件包来构建和发布软件,如Maven、Gradle、NPM、RPM、Rubygems等。每个软件包管理器、平台、类型或生态系统都有自己的约定和协议来识别、定位和提供软件包。

当工具、API和数据库处理或存储多个包类型时,很难以统一的方式跨工具引用同一个软件包。

例如,这些工具、规范和API使用相对相似的方法来识别和定位软件包,每个软件包在语法、命名和约定方面都有细微的差异:

1、Sonatype 使用组件标识(component Identifier)来区分不能组件。

json 复制代码
{
  "components": [
    {
        "componentIdentifier": {
        "format": "maven",
        "coordinates": {
          "artifactId": "tomcat-util",
          "extension": "jar",
          "groupId": "tomcat",
          "version": "5.5.23"
         }
      }
    }
  ]
}

2、JFrog XRay 的组件命名采用包类型、命名空间、名称和版本的约定进行格式化。

3、Library.io使用平台、名称和版本区分组件。

2. purl解决方案

软件包URL(purl,Package URL)是一个URL字符串,用于在编程语言、包管理器、包约定、工具、API和数据库中以最通用和统一的方式识别和定位软件包。purl是对现有方法进行标准化的尝试,以可靠地识别和定位软件包。

purl基于熟悉的URL字符串的表达语法,这些字符串对人类和机器来说都很容易识别,并且可以在编程语言、包管理器、封装约定、工具、API和数据库之间一致工作。

主要可用于以下场景:

  • 为了在仓库和扫描工具之间可靠地引用相同的软件包;
  • 在跨多个包管理器收集、编目和监视包信息(如版本、依赖关系、许可等)的跨系统元数据索引、聚合或警报系统中;
  • 当跟踪包或其依赖项的已知漏洞并最终将代码包的多个化身跨包系统关联起来时;
  • 以及许多其他类型的分析,例如构建包的依赖图等。

若想了解更多细节,还可以查看FOSDEM 2018会议上的关于purl的宣讲PPT材料:

3. purl 规范细则

purl即Package url,purl是由七个组件组成的URL:

scheme:type/namespace/name@version?qualifiers#subpath

组件由一个特定的字符分隔,以便进行明确的解析。

每个组件的定义如下:

  • scheme:这是URL方案,常数值为"pkg"。这个单一方案的主要原因之一是为了方便将来对包URL的"pkg"方案进行正式注册。必需。
  • type:包"type"或包"protocol",如maven、npm、nuget、gem、pypi等。必需。
  • namespace:一些名称前缀,如Maven groupid、Docker镜像所有者、GitHub用户或组织。可选且特定于类型。
  • name:包的名称。必修的。
  • version:包的版本。可选择的
  • 限定符:包的额外限定数据,如操作系统、体系结构、发行版等。可选且特定于类型。
  • 子路径:包中相对于包根的额外子路径。可选择的

组件的设计使其形成从左侧最重要组件到右侧最不重要组件的层次结构。

注意: purl不得包含URL授权,即不支持用户名、密码、主机和端口组件。名称空间段有时可能看起来像主机,但其解释是特定于某个类型的。

purl样例(包含了maven、docker、github、gem及python组件):

pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?type=pom
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?classifier=sources
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?type=zip&classifier=dist
pkg:maven/net.sf.jacob-projec/jacob@1.14.3?classifier=x86&type=dll
pkg:maven/net.sf.jacob-projec/jacob@1.14.3?classifier=x64&type=dll

pkg:bitbucket/birkenfeld/pygments-main@244fd47e07d1014f0aed9c

pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie

pkg:docker/cassandra@sha256:244fd47e07d1004f0aed9c
pkg:docker/customer/dockerimage@sha256:244fd47e07d1004f0aed9c?repository_url=gcr.io

pkg:gem/jruby-launcher@1.1.2?platform=java
pkg:gem/ruby-advisory-db-check@0.12.4

pkg:github/package-url/purl-spec@244fd47e07d1004f0aed9c

pkg:golang/google.golang.org/genproto#googleapis/api/annotations

pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?packaging=sources
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io%2Frelease

pkg:npm/%40angular/animation@12.3.1
pkg:npm/foobar@12.3.1

pkg:nuget/EnterpriseLibrary.Common@6.0.1304

pkg:pypi/django@1.11.1

pkg:rpm/fedora/curl@7.50.3-1.fc25?arch=i386&distro=fedora-25
pkg:rpm/opensuse/curl@7.56.1-1.1.?arch=i386&distro=opensuse-tumbleweed

4. 规范详细信息

purl规范由核心语法定义和独立类型定义组成:

5. 参考链接


推荐阅读:

相关推荐
筑梦之月8 个月前
「 网络安全常用术语解读 」SBOM主流格式SWID详解
sbom·开源治理
筑梦之月8 个月前
「 网络安全常用术语解读 」软件物料清单SBOM详解
sbom·开源治理
manok1 年前
展望2024年供应链安全
代码审计·安全性测试·供应链安全·代码安全·开源治理