Skip to content

📦 Package URL (PURL)

Package URL(PURL) 是一种紧凑的、生态原生的软件包标识符,由 package-url 项目 规范。CPE 围绕供应商与产品名为 NVD 世界设计,而 PURL 围绕包在各自包管理器中的实际寻址方式设计。一个 PURL 长这样:

pkg:golang/github.com/scagogogo/cpe-skills@v0.5.0
pkg:npm/%40angular/core@17.0.0
pkg:maven/org.apache.logging.log4j/log4j-core@2.17.1
pkg:pypi/django@4.2

PURL 的结构

pkg:<type>/<namespace>/<name>@<version>?<qualifiers>#<subpath>
必需示例
typegolangnpmmavenpypi
namespacegithub.com/scagogogo@angular
namecpe-skillscore
versionv0.5.017.0.0
qualifiers?arch=amd64&os=linux
subpath#internal/sub

CPE 与 PURL —— 不同但互补

方面CPEPURL
起源NIST / NVD开源的 package-url 规范
单元供应商 + 产品 + 版本生态系统 + 命名空间 + 名称 + 版本
生态感知否(仅供应商字符串)是(type 是一等公民)
主要用途NVD 中的 CVE 匹配依赖 / SBOM 标识
通配符有(ANY/NA

两者互补:NVD 说 CPE,包管理器和现代 SBOM 说 PURL。 要把一个 CVE(CPE 列出)与一个锁定的依赖(PURL 寻址)关联,必须在两者之间互转。

为什么互转重要

映射不是一一对应——同一个 CPE 可对应多个 PURL,取决于包生态(同一个库可能既作为 Maven artifact 又作为 npm 包发布),而 PURL 的 vendor 不总与 CPE 供应商字符串匹配。cpe-skills 启发式地完成转换,并随结果返回一个置信度分数,让调用方决定是否信任自动匹配。

在 CPE 与 PURL 之间转换

go
package main

import (
    "fmt"
    "github.com/scagogogo/cpe-skills"
)

func main() {
    cpe, _ := cpeskills.ParseCpe23("cpe:2.3:a:log4j:log4j:2.17.1:*:*:*:*:*:*:*")

    // CPE -> PURL(返回置信度分数 0..1)
    purl, conf, err := cpeskills.CPEToPURL(cpe)
    if err != nil { panic(err) }
    fmt.Println(purl.String(), conf)

    // PURL -> CPE(也返回置信度分数)
    parsed, _ := cpeskills.ParsePURL("pkg:maven/org.apache.logging.log4j/log4j-core@2.17.1")
    back, conf2, err := cpeskills.PURLToCPE(parsed)
    if err != nil { panic(err) }
    fmt.Println(back.Cpe23, conf2)
}

已知目标生态时,MapCPEToPURLWithEcosystem 通过用生态选择正确的 typenamespace 布局,产出更准确的 PURL。批量助手 BatchCPEToPURLBatchPURLToCPE 一次调用处理整个清单。

生态感知

库内置一组受支持的生态——npmmavenpypigolang——通过 Ecosystem 类型和 ListEcosystems() 暴露。EcosystemFromPURLType 把 PURL type 字符串映射到内部 EcosystemCPEPartToEcosystemHint 从 CPE part 给出最佳猜测生态。这种生态知识让 CPE↔PURL 映射能选择合理的默认值。

与各模块的关系

  • PURL —— PackageURL 结构体、ParsePURLNewPURL
  • CPE-PURL Mapping —— CPEToPURLPURLToCPE、批量与生态变体。
  • Ecosystem —— Ecosystem 类型、ListEcosystems、映射助手。

小结

PURL 是 CPE 的生态原生对应物。因为 NVD 和 SBOM 工具各偏爱其一,两者之间能互转——并附带诚实的置信度分数——正是端到端漏洞关联得以实现的关键。

Released under the MIT License.