SBOM - Software Bill of Materials
El módulo SBOM genera un documento JSON CycloneDX 1.4 que describe el directorio del plugin y sus dependencias. Es un artefacto estructural exigido por el art. 13 del Reglamento de Ciberresiliencia (CRA) de la UE y aceptado por la mayoría de los consumidores de SBOM (Trivy, Dependency-Track, Grype).
Por qué CycloneDX y no SPDX
Section titled “Por qué CycloneDX y no SPDX”Ambos formatos están ampliamente aceptados. Se eligió CycloneDX 1.4 JSON porque su estructura es más sencilla, lo consumen directamente Trivy y Dependency-Track, y utiliza Package URLs (purl), que están disponibles de forma nativa para Composer y npm.
Configuración
Section titled “Configuración”Vaya a Polski > SBOM. El módulo está activado de forma predeterminada. Para desactivarlo: Polski > Módulos > desmarque “SBOM”.
Fuentes
Section titled “Fuentes”Para cada directorio de destino, el generador lee:
| Archivo | Contenido |
|---|---|
composer.lock | Paquetes PHP (secciones packages y packages-dev) |
package-lock.json | Paquetes JavaScript (mapa packages en node_modules/...) |
| Encabezado del plugin | Nombre y versión (de la constante VERSION) |
El generador se ejecuta únicamente bajo demanda. El JSON no se almacena en caché - la generación para un plugin FREE con alrededor de 100 dependencias tarda menos de 200 ms.
Destinos
Section titled “Destinos”polski- el plugin FREE (WP_PLUGIN_DIR/polskioPolski\PLUGIN_DIR)polski-pro- visible solo cuando PRO está instalado y están definidas las constantesPolski\Pro\PLUGIN_DIR/Polski\Pro\VERSION
Salida
Section titled “Salida”El archivo se sirve con:
Content-Type: application/vnd.cyclonedx+json; charset=utf-8Content-Disposition: attachment; filename="polski-sbom-<version>-<UTC timestamp>.cdx.json"Ejemplo (truncado):
{ "bomFormat": "CycloneDX", "specVersion": "1.4", "serialNumber": "urn:uuid:5a3b....", "version": 1, "metadata": { "timestamp": "2026-04-19T08:30:00+00:00", "tools": [{ "vendor": "WPPoland", "name": "Polski SBOM generator", "version": "1.0" }], "component": { "type": "application", "bom-ref": "wppoland/polski", "name": "polski", "version": "2.1.0", "publisher": "WPPoland" } }, "components": [ { "type": "library", "bom-ref": "composer:woocommerce/woocommerce-blocks", "name": "woocommerce/woocommerce-blocks", "version": "10.8.4", "scope": "required", "licenses": [{ "license": { "id": "GPL-3.0-or-later" } }] } ]}trivy sbom polski-sbom-2.1.0-20260419-083000.cdx.jsonDependency-Track
Section titled “Dependency-Track”- Cree un proyecto en Dependency-Track (uno por plugin).
- Suba el JSON a través de la interfaz o del endpoint
/api/v1/bom. - Conecte el proyecto a una canalización de CI para que cada versión actualice el BOM.
Contexto del CRA
Section titled “Contexto del CRA”El art. 13 del Reglamento de Ciberresiliencia exige a los fabricantes mantener SBOMs de sus productos. Guardar el JSON CycloneDX junto a la versión etiquetada es una forma habitual de cumplir esta obligación. El nombre del archivo incorpora la versión y la marca de tiempo UTC para que los artefactos sean únicos entre versiones.
Permisos
Section titled “Permisos”- Interfaz y descarga:
manage_woocommerce - Nonce:
polski_sbom_download(necesario para la acción POST)
Limitaciones
Section titled “Limitaciones”- Las relaciones de dependencias transitivas (árbol
dependencies) aún no se emiten (solo lista plana) - WordPress en sí no es un componente del BOM (es el entorno de ejecución, no una dependencia empaquetada)
- La versión se obtiene únicamente de las constantes del plugin, no del campo de
composer.json - Sin firma HMAC en el BOM (prevista en PRO)