PQC Status
Guía

Generar un CBOM CycloneDX en CI

Un pipeline práctico: recopilar, fusionar, validar, almacenar y comparar una lista de materiales criptográficos CycloneDX 1.6 en cada build.

· 8 min

Un CBOM CycloneDX (cryptographic bill of materials, lista de materiales criptográficos) es un documento CycloneDX cuyos componentes describen activos criptográficos: algoritmos, protocolos, certificados y material de claves. Generarlo en integración continua es sobre todo una cuestión de fontanería: ejecutar detectores sobre el código fuente, las dependencias, las imágenes de contenedor y los endpoints de prueba, fusionar los resultados en un único documento CycloneDX 1.6, validarlo contra el esquema y, después, almacenarlo y compararlo con el build anterior. La parte difícil es ser honesto sobre lo que un pipeline de build puede ver realmente. Para el concepto en sí, empiece por nuestra introducción al CBOM.

Dónde residen los activos criptográficos en el modelo CycloneDX 1.6

CycloneDX 1.6 introdujo el tipo de componente cryptographic-asset. Cada uno de estos componentes incluye un objeto cryptoProperties, y su campo assetType determina qué grupo de propiedades se aplica. Existen cuatro tipos de activo.

assetTypeGrupo de propiedadesContenido habitual
algorithmalgorithmPropertiesPrimitiva (kem, firma, pke, hash, mac, cifrado por bloques), identificador del conjunto de parámetros, modo, relleno, curva, funciones criptográficas, nivel de seguridad cuántica NIST
certificatecertificatePropertiesNombre del sujeto, nombre del emisor, fechas de validez, formato del certificado, referencias al algoritmo de firma y a la clave pública del sujeto
protocolprotocolPropertiesTipo de protocolo (tls, ssh, ipsec y otros), versión, suites de cifrado con sus identificadores, referencias a los algoritmos utilizados
related-crypto-materialrelatedCryptoMaterialPropertiesClaves, secretos, tokens, resúmenes, vectores de inicialización, con tamaño, estado y fechas de ciclo de vida

Otros dos campos hacen el verdadero trabajo de inventario. El campo oid vincula un algoritmo a su identificador de objeto cuando se conoce. Y en el array dependencies, el campo provides indica que un componente de software implementa un activo criptográfico. Así es como un CBOM responde a la pregunta que realmente formula un auditor: ¿qué aplicación utiliza este algoritmo, y dónde?

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:4e1e1f2a-0000-0000-0000-000000000000",
  "version": 1,
  "metadata": {
    "timestamp": "2026-10-19T06:12:00Z",
    "component": {
      "type": "application",
      "bom-ref": "payments-api@1.42.0",
      "name": "payments-api",
      "version": "1.42.0"
    }
  },
  "components": [
    {
      "type": "cryptographic-asset",
      "bom-ref": "crypto/algorithm/ml-kem-768",
      "name": "ML-KEM-768",
      "cryptoProperties": {
        "assetType": "algorithm",
        "algorithmProperties": {
          "primitive": "kem",
          "parameterSetIdentifier": "768",
          "cryptoFunctions": ["keygen", "encapsulate", "decapsulate"],
          "nistQuantumSecurityLevel": 3
        }
      }
    },
    {
      "type": "cryptographic-asset",
      "bom-ref": "crypto/protocol/tls-1.3",
      "name": "TLS 1.3",
      "cryptoProperties": {
        "assetType": "protocol",
        "protocolProperties": {
          "type": "tls",
          "version": "1.3",
          "cipherSuites": [
            { "name": "TLS_AES_256_GCM_SHA384", "identifiers": ["0x13", "0x02"] }
          ],
          "cryptoRefArray": ["crypto/algorithm/ml-kem-768"]
        }
      }
    }
  ],
  "dependencies": [
    { "ref": "payments-api@1.42.0", "provides": ["crypto/protocol/tls-1.3"] }
  ]
}

ML-KEM es el mecanismo de encapsulación de claves normalizado en NIST FIPS 203; su conjunto de parámetros 768 corresponde a la categoría 3 de seguridad cuántica del NIST. Los componentes de protocolo son donde aparecen los grupos híbridos de intercambio de claves, por ejemplo X25519MLKEM768, cuyo codepoint 0x11EC figura en el registro de parámetros TLS de la IANA.

Detección estática frente a comportamiento observado

Un job de CI ve un repositorio, un lockfile y una imagen. No ve un handshake negociado. Tratar ambas cosas como si fueran lo mismo es la forma más habitual de que un CBOM resulte engañoso.

