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 URL | CPE | |
|---|---|---|
| 名前を決めるのは | パッケージのエコシステム | NVDのCPE辞書 |
| 識別する対象 | レジストリやディストリビューション内のパッケージ | ハードウェアやOSを含む製品 |
| 形式 | pkg:type/namespace/name@version | cpe:2.3:part:vendor:product:version:... |
| 規格 | ECMA-427 | NISTIR 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を参照してください。