Generar un SBOM para el CRA: herramientas, formatos, CI/CD
Guía práctica para generar un SBOM para el cumplimiento del CRA: herramientas de código abierto, elección de formato e integración automatizada en pipelines.
En este artículo
- Resumen
- Lo que el CRA realmente requiere
- Selección de formato: CycloneDX vs SPDX
- Herramientas de generación de SBOM de código abierto
- Integración CI/CD
- Calidad del SBOM: cumplir TR-03183
- Mantener los SBOMs actualizados
- Errores comunes
- Lista de verificación de implementación de SBOM
- Preguntas frecuentes
- Próximos pasos
El CRA requiere una lista de componentes de software. Todos los artículos de la competencia te dicen esto. Ninguno te muestra cómo generar uno.
Esta guía cubre herramientas de código abierto, selección de formatos e integración CI/CD, sin dependencia de proveedores.
Resumen
- El CRA requiere SBOMs legibles por máquina que cubran «al menos las dependencias de nivel superior»
- Formatos recomendados: CycloneDX 1.4+ o SPDX 2.3+ (según BSI TR-03183)
- Herramientas de código abierto: Syft (imágenes/sistemas de archivos), Trivy (contenedores), cdxgen (código fuente)
- Integra la generación de SBOM en CI/CD para actualizaciones automáticas
- La calidad importa: los campos mínimos incluyen nombre del paquete, versión, proveedor, hash, licencia
Pipeline CI/CD de SBOM
Automatiza las seis etapas para que cada lanzamiento produzca un SBOM nuevo y firmado.
El commit activa el pipeline en el merge a main o en el push de una etiqueta de versión.
La imagen de contenedor o el binario se ensambla a partir de dependencias bloqueadas.
Syft, Trivy o cdxgen escanea el artefacto y produce un archivo CycloneDX o SPDX.
Cosign firma el archivo SBOM y produce un bundle sigstore con la firma y el certificado.
El SBOM se archiva en los artefactos de CI o se sube a CRA Evidence junto a la etiqueta del lanzamiento.
El SBOM almacenado se reescanea con nuevas CVE; las alertas se activan cuando nuevas vulnerabilidades coinciden con componentes.
Lo que el CRA realmente requiere
Empecemos con lo que dice el Reglamento. El Anexo I, Parte II del CRA exige que los fabricantes:
«identificarán y documentarán las vulnerabilidades y los componentes presentes en el producto con elementos digitales, también mediante la elaboración de una nomenclatura de materiales de los programas informáticos en un formato comúnmente utilizado y legible por máquina, que incluya, como mínimo, las dependencias de máximo nivel del producto»
Puntos clave:
- Formato legible por máquina: no un PDF, no una hoja de cálculo, sino datos estructurados
- Al menos dependencias de nivel superior: el alcance mínimo, aunque más es mejor
- No se requiere que sea público: se proporciona a las autoridades bajo petición
- Debe actualizarse: con cada lanzamiento, parche o cambio de componente
El CRA no exige un formato específico, pero los esfuerzos de estandarización apuntan claramente a CycloneDX y SPDX.
El SBOM forma parte de la documentación técnica del CRA bajo el Anexo VII. Los fabricantes deben elaborar esa documentación antes de introducir un producto en el mercado y mantenerla a disposición de las autoridades de vigilancia del mercado durante al menos 10 años, o durante el período de soporte, el plazo que sea mayor (Art. 13(13)). Un SBOM almacenado localmente sin vínculo con una versión específica del producto no satisface este requisito. Debe ser recuperable, versionado y vinculado a la versión del producto que describe.
Selección de formato: CycloneDX vs SPDX
Dos formatos dominan el panorama de SBOM. Ambos son aceptables para el cumplimiento del CRA.
CycloneDX
Origen: proyecto OWASP, orientado a la seguridad Versión actual: 1.6 (1.4+ recomendado para CRA) Mejor para: seguridad y gestión de vulnerabilidades
Puntos fuertes:
- Soporte nativo de VEX (Vulnerability Exploitability eXchange)
- Diseñado para casos de uso de seguridad
- Especificación más ligera, más fácil de implementar
- Ecosistema de herramientas sólido
- Vinculación directa con CVE/vulnerabilidades
Ejemplo JSON:
{
"bomFormat": "CycloneDX",
"specVersion": "1.5",
"version": 1,
"components": [
{
"type": "library",
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21",
"hashes": [
{
"alg": "SHA-256",
"content": "cc6d..."
}
],
"licenses": [
{
"license": {
"id": "MIT"
}
}
]
}
]
}
SPDX
Origen: Linux Foundation, orientado al cumplimiento de licencias Versión actual: 2.3; ISO/IEC 5962:2021 estandarizó SPDX 2.2.1 Mejor para: cumplimiento de licencias y revisión legal
Puntos fuertes:
- Estándar internacional ISO
- Sintaxis completa de expresión de licencias
- Sólido en contextos de cumplimiento de código abierto
- Mayor trayectoria
- Mejor para escenarios de licencias complejas
Ejemplo JSON:
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "my-application",
"packages": [
{
"SPDXID": "SPDXRef-Package-lodash",
"name": "lodash",
"versionInfo": "4.17.21",
"downloadLocation": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"licenseConcluded": "MIT",
"checksums": [
{
"algorithm": "SHA256",
"checksumValue": "cc6d..."
}
]
}
]
}
¿Cuál elegir?
| Caso de uso | Recomendación |
|---|---|
| Enfoque principal en seguridad/vulnerabilidades | CycloneDX |
| Enfoque principal en cumplimiento de licencias | SPDX |
| Necesitas integración VEX | CycloneDX |
| Empresa con herramientas SPDX existentes | SPDX |
| Mercado alemán (BSI TR-03183) | Cualquiera (ambos recomendados) |
| Empezando desde cero, sin preferencia | CycloneDX (más simple, orientado a seguridad) |
Para el cumplimiento del CRA, cualquier formato funciona. Elige uno y sé coherente.
Herramientas de generación de SBOM de código abierto
Sin dependencia de proveedores requerida. Estas herramientas son gratuitas, de código abierto y listas para producción.
Syft (Anchore)
Mejor para: imágenes de contenedores, sistemas de archivos, archivos comprimidos Licencia: Apache 2.0 Formatos de salida: CycloneDX, SPDX, Syft JSON
Instalación:
# Linux/macOS
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
# Homebrew
brew install syft
# Docker
docker pull anchore/syft
Ejemplos de uso:
# Escanear una imagen de contenedor
syft alpine:latest -o cyclonedx-json > sbom.cdx.json
# Escanear un directorio
syft dir:/ruta/al/proyecto -o cyclonedx-json > sbom.cdx.json
# Escanear un archivo comprimido
syft /ruta/al/archivo.tar.gz -o spdx-json > sbom.spdx.json
# Escanear con catalogadores específicos (p. ej., solo Python)
syft dir:. -o cyclonedx-json --select-catalogers python
Ecosistemas soportados: Python, Node.js, Ruby, Java, Go, Rust, PHP, .NET y más.
Trivy (Aqua Security)
Mejor para: imágenes de contenedores con contexto de vulnerabilidades integrado Licencia: Apache 2.0 Formatos de salida: CycloneDX, SPDX, más informes de vulnerabilidades
Instalación:
# Linux (Debian/Ubuntu)
sudo apt-get install trivy
# macOS
brew install trivy
# Docker
docker pull aquasec/trivy
Ejemplos de uso:
# Generar SBOM desde imagen de contenedor
trivy image --format cyclonedx --output sbom.cdx.json alpine:latest
# Generar SBOM desde sistema de archivos
trivy fs --format cyclonedx --output sbom.cdx.json /ruta/al/proyecto
# Generar SBOM con información de vulnerabilidades
trivy image --format cyclonedx --output sbom.cdx.json \
--scanners vuln nginx:latest
Ventaja: Trivy puede generar SBOMs y escanear vulnerabilidades en un solo paso.
cdxgen (CycloneDX)
Mejor para: análisis de código fuente en muchos lenguajes Licencia: Apache 2.0 Formato de salida: CycloneDX
Instalación:
# npm (requiere Node.js)
npm install -g @cyclonedx/cdxgen
# Docker
docker pull ghcr.io/cyclonedx/cdxgen
Ejemplos de uso:
# Escanear directorio actual
cdxgen -o sbom.json
# Escanear tipo de proyecto específico
cdxgen -t python -o sbom.json
# Escanear con resolución profunda de dependencias
cdxgen --deep -o sbom.json
# Escanear un directorio concreto
cdxgen -o sbom.json /ruta/al/proyecto
Lenguajes soportados: JavaScript, Python, Java, Go, Rust, PHP, Ruby, .NET, C/C++ y más.
Comparativa de herramientas
| Característica | Syft | Trivy | cdxgen |
|---|---|---|---|
| Imágenes de contenedor | Excelente | Excelente | Bueno |
| Código fuente | Bueno | Bueno | Excelente |
| Escaneo de sistema de archivos | Excelente | Bueno | Bueno |
| Escaneo de vulnerabilidades | No (usa Grype) | Sí | No |
| Salida CycloneDX | Sí | Sí | Sí |
| Salida SPDX | Sí | Sí | No |
| Velocidad | Rápido | Medio | Medio |
| Cobertura de lenguajes | Muy amplia | Amplia | Muy amplia |
Recomendación: empieza con Syft para la mayoría de los casos. Añade Trivy si necesitas escaneo de vulnerabilidades integrado. Usa cdxgen para proyectos de código fuente complejos.
Firmware y dispositivos embebidos
Las herramientas anteriores funcionan bien para contenedores y gestores de paquetes. Para firmware y dispositivos embebidos (el objetivo principal del CRA), el enfoque es distinto.
Las imágenes de firmware son blobs binarios, no registros de paquetes. El primer paso habitual es extraer el sistema de archivos:
# Extraer el sistema de archivos desde una imagen de firmware
binwalk -Me firmware.bin
# Ejecutar Syft sobre el sistema de archivos extraído
syft dir:_firmware.bin.extracted/squashfs-root -o cyclonedx-json > sbom.cdx.json
Usa binwalk -Me (extracción recursiva) en lugar de -e para imágenes anidadas o comprimidas. La cobertura será menor que para imágenes de contenedor. Los binarios compilados sin símbolos pierden información, y Syft puede no identificar todos los componentes.
Para el análisis a nivel binario de componentes compilados, BLint, cve-bin-tool o EMBA ofrecen una inspección más profunda. Los SDK propietarios y las bibliotecas de código cerrado integradas en el firmware suelen requerir entradas manuales en el SBOM. Documenta el proveedor, la versión y la URL de origen.
Integración CI/CD
La generación manual de SBOM no escala. Intégrala en tu pipeline de compilación.
GitHub Actions
name: Generación de SBOM
on:
push:
branches: [main]
release:
types: [published]
jobs:
sbom:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # necesario para la firma sin clave con Cosign
steps:
- name: Checkout código
uses: actions/checkout@v4
- name: Compilar imagen de contenedor
run: |
docker build -t myapp:${{ github.sha }} .
- name: Instalar Syft
run: |
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
- name: Generar SBOM desde imagen compilada
run: |
syft myapp:${{ github.sha }} -o cyclonedx-json > sbom.cdx.json
- name: Instalar Cosign
uses: sigstore/cosign-installer@v3
- name: Firmar SBOM (sin clave)
run: |
cosign sign-blob sbom.cdx.json --bundle sbom.cdx.json.sigstore.json --yes
- name: Subir SBOM y firma como artefactos
uses: actions/upload-artifact@v4
with:
name: sbom
path: |
sbom.cdx.json
sbom.cdx.json.sigstore.json
retention-days: 90
# Opcional: subir a CRA Evidence para almacenamiento de cumplimiento a largo plazo
- name: Subir a CRA Evidence
if: github.event_name == 'release'
env:
CRA_EVIDENCE_TOKEN: ${{ secrets.CRA_EVIDENCE_TOKEN }}
run: |
curl -X POST https://api.craevidence.com/api/v1/ci/sbom \
-H "Authorization: Bearer $CRA_EVIDENCE_TOKEN" \
-F "file=@sbom.cdx.json" \
-F "product_id=${{ vars.PRODUCT_ID }}" \
-F "version=${{ github.ref_name }}"
Nota: el artefacto de CI (retention-days: 90) es para comodidad del desarrollador. Para la retención conforme al CRA durante 10 años, sube a un almacén dedicado de largo plazo en cada lanzamiento. Consulta la sección Retención más abajo.
GitLab CI
generate-sbom:
stage: build
image: anchore/syft:latest
script:
- syft dir:. -o cyclonedx-json > sbom.cdx.json
artifacts:
paths:
- sbom.cdx.json
expire_in: 90 days
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_TAG
Jenkins
pipeline {
agent any
stages {
stage('Generar SBOM') {
steps {
sh '''
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b .
./syft dir:. -o cyclonedx-json > sbom.cdx.json
'''
}
}
stage('Archivar SBOM') {
steps {
archiveArtifacts artifacts: 'sbom.cdx.json', fingerprint: true
}
}
}
}
Integración en el proceso de Docker
Genera el SBOM durante la compilación de Docker:
# Compilación multietapa con generación de SBOM
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Generar SBOM en la etapa de compilación
FROM anchore/syft:latest AS sbom
COPY --from=builder /app /app
RUN syft dir:/app -o cyclonedx-json > /sbom.cdx.json
# Imagen final
FROM node:20-slim
COPY --from=builder /app/dist /app
COPY --from=sbom /sbom.cdx.json /app/sbom.cdx.json
CMD ["node", "/app/index.js"]
Firma del SBOM
El CRA no exige la firma del SBOM, pero la firma certifica que el SBOM no ha sido modificado desde su generación. Los equipos de aprovisionamiento empresarial y los organismos notificados esperan cada vez más una firma verificable junto al archivo SBOM.
Cosign (parte del proyecto Sigstore) es la herramienta estándar:
# Instalar Cosign
brew install cosign
# Firmar un archivo SBOM. Produce un bundle con la firma y el certificado
cosign sign-blob sbom.cdx.json --bundle sbom.cdx.json.sigstore.json
# Verificar más tarde
cosign verify-blob sbom.cdx.json --bundle sbom.cdx.json.sigstore.json \
--certificate-identity <tu-identidad> \
--certificate-oidc-issuer <tu-emisor>
Guarda sbom.cdx.json y sbom.cdx.json.sigstore.json juntos. El bundle contiene la firma, el certificado de firma y la entrada en el registro de transparencia Rekor. Cualquier persona con el bundle puede verificar el SBOM sin necesidad de contactarte.
Para CI/CD, Cosign soporta firma sin clave mediante la identidad OIDC del pipeline (GitHub Actions, GitLab CI). Sin claves que gestionar. El ejemplo de GitHub Actions anterior ya incluye esto: el job necesita el permiso id-token: write, y sign-blob admite --yes para ejecutarse sin interacción. Cosign 2.0 y posteriores hacen que la firma sin clave sea el comportamiento por defecto, así que el indicador COSIGN_EXPERIMENTAL ya no es necesario.
Monitorización continua
Un SBOM firmado y almacenado no es la meta final. Se detectan nuevas vulnerabilidades contra componentes que estaban limpios en el momento del lanzamiento. El SBOM almacenado debe reescanearse de forma periódica para que esas CVE salgan a la superficie.
Grype lee un SBOM existente directamente, por lo que el reescaneo no necesita el entorno de compilación original:
name: Reescaneo de SBOM
on:
schedule:
- cron: "0 6 * * 1" # Semanal, lunes 06:00 UTC
jobs:
rescan:
runs-on: ubuntu-latest
steps:
- name: Obtener el SBOM almacenado
env:
SBOM_URL: ${{ vars.SBOM_URL }}
run: |
curl -sSfL -o sbom.cdx.json "$SBOM_URL"
- name: Instalar Grype
run: |
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
- name: Escanear el SBOM en busca de nuevas CVE
run: |
grype sbom:./sbom.cdx.json
CRA Evidence ejecuta este reescaneo automáticamente para cada SBOM subido y te avisa cuando una nueva CVE coincide con un componente, lo que cubre la misma necesidad sin un job programado.
Calidad del SBOM: cumplir TR-03183
La guía técnica alemana BSI TR-03183 extiende los elementos mínimos de NTIA. Aunque no es legalmente exigible en toda la UE, seguir TR-03183 garantiza SBOMs de alta calidad.
Campos requeridos
| Campo | Requerido por | Notas |
|---|---|---|
| Nombre del componente | NTIA + TR-03183 | Identificador del paquete |
| Versión | NTIA + TR-03183 | Cadena de versión exacta |
| Proveedor | NTIA + TR-03183 | Vendedor o mantenedor |
| Identificador único | NTIA + TR-03183 | PURL recomendado |
| Relación de dependencia | NTIA + TR-03183 | Directa vs transitiva |
| Autor del SBOM | NTIA + TR-03183 | Quién creó el SBOM |
| Marca de tiempo | NTIA + TR-03183 | Cuándo se creó el SBOM |
| Valores hash | TR-03183 | SHA-256 mínimo |
| Licencia | TR-03183 | ID de licencia SPDX |
| Repositorio fuente | TR-03183 | URL de VCS si está disponible |
Validar la calidad del SBOM
Usa estas herramientas para comprobar tu SBOM:
# Validar formato CycloneDX
npm install -g @cyclonedx/cyclonedx-cli
cyclonedx validate --input-file sbom.cdx.json
# Comprobar campos mínimos con jq
jq '.components[] | select(.version == null or .purl == null)' sbom.cdx.json
# Contar componentes con hashes
jq '[.components[] | select(.hashes != null)] | length' sbom.cdx.json
Mejorar la calidad del SBOM
Si tu SBOM carece de datos:
- Usa archivos de bloqueo:
package-lock.json,Pipfile.lock,go.sumcontienen más metadatos - Escanea artefactos compilados: más completo que los escaneos solo del código fuente
- Combina herramientas: distintas herramientas encuentran distintos componentes
- Añade entradas manuales: para componentes comerciales o internos
Mantener los SBOMs actualizados
Un SBOM es una instantánea. Debe actualizarse para seguir siendo útil.
Cuándo regenerar
- En cada lanzamiento (mayor, menor, parche)
- Tras actualizaciones de dependencias
- Tras parches de seguridad
- Cuando cambia la configuración de compilación
Estrategia de versioning
producto-v1.0.0-sbom.cdx.json
producto-v1.0.1-sbom.cdx.json
producto-v1.1.0-sbom.cdx.json
O usando marcas de tiempo:
producto-sbom-2026-01-15T10-30-00Z.cdx.json
Retención
El artículo 13(13) exige que los fabricantes mantengan la documentación técnica a disposición de las autoridades de vigilancia del mercado durante al menos 10 años desde que el producto se introduce en el mercado, o durante el período de soporte, el plazo que sea mayor. El SBOM forma parte de esa documentación, por lo que el mismo plazo se le aplica.
La retención del artefacto de CI (90 días en los ejemplos anteriores) es para comodidad del desarrollador, no para cumplimiento. El requisito de 10 años necesita un almacén dedicado de largo plazo. CRA Evidence está diseñado específicamente para ello: almacenamiento versionado de SBOMs con reescaneo de vulnerabilidades y exportación de archivos técnicos, vinculado a cada lanzamiento del producto.
Si prefieres alojarlo tú mismo, cualquier almacén de objetos principal funciona una vez que activas los controles adecuados:
| Almacén de objetos | Controles a activar |
|---|---|
| Amazon S3 | Control de versiones, políticas de ciclo de vida, Object Lock, controles de acceso |
| Azure Blob Storage | Políticas de inmutabilidad, gestión de niveles de acceso |
| Google Cloud Storage | Políticas de retención, control de versiones de objetos |
Una política de ciclo de vida sola no basta. El almacén también debe soportar control de versiones, controles de acceso e idealmente inmutabilidad para satisfacer los requisitos de auditoría.
Errores comunes
Generación puntual del SBOM
Problema: crear un SBOM una sola vez y no actualizarlo.
Solución: automatiza la generación de SBOM en CI/CD. Cada compilación debe producir un SBOM nuevo.
Dependencias transitivas ausentes
Problema: el SBOM solo lista las dependencias directas, sin los paquetes anidados.
Solución: usa archivos de bloqueo, escanea artefactos compilados, activa las opciones de escaneo profundo.
Versión de formato incorrecta
Problema: usar CycloneDX 1.3 cuando TR-03183 recomienda 1.4+.
Solución: comprueba la versión de salida de tu herramienta. Actualiza las herramientas con regularidad.
Sin valores hash
Problema: los componentes sin hashes criptográficos no se pueden verificar.
Solución: asegúrate de que tu herramienta incluye hashes. Syft y Trivy añaden hashes SHA-256 cuando pueden leer los archivos del componente.
Creación manual
Problema: crear SBOMs a mano es propenso a errores e insostenible.
Solución: automatiza siempre. Las entradas manuales solo para componentes que las herramientas no detectan.
Ignorar los componentes internos
Problema: documentar solo las dependencias de código abierto, no el código propietario.
Solución: los componentes internos también necesitan documentación. Añádelos manualmente o configura las herramientas adecuadamente.
Lista de verificación de implementación de SBOM
- CycloneDX 1.4+ o SPDX 2.3+ elegido.
- Formato JSON seleccionado (legible por máquina, no PDF ni hoja de cálculo).
- Decisión de formato documentada para el equipo.
Cualquier formato satisface el CRA. BSI TR-03183 recomienda ambos. Cambiar de formato a mitad del ciclo de vida del producto es costoso, así que decide antes del primer lanzamiento.
- Herramienta principal seleccionada: Syft, Trivy o cdxgen.
- Herramienta instalada y probada localmente contra un artefacto real.
- Salida validada contra el esquema de CycloneDX o SPDX.
Elige la herramienta según el artefacto. La tabla de comparativa muestra la mejor opción para contenedores, árboles de código fuente e imágenes de firmware.
- Generación de SBOM añadida al pipeline de compilación.
- Artefactos almacenados con política de retención adecuada.
- Generación activada en cada etiqueta de lanzamiento, no solo en los pushes a la rama principal.
Un lanzamiento sin SBOM correspondiente es un vacío de cumplimiento desde el primer día. Integra la generación en el pipeline para que el paso no se pueda omitir.
- Todos los componentes tienen nombre, versión y proveedor.
- Valores hash presentes en cada componente (SHA-256 mínimo).
- Información de licencia incluida con identificadores de licencia SPDX.
- Dependencias transitivas capturadas, no solo las directas.
- Identificadores PURL usados para cada paquete.
Ejecuta cyclonedx validate y comprueba los hashes ausentes con jq '[.components[] | select(.hashes == null)] | length'.
- SBOM versionado y nombrado junto al lanzamiento del producto que describe.
- SBOMs históricos archivados con política de retención de 10 años.
- Proceso documentado para que cualquier miembro del equipo pueda regenerarlo a demanda.
La retención es una obligación legal, no una tarea de mantenimiento. Mantén cada SBOM histórico vinculado al lanzamiento que describe durante todo el período.
- Token de API configurado en los secretos de CI.
- Subida de SBOM automatizada en el lanzamiento vía CLI o API.
- Puntuación de calidad TR-03183 revisada tras la primera subida.
CRA Evidence automatiza el reescaneo de vulnerabilidades, la puntuación de calidad y la exportación del expediente técnico con SBOMs integrados.
Preguntas frecuentes
¿El CRA exige un formato de SBOM específico?
No. El CRA exige un formato legible por máquina, pero no impone CycloneDX ni SPDX por su nombre. Ambos formatos satisfacen el Reglamento. BSI TR-03183 recomienda explícitamente CycloneDX 1.4+ o SPDX 2.3+, y cualquiera de los dos es una elección defendible ante los auditores. Elige uno y úsalo de forma coherente en todos los lanzamientos.
¿Hay que incluir las dependencias transitivas?
El texto del CRA dice «al menos las dependencias de nivel superior». Ese es el mínimo legal. BSI TR-03183 recomienda cobertura transitiva completa, y es lo que las autoridades y los clientes esperan cada vez más en la práctica. Escanear artefactos compilados en lugar de manifiestos de código fuente es la forma más sencilla de capturar el árbol de dependencias completo de forma automática.
¿El SBOM tiene que ser público?
No. El CRA no exige divulgación pública. Debes poder proporcionar el SBOM a las autoridades de vigilancia del mercado bajo petición. Compartirlo con clientes o publicarlo abiertamente es opcional y una decisión comercial. Muchos fabricantes proporcionan SBOMs a clientes empresariales como parte de la contratación.
¿Con qué frecuencia hay que actualizar el SBOM?
El CRA no establece una cadencia de calendario. Cada versión del producto debe tener un SBOM actualizado. En la práctica, eso significa regenerar en cada lanzamiento, tras actualizaciones de dependencias, tras parches de seguridad y cuando cambia la configuración de compilación. Automatizar la generación de SBOM en CI/CD convierte esto en automático en lugar de un paso manual que puedes olvidar.
¿Es suficiente un package.json o requirements.txt?
No. Los manifiestos de código fuente no son SBOMs. Un SBOM conforme al CRA debe estar en un formato estructurado legible por máquina (CycloneDX o SPDX), incluir hashes criptográficos para cada componente y reflejar el artefacto compilado en lugar del árbol de código fuente. Un package.json lista las dependencias previstas; un SBOM CycloneDX desde una imagen de contenedor escaneada documenta lo que realmente se ha distribuido.
¿Cuánto tiempo hay que conservar los SBOMs?
Los fabricantes deben conservar la documentación técnica durante al menos 10 años desde que el producto se introduce en el mercado, o durante el período de soporte, el plazo que sea mayor. El SBOM forma parte de esa documentación, así que el plazo de conservación se le aplica igualmente. (Art. 13(13).)
¿Qué hacer si un componente no tiene PURL ni hash?
Añádelo manualmente. Las herramientas omiten los SDK comerciales, las bibliotecas propietarias y los componentes internos que no aparecen en los registros de paquetes públicos. Una entrada manual en el SBOM es válida según el CRA. Un componente no documentado no lo es. Para los componentes de los que no puedes calcular un hash directamente, documenta al menos la ubicación de la fuente y la cadena de versión, y anota el vacío en tu expediente técnico.
Requisitos: comprende lo que el CRA requiere para SBOMs en nuestra guía de requisitos SBOM.
Calidad: valida tu SBOM contra el estándar BSI TR-03183.
VEX: añade contexto de vulnerabilidades a tu SBOM con documentos VEX.
Este artículo es solo para fines informativos y no constituye asesoramiento legal. Para orientación específica sobre cumplimiento, consulta con asesores legales cualificados familiarizados con las regulaciones de productos de la UE.
Artículos Relacionados
ENISA e IA de frontera: 5 consecuencias para el CRA
CRA para fabricantes alemanes: BSI, CERT-Bund y marcado CE
¿Se aplica el CRA a tu producto?
Responde 6 preguntas sencillas para saber si tu producto está dentro del ámbito del Reglamento de Ciberresiliencia de la UE. Obtén tu resultado en menos de 2 minutos.
¿Listo para lograr el cumplimiento del CRA?
Empieza a gestionar tus SBOMs y documentación de cumplimiento con CRA Evidence.