ActivoLo que un job estático puede establecerLo que solo la observación establece
Llamadas a algoritmos en su propio códigoLos puntos de llamada, con archivo y línea, además de los conjuntos de parámetros escritos como constantesSi esa ruta de código se ejecuta en producción
Bibliotecas criptográficasBiblioteca y versión a partir del lockfile o de la imagen, lo que acota lo posibleQué proveedor o modo FIPS se carga en tiempo de ejecución
Intercambio de claves TLS y suites de cifradoSolo las directivas de los archivos de configuración presentes en el repositorioEl grupo y la suite realmente negociados, incluidos los valores por defecto aguas arriba
CertificadosArchivos de certificado, truststores y keystores incluidos en la imagen, con su validez y algoritmo de firmaLa cadena que sirve un endpoint en producción y los certificados emitidos después del build
Claves y periodos de vidaTamaños declarados, parámetros de rotación en la configuraciónEstado y fechas de las claves guardados en un gestor de claves o HSM
Endpoints de terceros a los que llamaComo mucho, los nombres de hostLo que ofrecen esos endpoints, que usted no controla

Deje constancia de la diferencia en el documento. Mantenga los hechos derivados estáticamente en el propio componente, con la ruta del archivo en las ocurrencias de evidencia del componente, y mantenga los hechos medidos en protocolProperties y certificateProperties, generados por un job de sondeo. Rellene siempre metadata.tools para que el lector sepa qué detector ha afirmado qué.

Esquema de un pipeline

1. Declarar el alcance

Antes de ejecutar cualquier herramienta, decida qué cubre un CBOM: un componente desplegable, una versión, un entorno. Un único archivo que describe doce servicios envejece mal y no se puede comparar de forma útil.

2. Recopilar en paralelo

  1. Análisis del código fuente y de las dependencias: un analizador estático sobre el repositorio y los lockfiles, que emite activos de tipo algoritmo con la ubicación de la evidencia.
  2. Análisis de la imagen o del sistema de archivos: inspeccionar el artefacto generado en busca de bibliotecas criptográficas, paquetes de certificados, keystores y archivos de configuración.
  3. Sondeo de endpoints observados: únicamente contra staging, para confirmar lo que realmente se negocia.
# TLS: does the staging endpoint negotiate a hybrid group?
# requires OpenSSL 3.5 or later for the ML-KEM groups
openssl s_client -connect staging.example.com:443 \
  -groups X25519MLKEM768 </dev/null | grep "Negotiated TLS1.3 group"

# SSH: which key agreement algorithms does this client build support?
ssh -Q kex

# SSH: confirm the server accepts the post-quantum hybrid key agreement
ssh -o KexAlgorithms=mlkem768x25519-sha256 -o BatchMode=yes \
  git@staging.example.com true

El algoritmo mlkem768x25519-sha256 se añadió en OpenSSH 9.9 y pasó a ser el acuerdo de claves por defecto en OpenSSH 10.0, según las notas de versión de OpenSSH. Sondee staging, nunca producción, y mantenga un respaldo clásico como X25519 después del grupo híbrido en cada configuración de servidor que modifique.

3. Fusionar, sellar y validar

Fusione los documentos parciales en uno solo y haga fallar el job si el resultado no es válido según el esquema. La CLI de CycloneDX hace ambas cosas.

cyclonedx merge \
  --input-files static.cbom.json image.cbom.json observed.cbom.json \
  --output-file cbom.json

cyclonedx validate --input-file cbom.json --fail-on-errors

Selle metadata.timestamp, la versión del componente y el SHA del commit. Un CBOM sin procedencia es una opinión.

Almacenar y comparar el CBOM

Publique el archivo como artefacto de build para la trazabilidad y conserve una copia normalizada por componente en un repositorio dedicado o en un servidor de BOM, de modo que el historial se pueda consultar. La normalización importa más que el almacenamiento: ordene los componentes, utilice valores bom-ref estables que no contengan el número de build y excluya la marca de tiempo de la comparación. De lo contrario, cada build parecerá un cambio.

# extract a stable, sorted view of the cryptographic assets
jq -S '[.components[]
       | select(.type == "cryptographic-asset")
       | {name, assetType: .cryptoProperties.assetType,
          primitive: .cryptoProperties.algorithmProperties.primitive}]
       | sort_by(.name)' cbom.json > current.view.json

diff -u previous.view.json current.view.json

