Package URL
Een package URL (purl) is een standaardtekenreeks die een softwarepakket identificeert via ecosysteem, namespace, naam en versie, zoals pkg:npm/[email protected].
Laatst bijgewerkt: 11 november 2026
Een package URL (purl, een gestandaardiseerd pakketadres) is een identificator voor een softwarepakket die het benoemt zoals het eigen ecosysteem dat doet: pkg:type/namespace/name@version?qualifiers#subpath. In december 2025 werd het een Ecma-standaard, ECMA-427 (1e editie, Ecma TC54), en de specificatie wordt onderhouden op package-url/purl-spec.
Hoe een purl is opgebouwd
Elke purl begint met het schema pkg. Het type is het ecosysteem of de pakketbeheerder (npm, pypi, cargo, deb, maven enzovoort). De namespace is een optionele groepering, zoals een npm-scope, een Maven-groep of een Linux-distributie. Dan volgen de naam en de versie. Qualifiers voegen gegevens toe die het ecosysteem nodig heeft om het exacte pakket vast te leggen, zoals de architectuur of de distributierelease, en het subpath wijst naar een plek binnen een pakket.
pkg:npm/%40angular/[email protected]
pkg:pypi/[email protected]
pkg:cargo/[email protected]
pkg:deb/ubuntu/[email protected]+dfsg-1ubuntu2.1?arch=arm64&distro=noble
De laatste zegt meer dan "cpio 2.15": het is Ubuntu's eigen build voor de release Noble op arm64. Dat telt, omdat distributies beveiligingsfixes terugporteren naar hun eigen versies. Dezelfde upstreamversie kan dus in de ene distributie kwetsbaar zijn en in de andere opgelost.
Waarom kwetsbaarheidsmatching ervan afhangt
Advisorydatabases die per pakket zijn georganiseerd, kennen een component aan zijn ecosysteem en naam. Het OSV-schema vereist ecosystem en name voor elk getroffen pakket en noemt het veld purl "optioneel maar aanbevolen"; ook de advisories van GitHub staan per ecosysteempakket. Heeft een SBOM-component een purl, dan kan een tool het exact met die advisories matchen. Zonder purl moet het raden op basis van een naam of een CPE, of matcht het niets, en blijft de kwetsbaarheid ongemeld.
In een Yocto-build die we vergeleken, vermeldde de eigen SBOM van het buildsysteem honderden Rust-crates alleen als .crate-bestanden met een downloadlocatie en zonder pkg:cargo-purl, waardoor die crates niet met Rust-advisories gematcht konden worden (zie Yocto-builds). Nieuwere Yocto-releases voegen ecosysteem-purls toe voor Cargo- en Go-bronnen.
Package URL vs. CPE
| Package URL | CPE | |
|---|---|---|
| Wie de naam bepaalt | Het ecosysteem van het pakket | Het CPE-woordenboek van de NVD |
| Identificeert | Een pakket in een registry of distributie | Een product, inclusief hardware en besturingssystemen |
| Formaat | pkg:type/namespace/name@version | cpe:2.3:part:vendor:product:version:... |
| Standaard | ECMA-427 | NISTIR 7695 (CPE 2.3) |
| Gebruikt door | OSV, GitHub-advisories, SBOM-tools | NVD, veel scanners |
| Typische fout | Ontbreekt bij gevendorde of handmatig vermelde code | Dubbelzinnige leveranciers- en productnamen; geen CPE-gegevens voor veel nieuwe CVE's |
De vuistregel: geef elk pakket met een ecosysteem een purl, en gebruik een CPE voor wat er geen heeft, zoals commerciële software, firmware en hardware. Niet-passende identificatoren zijn een van de belangrijkste oorzaken van onjuiste bevindingen, zie kwetsbaarheidsruis verminderen.
Package URL's in SBOM's
CycloneDX en SPDX bevatten allebei een purl per component. De 2026 Minimum Elements van CISA vragen dat componentidentificatoren gangbare identificatoren gebruiken "zoals Common Platform Enumeration (CPE) en Package-URL (PURL)", en de Duitse BSI TR-03183-2 vereist zulke identificatoren voor elk component als ze bestaan. Een ontbrekende purl is een probleem van veldkwaliteit, geen gat in de SBOM-volledigheid: het component staat erin, maar geen advisorydatabase kan het opzoeken.
CRACI legt een package URL vast voor elk pakket dat een build binnenhaalt, ook voor elke Rust-crate in een Yocto-build, zodat de SBOM's met advisories gematcht kunnen worden. Zie build-time SBOM's.