131% más CVE notificadas al día en 2026 que el año pasado.
← Volver al glosario

Package URL

Una package URL (purl) es una cadena estándar que identifica un paquete de software por su ecosistema, espacio de nombres, nombre y versión, como pkg:npm/[email protected].

Última actualización: 11 de noviembre de 2026

Una package URL (purl, una dirección estándar de paquete) es un identificador de un paquete de software que lo nombra como lo hace su propio ecosistema: pkg:type/namespace/name@version?qualifiers#subpath. Se convirtió en norma Ecma, ECMA-427, en diciembre de 2025 (1.ª edición, Ecma TC54), y la especificación se mantiene en package-url/purl-spec.

Cómo se construye una purl

Toda purl empieza por el esquema pkg. El tipo es el ecosistema o el gestor de paquetes (npm, pypi, cargo, deb, maven, etc.). El espacio de nombres es una agrupación opcional, como un scope de npm, un grupo de Maven o una distribución Linux. Después vienen el nombre y la versión. Los calificadores añaden datos que el ecosistema necesita para fijar el paquete exacto, como la arquitectura o la versión de la distribución, y la subruta apunta al interior de un paquete.

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

La última dice más que «cpio 2.15»: es el build propio de Ubuntu para la versión Noble en arm64. Importa porque las distribuciones retroportan correcciones de seguridad a sus propias versiones, de modo que la misma versión upstream puede ser vulnerable en una distribución y estar corregida en otra.

Por qué el cotejo de vulnerabilidades depende de ella

Las bases de avisos organizadas por paquete conocen un componente por su ecosistema y su nombre. El esquema OSV exige ecosystem y name para cada paquete afectado y califica su campo purl de «opcional pero recomendado»; los avisos de GitHub también se listan por paquete de ecosistema. Cuando un componente de la SBOM lleva una purl, una herramienta puede cotejarlo exactamente con esos avisos. Sin ella tiene que adivinar a partir de un nombre o de un CPE, o no coteja nada, y la vulnerabilidad queda sin notificar.

En un build de Yocto que comparamos, la SBOM del propio sistema de build listaba cientos de crates de Rust solo como archivos .crate con una ubicación de descarga y sin purl pkg:cargo, así que esos crates no podían cotejarse con los avisos de Rust (vea builds de Yocto). Las versiones más recientes de Yocto añaden purl de ecosistema para las fuentes de Cargo y Go.

Package URL frente a CPE

Package URLCPE
Quién define el nombreEl ecosistema del paqueteEl diccionario CPE de la NVD
IdentificaUn paquete en un registro o una distribuciónUn producto, incluidos hardware y sistemas operativos
Formatopkg:type/namespace/name@versioncpe:2.3:part:vendor:product:version:...
NormaECMA-427NISTIR 7695 (CPE 2.3)
Lo usanOSV, avisos de GitHub, herramientas SBOMNVD, muchos escáneres
Fallo típicoFalta en código incorporado o listado a manoNombres de proveedor y producto ambiguos; sin datos CPE para muchas CVE recientes

La regla práctica: dé una purl a cada paquete que tenga ecosistema, y use un CPE para lo que no lo tiene, como software comercial, firmware y hardware. Los identificadores que no encajan son una de las principales causas de hallazgos erróneos, vea reducir el ruido de vulnerabilidades.

Package URL en las SBOM

CycloneDX y SPDX incluyen una purl por componente. Los 2026 Minimum Elements de la CISA piden que los identificadores de componente usen identificadores comunes «como Common Platform Enumeration (CPE) y Package-URL (PURL)», y la alemana BSI TR-03183-2 exige esos identificadores para cada componente cuando existen. Una purl ausente es un problema de calidad de los campos más que una laguna en la completitud de la SBOM: el componente aparece, pero ninguna base de avisos puede buscarlo.

CRACI registra una package URL para cada paquete que descarga un build, incluido cada crate de Rust de un build de Yocto, para que sus SBOM puedan cotejarse con los avisos. Vea SBOM en tiempo de build.