A continuación, decida qué significa una diferencia. Controles útiles, en orden de gravedad creciente: aparece un activo nuevo que ningún build anterior declaraba; aparece un algoritmo de clave pública vulnerable a la computación cuántica en un componente que antes no tenía ninguno; aparece en cualquier lugar un grupo preestándar obsoleto, como un grupo TLS de borrador de Kyber; desaparece un grupo híbrido de un servicio que lo tenía. Empiece emitiendo avisos, no fallos, hasta comprender el ruido de los detectores. Esta comparación es la parte medible de la agilidad criptográfica: muestra si su superficie criptográfica cambia de forma intencionada o por accidente.

Límites que conviene dejar por escrito

Qué acredita un CBOM generado en CI

Varios textos exigen un inventario de la criptografía en uso. El requisito 12.3.3 de PCI DSS v4.0.1 exige que las suites de cifrado y los protocolos en uso se documenten y revisen al menos cada 12 meses, incluido dónde se utilizan y una estrategia documentada ante cambios previstos en las vulnerabilidades criptográficas, y es obligatorio desde el 31 de marzo de 2025 (biblioteca de documentos del PCI SSC). DORA, mediante el Reglamento Delegado (UE) 2024/1774 de la Comisión, exige en su artículo 6 una política de cifrado con disposiciones para actualizar o cambiar la tecnología criptográfica a medida que evoluciona el criptoanálisis, y en su artículo 7 la gestión de claves a lo largo de todo su ciclo de vida, además de un registro de certificados para los activos de TIC que respaldan funciones críticas o importantes (EUR-Lex). Para las agencias federales de EE. UU., el memorando OMB M-26-15 exige un inventario criptográfico automatizado y actualizado de forma continua (M-26-15). La hoja de ruta de implementación coordinada de la UE v1.1 incluye un inventario criptográfico entre los primeros pasos antes de finales de 2026, como orientación coordinada para los Estados miembros y no como un reglamento vinculante para las empresas.

Nuestra interpretación, claramente identificada como tal: ninguno de estos textos menciona CycloneDX, y un CBOM es una forma práctica de elaborar y mantener dicho inventario, no un formato obligatorio. Genere el archivo porque abarata la próxima decisión de migración y, después, vincúlelo a la obligación que corresponda. Esto es información, no asesoramiento jurídico.

Siguiente paso: contrastar el CBOM con la realidad

Un CBOM generado en CI le indica lo que contiene su build. No puede indicarle lo que negocian sus servidores. Cierre esa brecha probando los propios endpoints: analice su dominio con PQC Status para ver los grupos híbridos ML-KEM, las versiones de TLS y la cadena de certificados que se ofrecen realmente a un cliente, e incorpore después esos valores observados a protocolProperties y certificateProperties de su próximo CBOM, para que el documento refleje tanto el código como el comportamiento.

Preguntas frecuentes

¿Qué versión de CycloneDX necesito para describir activos criptográficos?

CycloneDX 1.6 es la primera versión con el tipo de componente cryptographic-asset y el objeto cryptoProperties. También añadió el campo provides en el array dependencies, que vincula un componente de software con los activos criptográficos que implementa. Las versiones anteriores solo pueden aproximarse a esto mediante propiedades genéricas.

¿Puede un pipeline de CI por sí solo generar un inventario criptográfico completo?

No. El análisis estático del código fuente, las dependencias y las imágenes muestra lo que es posible, no lo que se ejecuta: la configuración resuelta en tiempo de ejecución, los proxies aguas arriba y los endpoints de terceros siguen siendo invisibles. Combine el CBOM estático con datos observados procedentes de sondeos de endpoints y de sus sistemas de gestión de claves y certificados. Deje constancia explícita de los ámbitos que no se han cubierto.

¿Con qué frecuencia debería regenerarse el CBOM?

Genérelo en cada build, ya que el coste es prácticamente nulo una vez que existe el pipeline y el valor proviene de la comparación entre builds. Las obligaciones de revisión son otra cuestión: el requisito 12.3.3 de PCI DSS v4.0.1 exige una documentación revisada al menos cada 12 meses, y OMB M-26-15 exige a las agencias federales de EE. UU. un inventario automatizado y actualizado de forma continua.

¿Cumple un CBOM por sí solo un requisito normativo?

Un CBOM es un formato, y ningún texto de los que seguimos lo menciona. PCI DSS, las RTS de DORA y la hoja de ruta de la UE exigen un inventario, una política y, en virtud del artículo 7 de DORA, un registro de certificados. Un CBOM es una forma práctica de acreditar la parte del inventario, lo cual es nuestra interpretación y no una certificación. Esto es información, no asesoramiento jurídico.