GCVE-BCP-10 - Improved Common Platform Enumeration for GCVE
GCVE-BCP-10: Improved Common Platform Enumeration for GCVE
- Version: 1.0
- Status: Draft (for Public Review)
- Date: 2026-04-26
- Authors: GCVE Working Group
- BCP ID: BCP-10
This guide is distributed and available under CC-BY-4.0.
Copyright (C) 2025-2026 GCVE Initiative.
Abstract
This document specifies an improved platform enumeration model for GCVE aligned with the current implementation of cpe-editor.
The model remains compatible with existing Common Platform Enumeration (CPE) practices and string formats, while adding registry records for vendors, products, CPE entries, metadata, relationships, and optional moderation proposals.
The main improvements are:
- deterministic UUIDv5 identifiers for vendor and product records;
- a documented UUID namespace hierarchy for repeatable imports across instances;
- first-class vendor, product, and CPE entry records matching the
cpe-editorexport format; - explicit metadata using namespaced metadata keys such as
gcve:urlandgcve:description; - support for synonym, rename, equivalence, and lifecycle relationships through structured relationship records;
- audit-oriented timestamps and approval fields for metadata and relationship records;
- registry support for vendor, product, CPE, metadata, and relationship synchronization.
The goal is to preserve interoperability with existing CPE-based tooling while addressing operational limitations encountered in long-term platform naming, vendor consolidation, product renaming, alias management, and decentralized registry synchronization.
Motivation
Traditional CPE naming is useful as a compact and widely understood naming format, but it has several practical limitations:
- the name itself often acts as the identifier;
- renaming or normalization can break references;
- aliases and synonyms are difficult to track cleanly;
- provenance and approval state are not always explicit;
- vendor mergers, splits, rebranding, and product renaming require registry-level lifecycle handling;
- non-matching metadata such as URLs, descriptions, notes, and external references is difficult to attach consistently;
- repeated imports from public CPE sources need deterministic identity generation to remain idempotent across registry instances.
GCVE-BCP-10 addresses these limitations by separating the stable identity of a registry record from its displayed name, CPE-compatible representation, and descriptive metadata.
Design principles
GCVE-BCP-10 follows these principles:
- Backward compatibility: existing CPE 2.3 strings remain valid and central to matching.
- Stable identity: UUIDs are the primary durable identifiers for vendor and product records.
- Deterministic import: vendor and product UUIDs are generated with UUIDv5 from normalized names.
- Vendor-scoped product identity: product UUIDs are derived from both the normalized vendor name and normalized product name.
- Rename safety: names and titles may change without changing the identity of the record.
- Namespaced metadata: metadata keys use namespace prefixes, with GCVE-defined keys using the
gcve:prefix. - Structured synonym handling: aliases, equivalent names, and renames are modeled as first-class relationship records.
- Auditability: submitted, approved, created, and updated timestamps are preserved where applicable.
- Registry governance: GCVE operates a registry for updates, synonym resolution, metadata approval, and vendor/product management.
Terminology
Vendor record
A structured record describing a vendor or organization. A vendor record has a stable UUID, a normalized machine-oriented name, a human-readable title, optional notes, and timestamps.
Product record
A structured record describing a product, platform, application, operating system, hardware item, or other CPE-relevant entity. Product records use stable UUIDs and are linked to vendor records by vendor_uuid.
CPE entry record
A structured CPE 2.3 entry linked to a vendor and product by UUID. A CPE entry stores the full CPE URI, parsed CPE attributes, the optional upstream cpeNameId, deprecation status, notes, and timestamps.
Metadata record
A structured key/value assertion attached to a vendor or product record. Metadata keys are namespaced. GCVE-defined metadata keys use the gcve: prefix.
Canonical name
The preferred name or CPE-compatible string currently designated by the GCVE registry for a vendor or product record. Canonical naming may be represented through normalized record fields, metadata, and relationships.
Alias / synonym
An alternative vendor or product name that refers to the same or closely related identity.
Relationship record
A typed link between a source vendor or product UUID and a target vendor or product UUID.
CPE-compatible string
A CPE 2.3 formatted string or compatible match criterion used by existing vulnerability and asset-management tooling.
Alignment with cpe-editor
The current cpe-editor implementation exports a dataset using the following top-level structure:
{
"format": "cpe-editor-dataset",
"version": "1",
"exported_at": "2026-04-26T17:00:00+00:00",
"counts": {
"vendors": 2,
"products": 1,
"cpes": 1,
"metadata": 2,
"relationships": 1,
"proposals": 0
},
"vendors": [],
"products": [],
"cpes": [],
"metadata": [],
"relationships": [],
"proposals": []
}GCVE-BCP-10 therefore treats the cpe-editor dataset archive JSON as the reference exchange shape for this draft. In particular:
vendorsandproductscarry deterministic UUIDv5 identifiers;cpescarry CPE 2.3 strings and parsed CPE fields;metadatacarries namespaced key/value assertions for vendors and products;relationshipscarries approved or imported synonym, rename, and lifecycle links;proposalsis an implementation-specific moderation-history array and may be empty.
UUID generation
UUID format
GCVE-BCP-10 uses standard lowercase textual UUIDs in canonical 8-4-4-4-12 form:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxVendor and product UUIDs generated by cpe-editor are UUIDv5 identifiers. UUIDv5 is name-based and deterministic: the same namespace UUID and same normalized name string produce the same UUID.
Namespace hierarchy
The current cpe-editor namespace hierarchy is:
from uuid import NAMESPACE_URL, uuid5
GCVE_ROOT_NAMESPACE_URL = "GCVE-BCP-10"
GCVE_ROOT_NAMESPACE = uuid5(NAMESPACE_URL, GCVE_ROOT_NAMESPACE_URL)
VENDOR_UUID_NAMESPACE = uuid5(GCVE_ROOT_NAMESPACE, "vendor")
PRODUCT_UUID_NAMESPACE = uuid5(GCVE_ROOT_NAMESPACE, "product")This produces the following namespace UUIDs:
| Name | UUID |
|---|---|
GCVE_ROOT_NAMESPACE |
12f50db3-9dac-5340-843f-1a9823090227 |
VENDOR_UUID_NAMESPACE |
bc564076-4070-5fd8-8b46-27679548dd7a |
PRODUCT_UUID_NAMESPACE |
d1b407e8-4bd6-5fda-ad3b-21d12be51c07 |
Token normalization
Before UUID generation, vendor and product tokens are normalized as follows:
def normalize_token(value: str) -> str:
return (value or "").strip().lower().replace(" ", "_")This means:
- leading and trailing whitespace is removed;
- text is converted to lowercase;
- ASCII space characters are replaced with underscores;
- hyphens are preserved;
- existing underscores are preserved;
- no other CPE escaping or Unicode normalization is implied by this profile.
Vendor UUID generation
A vendor UUID is generated from the normalized vendor name:
def vendor_uuid_for_name(name: str) -> str:
return str(uuid5(VENDOR_UUID_NAMESPACE, normalize_token(name)))Examples:
| Vendor name input | Normalized name | UUIDv5 |
|---|---|---|
misp |
misp |
536016cd-a314-5880-947a-e465002d0fab |
misp-project |
misp-project |
c759b712-4932-513a-b6a1-f86c0bcc1a5e |
MISP Project |
misp_project |
932a354b-26eb-5651-ae79-eba7f4658ba2 |
Product UUID generation
A product UUID is generated from the normalized vendor name and normalized product name, separated by a colon:
def product_uuid_for_names(vendor_name: str, product_name: str) -> str:
return str(
uuid5(
PRODUCT_UUID_NAMESPACE,
f"{normalize_token(vendor_name)}:{normalize_token(product_name)}",
)
)The product UUID is vendor-scoped. This avoids collisions where different vendors legitimately use the same product token.
Examples:
| Vendor input | Product input | UUIDv5 name string | UUIDv5 |
|---|---|---|---|
misp |
misp |
misp:misp |
f28e0890-4e1b-59a5-b52c-3e9354071db7 |
misp-project |
misp |
misp-project:misp |
e75bc4d3-b693-577b-ac4b-40d13b5f5bc5 |
UUID stability rules
- A vendor UUID MUST be generated with
uuid5(VENDOR_UUID_NAMESPACE, normalize_token(vendor_name))when importing or backfilling vendor records. - A product UUID MUST be generated with
uuid5(PRODUCT_UUID_NAMESPACE, normalize_token(vendor_name) + ":" + normalize_token(product_name))when importing or backfilling product records. - A product UUID MUST be scoped to its vendor name as shown above.
- Vendor and product UUIDs MUST remain stable across repeated imports of the same normalized names.
- A change in
title,notes, metadata, or CPE entries MUST NOT change the UUID. - If a registry changes the machine-oriented
name, it MUST either preserve the existing UUID through registry policy or create a new deterministic UUID and add a relationship such asrenamed-to,synonym-of, orsuperseded-by. - Random UUIDs MAY be used temporarily for records created interactively before normalization is final, but exported vendor and product records SHOULD be backfilled to the deterministic UUIDv5 values.
Data model
GCVE-BCP-10 uses separate registry records for vendors, products, CPE entries, metadata, and relationships.
Vendor record
A vendor record has the following fields:
uuid: stable UUID for the vendor.name: normalized machine-oriented vendor name.title: human-readable vendor title; may benull.notes: optional registry notes; may benull.created_at: creation timestamp.updated_at: last update timestamp.
Example:
{
"created_at": "2026-04-26T14:25:34.846011",
"name": "misp",
"notes": null,
"title": "Misp",
"updated_at": "2026-04-26T14:25:34.846011",
"uuid": "536016cd-a314-5880-947a-e465002d0fab"
}Another vendor record for an alias or related organization:
{
"created_at": "2026-04-26T14:24:53.155776",
"name": "misp-project",
"notes": null,
"title": "Misp Project",
"updated_at": "2026-04-26T14:24:53.155776",
"uuid": "c759b712-4932-513a-b6a1-f86c0bcc1a5e"
}Product record
A product record represents a CPE-relevant product or platform.
Fields:
uuid: stable UUID for the product.vendor_uuid: stable UUID of the associated vendor.name: normalized machine-oriented product name.title: human-readable product title; may benull.notes: optional registry notes; may benull.created_at: creation timestamp.updated_at: last update timestamp.
Example:
{
"created_at": "2026-04-26T14:26:10.000000",
"name": "misp",
"notes": null,
"title": "Misp",
"updated_at": "2026-04-26T14:26:10.000000",
"uuid": "f28e0890-4e1b-59a5-b52c-3e9354071db7",
"vendor_uuid": "536016cd-a314-5880-947a-e465002d0fab"
}CPE entry record
A CPE entry record stores the CPE-compatible representation and parsed CPE attributes.
Fields:
cpe_uri: full CPE 2.3 URI, such ascpe:2.3:a:misp:misp:*:*:*:*:*:*:*:*.cpe_name_id: upstream CPE name UUID when available, such as an NVDcpeNameId; may benull.vendor_uuid: UUID of the associated vendor record.product_uuid: UUID of the associated product record.deprecated: boolean deprecation flag.deprecated_by: replacement CPE URI or reference when available; may benull.part: CPE part, commonlya,o, orh.version: CPE version component, or*.update: CPE update component, or*.edition: CPE edition component, or*.language: CPE language component, or*.sw_edition: CPE software edition component, or*.target_sw: CPE target software component, or*.target_hw: CPE target hardware component, or*.other: CPE other component, or*.title: human-readable title; may benull.notes: optional notes; may benull.from_proposal: boolean indicating whether the entry originated from a proposal workflow.created_at: creation timestamp.updated_at: last update timestamp.
Example:
{
"cpe_name_id": null,
"cpe_uri": "cpe:2.3:a:misp:misp:*:*:*:*:*:*:*:*",
"created_at": "2026-04-26T14:26:30.000000",
"deprecated": false,
"deprecated_by": null,
"edition": "*",
"from_proposal": false,
"language": "*",
"notes": "Imported from NVD CPE 2.0 feed",
"other": "*",
"part": "a",
"product_uuid": "f28e0890-4e1b-59a5-b52c-3e9354071db7",
"sw_edition": "*",
"target_hw": "*",
"target_sw": "*",
"title": "Misp",
"update": "*",
"updated_at": "2026-04-26T14:26:30.000000",
"vendor_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"version": "*"
}Metadata record
A metadata record attaches a namespaced key/value pair to a vendor or product record.
Fields:
metadata_key: namespaced metadata key. GCVE-defined keys MUST use thegcve:prefix.metadata_value: metadata value as a string.record_type: target record type, such asvendororproduct.record_uuid: UUID of the target vendor or product record.submitter_name: submitter name; may be an empty string ornull.submitter_email: submitter email; may be an empty string ornull.submitted_at: submission timestamp.approved_at: approval timestamp; may benullif not approved.created_at: creation timestamp.updated_at: last update timestamp.
Example metadata record for a vendor URL:
{
"approved_at": "2026-04-26T16:37:57.912577",
"created_at": "2026-04-26T16:37:57.919754",
"metadata_key": "gcve:url",
"metadata_value": "https://misp-project.org/",
"record_type": "vendor",
"record_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"submitted_at": "2026-04-26T16:36:55.583569",
"submitter_email": "",
"submitter_name": "",
"updated_at": "2026-04-26T16:37:57.919758"
}Example metadata record for a vendor description:
{
"approved_at": "2026-04-26T16:38:01.609044",
"created_at": "2026-04-26T16:38:01.612249",
"metadata_key": "gcve:description",
"metadata_value": "MISP - Threat Intelligence Sharing Platform\r\n\r\nMISP is an open source software solution for collecting, storing, distributing and sharing cyber security indicators and threats about cyber security incidents analysis and malware analysis. MISP is designed by and for incident analysts, security and ICT professionals or malware reversers to support their day-to-day operations to share structured information efficiently.\r\n\r\nThe objective of MISP is to foster the sharing of structured information within the security community and abroad. MISP provides functionalities to support the exchange of information but also the consumption of said information by Network Intrusion Detection Systems (NIDS), LIDS but also log analysis tools, SIEMs.",
"record_type": "vendor",
"record_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"submitted_at": "2026-04-26T16:37:49.951062",
"submitter_email": "",
"submitter_name": "",
"updated_at": "2026-04-26T16:38:01.612251"
}Recommended GCVE metadata keys
The following GCVE metadata keys are recommended for CPE-related use:
gcve:url: primary public URL for a vendor or product.gcve:description: human-readable description.gcve:source: source authority or import origin for the assertion.gcve:canonical: string value indicating whether the associated assertion is canonical, such astrueorfalse.gcve:deprecated: string value indicating whether a record or assertion is deprecated, such astrueorfalse.gcve:replaced-by: UUID of the preferred replacement record, when applicable.gcve:external-id: external identifier associated with a vendor or product.gcve:homepage: synonym for or more specific variant ofgcve:url, when a registry policy distinguishes homepage from other URLs.
CPE 2.3 strings SHOULD be represented as CPE entry records in the cpes array. Metadata MAY still be used for auxiliary CPE-related assertions, but implementations SHOULD NOT rely on metadata as the primary storage for imported CPE entries when the cpes array is available.
Implementations MAY define additional metadata keys under other namespace prefixes. They MUST NOT redefine the semantics of GCVE-defined gcve: keys.
Relationship record
A relationship record links one vendor or product record to another vendor or product record.
Fields:
relationship_type: relationship type.source_vendor_uuid: source vendor UUID, ornull.source_product_uuid: source product UUID, ornull.target_vendor_uuid: target vendor UUID, ornull.target_product_uuid: target product UUID, ornull.rationale: free-text rationale for the relationship; may be an empty string ornull.submitter_name: submitter name; may be an empty string ornull.submitter_email: submitter email; may be an empty string ornull.submitted_at: submission timestamp; may benull.approved_at: approval timestamp; may benull.created_at: creation timestamp.updated_at: last update timestamp.
Rules:
- exactly one of
source_vendor_uuidorsource_product_uuidSHOULD be non-null; - exactly one of
target_vendor_uuidortarget_product_uuidSHOULD be non-null; - vendor-to-vendor relationships SHOULD use
source_vendor_uuidandtarget_vendor_uuid; - product-to-product relationships SHOULD use
source_product_uuidandtarget_product_uuid; - cross-type relationships MAY be used only when explicitly supported by registry policy;
- relationship records do not require a standalone
relationshipIdin thecpe-editorexchange format; - importers SHOULD treat
(source_vendor_uuid, source_product_uuid, target_vendor_uuid, target_product_uuid, relationship_type)as the natural relationship identity.
Example vendor synonym relationship:
{
"approved_at": "2026-04-26T15:00:15.404458",
"created_at": "2026-04-26T15:00:24.654104",
"rationale": "",
"relationship_type": "synonym-of",
"source_product_uuid": null,
"source_vendor_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"submitted_at": "2026-04-26T14:59:36.958957",
"submitter_email": "",
"submitter_name": "",
"target_product_uuid": null,
"target_vendor_uuid": "c759b712-4932-513a-b6a1-f86c0bcc1a5e",
"updated_at": "2026-04-26T15:00:24.654105"
}Example product rename relationship:
{
"approved_at": "2026-04-26T15:28:49.747406",
"created_at": "2026-04-26T15:28:51.283869",
"rationale": "",
"relationship_type": "renamed-to",
"source_product_uuid": "7669a502-7617-50ad-a2d3-1b5f36b46051",
"source_vendor_uuid": null,
"submitted_at": "2026-04-26T15:28:37.806590",
"submitter_email": "",
"submitter_name": "",
"target_product_uuid": "f28e0890-4e1b-59a5-b52c-3e9354071db7",
"target_vendor_uuid": null,
"updated_at": "2026-04-26T15:28:51.283871"
}Recommended relationship types
The following relationship types are defined:
synonym-of: the source record is a synonym of the target record.canonical-of: the source record is an alias whose canonical record is the target.renamed-to: the source record has been renamed to the target.superseded-by: the source record is obsolete and replaced operationally by the target.equivalent-to: both records are considered operationally equivalent for identification purposes.vendor-merge-into: the source vendor has merged into the target vendor.derived-from: the source record was derived from another source record.
Implementations may define additional relationship types, but they should not change the semantics of the above values.
Compatibility model
GCVE-BCP-10 does not replace the CPE string format. Instead, it layers stable registry identity, namespaced metadata, CPE entry records, and relationship semantics on top of it.
A GCVE-BCP-10 implementation:
- must retain CPE-compatible name or match strings where CPE matching is required;
- must not require existing CPE parsers to understand GCVE UUIDs, metadata records, or relationship records to parse the CPE string itself;
- may provide registry metadata beyond what legacy CPE consumers understand;
- should allow lossless round-trip preservation of the original CPE-compatible string;
- should store imported CPE names as
cpesrecords linked to vendor and product UUIDs; - may use metadata for descriptive or auxiliary assertions that are not core CPE entries.
This means existing tools can continue using the CPE string for matching, while GCVE-aware systems use UUIDs, metadata, CPE records, and relationships for lifecycle-safe management.
Proposed schema
The following JSON Schema describes the GCVE-BCP-10 registry exchange format aligned with the cpe-editor dataset format.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "JSON Schema for GCVE-BCP-10 cpe-editor Dataset Exchange",
"$id": "https://gcve.eu/schema/gcve-bcp-10/cpe_editor_dataset_json.schema",
"definitions": {
"uuid": {
"type": "string",
"format": "uuid"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"nullable_timestamp": {
"anyOf": [
{ "$ref": "#/definitions/timestamp" },
{ "type": "null" }
]
},
"nullable_string": {
"type": ["string", "null"]
},
"def_counts": {
"type": "object",
"properties": {
"vendors": { "type": "integer" },
"products": { "type": "integer" },
"cpes": { "type": "integer" },
"metadata": { "type": "integer" },
"relationships": { "type": "integer" },
"proposals": { "type": "integer" }
},
"required": [
"vendors",
"products",
"cpes",
"metadata",
"relationships",
"proposals"
],
"additionalProperties": false
},
"def_vendor": {
"type": "object",
"properties": {
"uuid": { "$ref": "#/definitions/uuid" },
"name": { "type": "string" },
"title": { "$ref": "#/definitions/nullable_string" },
"notes": { "$ref": "#/definitions/nullable_string" },
"created_at": { "$ref": "#/definitions/timestamp" },
"updated_at": { "$ref": "#/definitions/timestamp" }
},
"required": [
"created_at",
"name",
"notes",
"title",
"updated_at",
"uuid"
],
"additionalProperties": false
},
"def_product": {
"type": "object",
"properties": {
"uuid": { "$ref": "#/definitions/uuid" },
"vendor_uuid": { "$ref": "#/definitions/uuid" },
"name": { "type": "string" },
"title": { "$ref": "#/definitions/nullable_string" },
"notes": { "$ref": "#/definitions/nullable_string" },
"created_at": { "$ref": "#/definitions/timestamp" },
"updated_at": { "$ref": "#/definitions/timestamp" }
},
"required": [
"created_at",
"name",
"notes",
"title",
"updated_at",
"uuid",
"vendor_uuid"
],
"additionalProperties": false
},
"def_cpe": {
"type": "object",
"properties": {
"cpe_uri": { "type": "string" },
"cpe_name_id": {
"anyOf": [
{ "$ref": "#/definitions/uuid" },
{ "type": "null" }
]
},
"vendor_uuid": { "$ref": "#/definitions/uuid" },
"product_uuid": { "$ref": "#/definitions/uuid" },
"deprecated": { "type": "boolean" },
"deprecated_by": { "$ref": "#/definitions/nullable_string" },
"part": { "type": "string", "enum": ["a", "o", "h", "*"] },
"version": { "type": "string" },
"update": { "type": "string" },
"edition": { "type": "string" },
"language": { "type": "string" },
"sw_edition": { "type": "string" },
"target_sw": { "type": "string" },
"target_hw": { "type": "string" },
"other": { "type": "string" },
"title": { "$ref": "#/definitions/nullable_string" },
"notes": { "$ref": "#/definitions/nullable_string" },
"from_proposal": { "type": "boolean" },
"created_at": { "$ref": "#/definitions/timestamp" },
"updated_at": { "$ref": "#/definitions/timestamp" }
},
"required": [
"cpe_name_id",
"cpe_uri",
"created_at",
"deprecated",
"deprecated_by",
"edition",
"from_proposal",
"language",
"notes",
"other",
"part",
"product_uuid",
"sw_edition",
"target_hw",
"target_sw",
"title",
"update",
"updated_at",
"vendor_uuid",
"version"
],
"additionalProperties": false
},
"def_metadata": {
"type": "object",
"properties": {
"metadata_key": {
"type": "string",
"pattern": "^[a-zA-Z][a-zA-Z0-9_-]*:[A-Za-z0-9._-]+$"
},
"metadata_value": { "type": "string" },
"record_type": { "type": "string", "enum": ["vendor", "product"] },
"record_uuid": { "$ref": "#/definitions/uuid" },
"submitter_name": { "$ref": "#/definitions/nullable_string" },
"submitter_email": { "$ref": "#/definitions/nullable_string" },
"submitted_at": { "$ref": "#/definitions/nullable_timestamp" },
"approved_at": { "$ref": "#/definitions/nullable_timestamp" },
"created_at": { "$ref": "#/definitions/nullable_timestamp" },
"updated_at": { "$ref": "#/definitions/nullable_timestamp" }
},
"required": [
"approved_at",
"created_at",
"metadata_key",
"metadata_value",
"record_type",
"record_uuid",
"submitted_at",
"submitter_email",
"submitter_name",
"updated_at"
],
"additionalProperties": false
},
"def_relationship": {
"type": "object",
"properties": {
"relationship_type": {
"type": "string",
"enum": [
"synonym-of",
"canonical-of",
"renamed-to",
"superseded-by",
"equivalent-to",
"vendor-merge-into",
"derived-from"
]
},
"source_vendor_uuid": {
"anyOf": [
{ "$ref": "#/definitions/uuid" },
{ "type": "null" }
]
},
"source_product_uuid": {
"anyOf": [
{ "$ref": "#/definitions/uuid" },
{ "type": "null" }
]
},
"target_vendor_uuid": {
"anyOf": [
{ "$ref": "#/definitions/uuid" },
{ "type": "null" }
]
},
"target_product_uuid": {
"anyOf": [
{ "$ref": "#/definitions/uuid" },
{ "type": "null" }
]
},
"rationale": { "$ref": "#/definitions/nullable_string" },
"submitter_name": { "$ref": "#/definitions/nullable_string" },
"submitter_email": { "$ref": "#/definitions/nullable_string" },
"submitted_at": { "$ref": "#/definitions/nullable_timestamp" },
"approved_at": { "$ref": "#/definitions/nullable_timestamp" },
"created_at": { "$ref": "#/definitions/nullable_timestamp" },
"updated_at": { "$ref": "#/definitions/nullable_timestamp" }
},
"required": [
"approved_at",
"created_at",
"rationale",
"relationship_type",
"source_product_uuid",
"source_vendor_uuid",
"submitted_at",
"submitter_email",
"submitter_name",
"target_product_uuid",
"target_vendor_uuid",
"updated_at"
],
"additionalProperties": false
}
},
"type": "object",
"properties": {
"format": { "type": "string", "const": "cpe-editor-dataset" },
"version": { "type": "string" },
"exported_at": { "$ref": "#/definitions/timestamp" },
"counts": { "$ref": "#/definitions/def_counts" },
"vendors": {
"type": "array",
"items": { "$ref": "#/definitions/def_vendor" }
},
"products": {
"type": "array",
"items": { "$ref": "#/definitions/def_product" }
},
"cpes": {
"type": "array",
"items": { "$ref": "#/definitions/def_cpe" }
},
"metadata": {
"type": "array",
"items": { "$ref": "#/definitions/def_metadata" }
},
"relationships": {
"type": "array",
"items": { "$ref": "#/definitions/def_relationship" }
},
"proposals": {
"description": "Implementation-specific moderation history. It may be empty and is not required for minimal BCP interoperability.",
"type": "array",
"items": { "type": "object" }
}
},
"required": [
"format",
"version",
"exported_at",
"counts",
"vendors",
"products",
"cpes",
"metadata",
"relationships",
"proposals"
],
"additionalProperties": false
}Field semantics
uuid
A stable UUID identifying a vendor or product record independently of textual names, titles, aliases, and CPE-compatible strings.
Rules:
uuidMUST remain stable across repeated imports of the same normalized vendor or product identity.- Vendor and product UUIDs SHOULD be deterministic UUIDv5 values generated as specified in the UUID generation section.
- A new
uuidMUST NOT be assigned solely because the display title, notes, metadata, or CPE-compatible string changes. - If two records are merged and declared to refer to the same identity, registry policy determines which UUID remains canonical and which becomes deprecated or related through a lifecycle relationship.
name
The normalized machine-oriented name for a vendor or product.
Rules:
nameSHOULD be lowercase where practical.nameSHOULD use stable separators such as underscores or hyphens according to registry policy.nameSHOULD NOT be used as the durable identifier by consumers.- Changes to
nameMUST NOT break UUID-based references.
title
The human-readable display title for a vendor or product.
Rules:
titleMAY preserve capitalization and spacing preferred by the vendor or registry.titleMAY change over time.titleMUST NOT be used as the durable identifier.
vendor_uuid
The UUID of the vendor associated with a product or CPE entry.
Rules:
- In a product record,
vendor_uuidMUST reference an existing vendor record. - In a CPE entry record,
vendor_uuidMUST reference the vendor that corresponds to the vendor component of the CPE string.
product_uuid
The UUID of the product associated with a CPE entry.
Rules:
product_uuidMUST reference an existing product record.- A CPE entry MUST link to both a vendor and a product.
cpe_uri
The full CPE-compatible URI.
Rules:
cpe_uriSHOULD be a CPE 2.3 formatted string.cpe_uriSHOULD be preserved losslessly from the source dataset where possible.- Importers SHOULD match existing CPE entries by
cpe_urifirst.
cpe_name_id
An optional upstream CPE name identifier.
Rules:
cpe_name_idMAY be populated from upstream sources such as NVDcpeNameId.- If
cpe_urimatching fails, importers MAY usecpe_name_idas a secondary matching key. cpe_name_idis not a replacement for vendor and product UUIDs.
deprecated and deprecated_by
Lifecycle controls used when a CPE entry is retired.
Rules:
- Deprecated CPE entries SHOULD remain resolvable.
deprecated_bySHOULD reference a preferred replacement CPE URI or upstream replacement reference when available.
metadata_key
A namespaced key identifying the type of metadata assertion.
Rules:
metadata_keyMUST include a namespace prefix followed by a colon.- GCVE-defined metadata keys MUST use the
gcve:prefix. - Non-GCVE metadata keys MAY use other namespace prefixes.
- Implementations MUST NOT treat unrecognized metadata keys as matching criteria unless explicitly configured to do so.
metadata_value
The value associated with metadata_key.
Rules:
metadata_valueis represented as a string.- Implementations MAY interpret selected GCVE metadata values according to registry policy.
- Descriptive information such as URLs and descriptions SHOULD be represented as metadata.
record_type and record_uuid
These fields identify the target of a metadata assertion.
Rules:
record_typeSHOULD bevendororproduct.record_uuidMUST reference the UUID of the corresponding record type.- Metadata for a vendor MUST use
record_type: "vendor". - Metadata for a product MUST use
record_type: "product".
relationship_type
The typed semantics of a relationship between two records.
Rules:
relationship_typeMUST describe how the source record relates to the target record.- Implementations MUST preserve the direction of relationships.
renamed-toandsuperseded-byare directional.equivalent-tomay be treated as symmetric by consumers, but the stored relationship still has a source and target.
source_vendor_uuid, source_product_uuid, target_vendor_uuid, and target_product_uuid
These fields identify the source and target records for a relationship.
Rules:
- source fields identify the record from which the relationship starts;
- target fields identify the record to which the relationship points;
- unused source and target fields MUST be
null; - vendor-to-vendor relationships use vendor UUID fields;
- product-to-product relationships use product UUID fields.
submitted_at, approved_at, created_at, and updated_at
Audit timestamps for registry operations.
Rules:
submitted_atrecords when an assertion was submitted.approved_atrecords when an assertion was approved for registry use.created_atrecords when the registry object was created.updated_atrecords the latest update to the registry object.- Timestamps SHOULD be represented as ISO 8601 date-time strings.
approved_atandsubmitted_atMAY benullfor imported or unapproved implementation records.
Registry behavior
GCVE operates a registry to support updates, handle synonyms, manage vendors and products, synchronize CPE entries, and synchronize metadata and relationships.
Registry responsibilities
The registry:
- assigns and preserves vendor and product UUIDs;
- generates deterministic UUIDv5 identifiers for imported vendor and product records;
- tracks canonical names and aliases;
- manages synonym and rename relationships;
- supports vendor normalization and vendor lifecycle changes;
- stores CPE-compatible names as CPE entry records;
- records submitter, approval, creation, and update timestamps where applicable;
- exposes updates suitable for synchronization by external systems.
Vendor management
GCVE may maintain a distinct vendor registry, including stable vendor UUIDs.
Vendor management may include:
- normalization of spelling variants;
- company mergers and acquisitions;
- rebranding;
- separation of legal vendor identity from naming conventions used in CPE-compatible strings;
- descriptive metadata such as
gcve:urlandgcve:description.
Product management
GCVE may maintain a distinct product registry, including stable product UUIDs.
Product management may include:
- product renaming;
- historical names;
- community versus vendor-preferred naming;
- imported external identifiers;
- spelling normalization;
- product line consolidation;
- CPE-compatible names attached through CPE entry records.
CPE entry management
CPE entry management may include:
- importing CPE entries from the NVD CPE 2.0 feed;
- importing concrete CPE names from the NVD CPE Match feed;
- parsing CPE 2.3 strings into component fields;
- preserving
cpeNameIdwhen present; - preserving deprecation and replacement information;
- linking each CPE entry to deterministic vendor and product UUIDs.
Synonym handling
GCVE should support synonym management for cases such as:
- vendor aliases;
- product aliases;
- historical names;
- imported external identifiers;
- spelling normalization;
- product line consolidation.
Synonyms should not require changing the stable UUID when the underlying identity is preserved.
Resolution expectations
Given any known UUID or recognized CPE-compatible alias, the registry should be able to return:
- the current canonical vendor or product record;
- the stable UUID;
- known synonyms;
- lifecycle status;
- related metadata records;
- linked CPE entries where available.
Matching behavior
GCVE-BCP-10 does not change the core CPE applicability concept. Matching is still performed using CPE-compatible criteria and version range semantics.
However, GCVE-aware systems may enhance matching by:
- resolving vendor and product synonyms before comparison;
- canonicalizing renamed products;
- dereferencing deprecated records to active replacements;
- preserving provenance and approval state during matching output;
- mapping matched CPE-compatible strings back to stable product and vendor UUIDs.
This improves consistency across datasets that use different but equivalent product or vendor names.
Example registry bundle
The following example shows a cpe-editor-aligned dataset bundle using vendor records, product records, CPE entries, metadata records, and relationships.
{
"counts": {
"cpes": 1,
"metadata": 2,
"products": 1,
"proposals": 0,
"relationships": 1,
"vendors": 2
},
"cpes": [
{
"cpe_name_id": null,
"cpe_uri": "cpe:2.3:a:misp:misp:*:*:*:*:*:*:*:*",
"created_at": "2026-04-26T14:26:30.000000",
"deprecated": false,
"deprecated_by": null,
"edition": "*",
"from_proposal": false,
"language": "*",
"notes": "Imported from NVD CPE 2.0 feed",
"other": "*",
"part": "a",
"product_uuid": "f28e0890-4e1b-59a5-b52c-3e9354071db7",
"sw_edition": "*",
"target_hw": "*",
"target_sw": "*",
"title": "Misp",
"update": "*",
"updated_at": "2026-04-26T14:26:30.000000",
"vendor_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"version": "*"
}
],
"exported_at": "2026-04-26T17:00:00+00:00",
"format": "cpe-editor-dataset",
"metadata": [
{
"approved_at": "2026-04-26T16:37:57.912577",
"created_at": "2026-04-26T16:37:57.919754",
"metadata_key": "gcve:url",
"metadata_value": "https://misp-project.org/",
"record_type": "vendor",
"record_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"submitted_at": "2026-04-26T16:36:55.583569",
"submitter_email": "",
"submitter_name": "",
"updated_at": "2026-04-26T16:37:57.919758"
},
{
"approved_at": "2026-04-26T16:38:01.609044",
"created_at": "2026-04-26T16:38:01.612249",
"metadata_key": "gcve:description",
"metadata_value": "MISP - Threat Intelligence Sharing Platform\r\n\r\nMISP is an open source software solution for collecting, storing, distributing and sharing cyber security indicators and threats about cyber security incidents analysis and malware analysis. MISP is designed by and for incident analysts, security and ICT professionals or malware reversers to support their day-to-day operations to share structured information efficiently.\r\n\r\nThe objective of MISP is to foster the sharing of structured information within the security community and abroad. MISP provides functionalities to support the exchange of information but also the consumption of said information by Network Intrusion Detection Systems (NIDS), LIDS but also log analysis tools, SIEMs.",
"record_type": "vendor",
"record_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"submitted_at": "2026-04-26T16:37:49.951062",
"submitter_email": "",
"submitter_name": "",
"updated_at": "2026-04-26T16:38:01.612251"
}
],
"products": [
{
"created_at": "2026-04-26T14:26:10.000000",
"name": "misp",
"notes": null,
"title": "Misp",
"updated_at": "2026-04-26T14:26:10.000000",
"uuid": "f28e0890-4e1b-59a5-b52c-3e9354071db7",
"vendor_uuid": "536016cd-a314-5880-947a-e465002d0fab"
}
],
"proposals": [],
"relationships": [
{
"approved_at": "2026-04-26T15:00:15.404458",
"created_at": "2026-04-26T15:00:24.654104",
"rationale": "",
"relationship_type": "synonym-of",
"source_product_uuid": null,
"source_vendor_uuid": "536016cd-a314-5880-947a-e465002d0fab",
"submitted_at": "2026-04-26T14:59:36.958957",
"submitter_email": "",
"submitter_name": "",
"target_product_uuid": null,
"target_vendor_uuid": "c759b712-4932-513a-b6a1-f86c0bcc1a5e",
"updated_at": "2026-04-26T15:00:24.654105"
}
],
"vendors": [
{
"created_at": "2026-04-26T14:25:34.846011",
"name": "misp",
"notes": null,
"title": "Misp",
"updated_at": "2026-04-26T14:25:34.846011",
"uuid": "536016cd-a314-5880-947a-e465002d0fab"
},
{
"created_at": "2026-04-26T14:24:53.155776",
"name": "misp-project",
"notes": null,
"title": "Misp Project",
"updated_at": "2026-04-26T14:24:53.155776",
"uuid": "c759b712-4932-513a-b6a1-f86c0bcc1a5e"
}
],
"version": "1"
}Migration considerations
To migrate an existing CPE-based dataset into GCVE-BCP-10:
- preserve existing CPE-compatible strings in
cpes.cpe_uri; - parse CPE 2.3 fields into the corresponding
cpescomponent fields; - assign deterministic UUIDv5 values to vendor records using the UUID generation profile above;
- assign deterministic vendor-scoped UUIDv5 values to product records using the UUID generation profile above;
- preserve upstream
cpeNameIdascpe_name_idwhen available; - preserve upstream deprecation information as
deprecatedanddeprecated_bywhen available; - attach descriptive source information using metadata such as
gcve:sourcewhen needed; - detect aliases and represent them as relationship records;
- identify canonical names where multiple equivalent names exist;
- keep deprecated CPE entries resolvable through
deprecated_by, metadata, or relationship chains.
Migration should prefer stable identity over textual immutability.
Interoperability guidance
Implementations that do not understand GCVE-BCP-10 registry records may ignore fields and records such as:
- vendor and product UUIDs;
- metadata records;
- relationship records;
- approval and submission timestamps;
- submitter fields;
- lifecycle metadata;
- optional proposal history.
As long as CPE-compatible strings stored in cpes.cpe_uri remain valid, interoperability with legacy parsers is preserved at the string level.
Security and integrity considerations
Consumers should not automatically trust synonym, rename, vendor merge, product merge, CPE, or metadata assertions from untrusted sources.
Implementations should consider:
- provenance validation;
- registry authenticity;
- update signing;
- auditability of metadata and relationship changes;
- conflict handling when multiple authorities disagree about canonicalization;
- validation of namespaced metadata keys;
- validation that relationship endpoints reference existing records;
- validation that CPE entry vendor/product links match parsed CPE vendor/product components;
- validation that deterministic UUIDs match the documented UUIDv5 profile before accepting imported records as canonical.
Stable UUIDs reduce ambiguity, but trust still depends on the authority maintaining the registry.
Summary
GCVE-BCP-10 improves CPE operations without discarding CPE compatibility. It introduces:
- deterministic UUIDv5 vendor and product UUIDs;
- a documented namespace hierarchy rooted in
uuid5(NAMESPACE_URL, "GCVE-BCP-10"); - first-class
vendors,products, andcpesrecords aligned withcpe-editor; - namespaced metadata records using keys such as
gcve:urlandgcve:description; - structured synonym, rename, equivalence, and lifecycle relationships;
- registry-based vendor, product, CPE, and lifecycle management;
- audit-oriented submission, approval, creation, and update timestamps.
These extensions make platform identification more durable, auditable, and maintainable in real-world vulnerability and asset management workflows.
Suggested minimal compliance profile
An implementation conforms to the GCVE-BCP-10 minimal profile if it:
- supports CPE-compatible strings;
- exports
format: "cpe-editor-dataset"or can transform losslessly to that shape; - assigns deterministic UUIDv5 values to vendor and product records according to this document;
- stores imported CPE names as
cpesrecords linked to vendor and product UUIDs; - supports metadata records with namespaced metadata keys;
- uses the
gcve:prefix for GCVE-defined metadata keys; - can express at least
synonym-ofandrenamed-torelationships; - preserves deprecated records without breaking resolution.
A full-featured GCVE registry implementation should additionally support:
- vendor normalization;
- product normalization;
- canonical name resolution;
- replacement and deprecation workflows;
- history tracking for metadata and relationship changes;
- synchronization of vendors, products, CPE entries, metadata, and relationships;
- validation of deterministic UUIDv5 values on import.
Acknowledgements
BCP-10 Coordinator
- Alexandre Dulaunoy, CIRCL
Contributions
The GCVE initiative gratefully acknowledges the substantial contributions from the following individuals via [public review](https://discourse.ossbase.org/t/kev-known-exploited-vulnerabilities-potential-format-b cp-07/):
- Jerry Gamblin
- Quentin Jerome
- Contributors during the hackathon.lu