2026年に報告されたCVEは、1日あたり前年比131%増加しています。
← 用語集に戻る

Package URL

Package URL(purl)は、ソフトウェアパッケージをエコシステム、名前空間、名前、バージョンで識別する標準の文字列です。例:pkg:npm/[email protected]。

最終更新日:2026年11月11日

Package URL(purl、標準化されたパッケージ識別子)は、ソフトウェアパッケージを、そのパッケージ自身のエコシステムでの呼び方どおりに表す識別子です:pkg:type/namespace/name@version?qualifiers#subpath。2025年12月にEcma規格ECMA-427(第1版、Ecma TC54)となり、仕様はpackage-url/purl-specで管理されています。

purlの構成

purlはすべてスキームpkgで始まります。タイプはエコシステムまたはパッケージマネージャーです(npm、pypi、cargo、deb、mavenなど)。名前空間は任意のグループで、npmのスコープ、Mavenのグループ、Linuxディストリビューションなどが入ります。続いて名前とバージョンです。修飾子は、アーキテクチャやディストリビューションのリリースなど、エコシステムが正確なパッケージを特定するのに必要な情報を加え、サブパスはパッケージ内部の場所を指します。

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

最後の例は「cpio 2.15」以上のことを伝えています。これはUbuntuがNobleリリースのarm64向けに自らビルドしたものです。ディストリビューションはセキュリティ修正を自分たちのバージョンにバックポートするため、同じアップストリームのバージョンでも、あるディストリビューションでは脆弱で、別のディストリビューションでは修正済みということがあるからです。

脆弱性の照合がpurlに依存する理由

パッケージ単位で整理されたアドバイザリデータベースは、コンポーネントをエコシステムと名前で把握します。OSVスキーマは、影響を受けるすべてのパッケージにecosystemとnameを必須とし、purlフィールドを「任意だが推奨」としています。GitHubのアドバイザリもエコシステムのパッケージ単位で掲載されています。SBOMのコンポーネントにpurlがあれば、ツールはそれらのアドバイザリと正確に照合できます。purlがなければ、名前やCPEから推測するしかなく、何も一致しないこともあり、その脆弱性は報告されません。

私たちが比較したYoctoビルドでは、ビルドシステム自身のSBOMが数百のRustクレートを、ダウンロード先付きの.crateファイルとしてしか記載しておらず、pkg:cargoのpurlがありませんでした。そのため、これらのクレートはRustのアドバイザリと照合できませんでした(Yoctoビルドを参照)。新しいYoctoリリースでは、CargoとGoのソースにエコシステムのpurlが付与されます。

Package URLとCPEの比較

Package URLCPE
名前を決めるのはパッケージのエコシステムNVDのCPE辞書
識別する対象レジストリやディストリビューション内のパッケージハードウェアやOSを含む製品
形式pkg:type/namespace/name@versioncpe:2.3:part:vendor:product:version:...
規格ECMA-427NISTIR 7695(CPE 2.3)
利用先OSV、GitHubアドバイザリ、SBOMツールNVD、多くのスキャナー
よくある失敗ベンダリングや手動記載のコードで欠落ベンダー名・製品名があいまい、新しいCVEの多くにCPEデータがない

目安として、エコシステムを持つすべてのパッケージにはpurlを付け、商用ソフトウェア、ファームウェア、ハードウェアなどエコシステムを持たないものにはCPEを使います。識別子の不一致は誤った検出結果の主な原因のひとつです。脆弱性ノイズの削減を参照してください。

SBOMにおけるPackage URL

CycloneDXとSPDXはどちらも、コンポーネントごとにpurlを持ちます。CISAの2026 Minimum Elementsは、コンポーネント識別子に「Common Platform Enumeration(CPE)やPackage-URL(PURL)などの」一般的な識別子を使うよう求めており、ドイツのBSI TR-03183-2は、存在する場合には各コンポーネントにそうした識別子を求めています。purlの欠落はSBOMの完全性の欠落ではなく、フィールド品質の問題です。コンポーネントは記載されていても、どのアドバイザリデータベースでも検索できません。

CRACIは、ビルドが取り込むすべてのパッケージについて、YoctoビルドのRustクレート一つひとつも含めてPackage URLを記録するため、そのSBOMをアドバイザリと照合できます。ビルド時SBOMを参照してください。