Read in English · Lire en français · Auf Deutsch lesen
Sección 8.6 de 8.8 · Intermedio · 23 min de lectura
Seguridad de la cadena de suministro de software
Videolección
5 min · narrado en inglés, con subtítulosSolo escuchar (audio)
Leer la transcripción
La mayor parte del código de un servicio moderno no la escribió el equipo que lo opera. Esta lección muestra por qué todo aquello sobre lo que construyes forma parte de tu superficie de ataque, y cómo reducen ese riesgo los arquitectos.
Un restaurante no cultiva su propia harina. Confía en sus proveedores. Si la harina de un proveedor está contaminada, todos los restaurantes que la compraron se ven afectados, por limpia que esté su propia cocina. Por eso los buenos restaurantes llevan una lista de cada ingrediente y de su origen. Compran a proveedores que precintan y etiquetan sus entregas, y comprueban los precintos al recibirlas. El software se construye igual, a partir de cientos de componentes escritos por otras personas y ensamblados por máquinas de compilación.
Esta es la cadena: un desarrollador, el repositorio de código, el sistema de compilación, un registro que guarda el resultado, y el despliegue. Cada flecha es una relación de confianza, y cada incidente famoso abusó de una distinta. Las dependencias de código abierto alimentan la compilación. En 2018, un paquete popular llamado event-stream se cedió a un voluntario, que añadió una dependencia maliciosa. En 2021, Log4Shell fue un defecto honesto pero grave en una biblioteca de logging enterrada en lo profundo de innumerables sistemas. En 2024, el ataque a xz utils llegó a través del código fuente y del proceso de lanzamiento. Tras unos dos años de contribuciones pacientes y útiles, un comantenedor entregó archivos de la versión que contenían una puerta trasera oculta. Se detectó pronto. En 2020, unos atacantes dentro de SolarWinds manipularon su sistema de compilación, de modo que las actualizaciones auténticamente firmadas de la empresa llevaban una puerta trasera. Una firma demuestra quién compiló algo, no que la compilación estuviera limpia. Y los registros se usan de forma abusiva con nombres de paquete parecidos, lo que se llama typosquatting, y con paquetes públicos que se llaman como los paquetes internos de una empresa.
Una lista de materiales de software, o SBOM, es una lista legible por máquina de los componentes de tu software, con sus versiones e identificadores exactos. No hace el software más seguro por sí misma. Hace que las preguntas tengan respuesta. Genérala durante la compilación, a partir de lo que realmente se resolvió y empaquetó, no de la lista que escribió un desarrollador. Guárdala con el artefacto y pásala a un servicio que vuelva a comprobar cada lista almacenada cada vez que se publique una nueva vulnerabilidad. Cuando se anunció Log4Shell, las organizaciones con un inventario preciso respondieron a la pregunta en horas. Otras tardaron semanas.
Este es un pipeline reforzado del commit a producción. Empieza con código fuente revisado en ramas protegidas y con dependencias bloqueadas en versiones exactas, con un hash de cada una. La compilación está aislada: se crea para un solo job y se destruye después, con todas sus entradas declaradas. Produce la lista de materiales. El resultado se firma sin ninguna clave de larga duración. Un certificado que dura minutos nombra la identidad de la compilación, y la firma se anota en un registro público al que solo se pueden añadir entradas. La imagen se guarda por su digest. Antes de que producción la ejecute, una comprobación de admisión verifica la firma y su procedencia. Solo se permite ejecutar lo que el pipeline esperado compiló a partir de código fuente revisado.
Haz commit de los lockfiles, que registran las versiones exactas con un hash de cada una, e instala a partir de ellos en cada compilación. Fija también las herramientas de compilación. En 2025, las etiquetas de versión de una acción de compilación popular se movieron a código malicioso, lo que afectó a miles de repositorios que hacían referencia a ella por etiqueta. Fijar sin actualizar crea el riesgo contrario, así que deja que un bot proponga pequeñas actualizaciones a menudo. Esperar unos días antes de adoptar una versión rutinaria ayuda, porque la mayoría de las versiones maliciosas se retiran en pocos días. Las correcciones de seguridad van rápido. Y los escáneres producen cientos de hallazgos. Prioriza según si un defecto se está explotando, si tu código puede llegar a él y si el servicio está expuesto a internet.
La regulación empuja en la misma dirección. El Reglamento de Ciberresiliencia de la UE establece requisitos de ciberseguridad para los productos de hardware y software con elementos digitales introducidos en el mercado de la UE. Sus requisitos son de arquitectura: una configuración segura por defecto, una superficie de ataque limitada, actualizaciones de seguridad y una SBOM que cubra al menos las dependencias de máximo nivel. Se aplica por etapas. Sus obligaciones de notificar las vulnerabilidades aprovechadas activamente y los incidentes graves se aplican desde el once de septiembre de 2026, y la mayoría de las demás obligaciones desde el once de diciembre de 2027. Esto es información general, no asesoramiento jurídico. Si un producto concreto entra en el ámbito es una cuestión jurídica para cada organización, que debe confirmarse con los textos oficiales y con asesores cualificados.
La sección completa cuenta los cuatro incidentes en detalle, e incluye los niveles de integridad de la compilación y una lista de comprobación para los equipos de servicio. A continuación, en la Sección ocho punto siete, veremos la privacidad desde el diseño. Nos vemos allí.
Lo que necesitas saber
- La mayor parte del código de un servicio moderno procede de dependencias, herramientas de compilación, acciones de CI e imágenes base; cada una de ellas, y cualquiera que pueda modificarlas, forma parte de la superficie de ataque.
- event-stream (2018) abusó de la confianza en un mantenedor, SolarWinds (2020) de un sistema de compilación comprometido, Log4Shell (2021) de una biblioteca vulnerable enterrada en lo profundo de los árboles de dependencias, y xz utils (2024) de una paciente toma de control de un proceso de lanzamiento.
- Una SBOM en formato SPDX o CycloneDX enumera los componentes con identificadores exactos, de modo que la exposición a una nueva vulnerabilidad se puede encontrar con una consulta; la Orden Ejecutiva 14028 de EE. UU. (2021) y el Reglamento de Ciberresiliencia de la UE generalizaron las SBOM.
- SLSA (versión 1.2) define los niveles Build L0 a L3, que terminan en compilaciones reforzadas y aisladas, y niveles Source que llegan hasta la revisión por dos personas; la procedencia registra quién compiló un artefacto y a partir de qué.
- La firma sin claves (keyless) de Sigstore vincula un certificado de corta duración a una identidad de CI y anota las firmas en un registro de transparencia público; las comprobaciones de admisión verifican las firmas y la procedencia antes del despliegue.
- Los lockfiles con hashes, fijar las acciones de CI y las imágenes por digest, las actualizaciones pequeñas y automatizadas con un breve retraso para las versiones nuevas, el análisis priorizado y las compilaciones efímeras y herméticas reducen el riesgo en el trabajo diario.
- Las obligaciones de notificación del CRA se aplican desde el 11 de septiembre de 2026 (alerta temprana en 24 horas, notificación en 72 horas) y la mayoría de las demás obligaciones desde el 11 de diciembre de 2027.
Por qué las dependencias son una superficie de ataque
La mayor parte del código de un servicio moderno no la escribió el equipo que lo opera. Un pequeño servicio web puede declarar veinte dependencias directas y, a través de las dependencias de estas, instalar varios cientos de paquetes; el contenedor en el que se entrega añade el espacio de usuario de un sistema operativo, y el pipeline que lo compila ejecuta compiladores, plug-ins y acciones de CI escritos por todavía más personas. La Sección 0.3 presentó las dependencias como un ahorro de esfuerzo con un costo de mantenimiento. Esta sección examina su costo en seguridad: cada uno de esos componentes, y cada persona y sistema capaz de modificarlos, forma parte de tu superficie de ataque.
Un ataque a la cadena de suministro de software compromete algo que consumes para llegar hasta ti, normalmente a muchas víctimas a la vez. Puede llegar de cuatro formas generales. Código malicioso desde una fuente de confianza: se roba mediante phishing la cuenta de un mantenedor, un mantenedor se vuelve hostil o un proyecto se entrega a un desconocido. Imitaciones maliciosas: el typosquatting publica reqeusts junto a requests; la confusión de dependencias (dependency confusion), demostrada por Alex Birsan en febrero de 2021, publica en el registro público un paquete con el mismo nombre que un paquete interno de una empresa y un número de versión más alto, que algunas herramientas de compilación prefieren. Manipulación en el pipeline: el código fuente está bien, pero el sistema de compilación, las claves de firma o el registro están comprometidos. Vulnerabilidades honestas: ningún atacante intervino al escribir el código, pero un bug grave en una dependencia transitiva muy usada expone a todos los que la entregan.
Los últimos años han mostrado lo rápido que se propaga el primer tipo. En marzo de 2025, las etiquetas de versión de una GitHub Action popular, tj-actions/changed-files, se movieron a un commit malicioso que imprimía los secretos de CI en los registros de compilación, lo que afectó a miles de repositorios que hacían referencia a la acción por etiqueta. En septiembre de 2025, un mantenedor de paquetes npm muy usados, como chalk y debug, sufrió phishing mediante un falso sitio de soporte de npm, y se publicaron versiones maliciosas que se retiraron en cuestión de horas; ese mismo mes, un gusano autopropagable, apodado Shai-Hulud, robó tokens de npm y los usó para publicar versiones infectadas de más paquetes.
La cadena de suministro y las relaciones de confianza de las que abusan los atacantes
Cuatro incidentes, contados con precisión
event-stream (2018). event-stream era un paquete npm popular, descargado unos dos millones de veces por semana, cuyo autor original ya no tenía tiempo para él. En septiembre de 2018 cedió los derechos de publicación a un voluntario que se había ofrecido a ayudar. El nuevo mantenedor añadió una dependencia, flatmap-stream, cuyo paquete publicado contenía una carga útil cifrada que solo se activaba dentro de la compilación de Copay, una aplicación de monedero de bitcoin, e intentaba robar monederos con saldos grandes. Un desarrollador detectó el código sospechoso en noviembre de 2018. Nada del modelo de npm se había roto: simplemente, un nombre de confianza había cambiado de manos.
SolarWinds (2020). Unos atacantes, que el Gobierno de EE. UU. atribuyó más tarde al servicio de inteligencia exterior de Rusia, lograron acceso al entorno de compilación de SolarWinds, el fabricante del producto de gestión de redes Orion. Un implante (que los investigadores llamaron SUNSPOT) vigilaba las compilaciones de Orion y sustituía un archivo fuente por una versión con puerta trasera durante la compilación, y después volvía a poner el original. Las actualizaciones resultantes, publicadas entre marzo y junio de 2020, las había compilado el propio pipeline de SolarWinds y estaban firmadas con su certificado auténtico. Unos 18 000 clientes las instalaron; después, los atacantes eligieron un número mucho menor de organismos públicos y empresas para continuar la intrusión. FireEye descubrió la campaña en diciembre de 2020 mientras investigaba su propia brecha. La lección para los arquitectos: una firma demuestra quién compiló algo, no que la compilación estuviera limpia.
Log4Shell (2021). CVE-2021-44228, divulgada el 9 de diciembre de 2021 y con una puntuación de 10.0 en CVSS, era un defecto en Log4j 2, la biblioteca de logging dominante en Java. Log4j resolvía las búsquedas (lookups) escritas dentro de los mensajes de registro, incluidas las búsquedas JNDI que podían cargar una clase desde un servidor remoto, así que un atacante que consiguiera que se registrara una cadena, como un nombre de usuario o una cabecera de solicitud, podía ejecutar código en el servidor. Ningún atacante había tocado la cadena de suministro; el daño vino de lo extendida, y lo profundamente integrada, que estaba la biblioteca. Las organizaciones dedicaron semanas a averiguar dónde la usaban, hicieron falta varias versiones posteriores para cerrar defectos relacionados, y quienes tenían un inventario preciso respondieron a la pregunta en horas.
xz utils (2024). xz es una biblioteca de compresión que usa, a través de otras bibliotecas, el servidor OpenSSH en varias distribuciones de Linux. A lo largo de unos dos años, una cuenta llamada Jia Tan aportó trabajo útil y, con la ayuda de otras cuentas que presionaban al sobrecargado mantenedor original para que aceptara ayuda, se convirtió en comantenedor. Las versiones 5.6.0 y 5.6.1, lanzadas en febrero y marzo de 2024, contenían una puerta trasera (backdoor) que permitiría al poseedor de una clave privada concreta ejecutar comandos a través de SSH. El código malicioso estaba oculto en archivos de prueba binarios y lo activaba un script de compilación modificado que solo existía en los tarballs de la versión, no en el repositorio público. El 29 de marzo de 2024, Andres Freund, desarrollador de Microsoft, lo reveló tras investigar por qué los inicios de sesión SSH en un sistema de pruebas usaban una cantidad inusual de CPU y tardaban alrededor de medio segundo más; se registró como CVE-2024-3094. Como se detectó pronto, había llegado sobre todo a distribuciones de desarrollo y de lanzamiento continuo (rolling release) y no a las estables.
Lo que enseña cada incidente
| Incidente | Qué ocurrió | Eslabón atacado | Controles que habrían ayudado |
|---|---|---|---|
| event-stream (npm), 2018 | Un nuevo mantenedor voluntario, al que el agotado autor original había cedido el paquete, añadió una dependencia (flatmap-stream) que llevaba una carga útil cifrada dirigida a una aplicación de monedero de bitcoin concreta. | La confianza en los mantenedores y las dependencias transitivas | Lockfiles y un retraso antes de adoptar versiones nuevas; revisión de las nuevas dependencias transitivas; financiación y relevo para los paquetes críticos. |
| SolarWinds Orion, 2020 | Atacantes dentro de la red del proveedor implantaron código que sustituía un archivo fuente durante la compilación, de modo que actualizaciones firmadas legítimamente contenían la puerta trasera SUNBURST. | Compilación | Compilaciones aisladas, efímeras y monitorizadas; procedencia; compilaciones reproducibles para comparar resultados; mínimo privilegio para la propia herramienta de gestión de redes. |
| Log4Shell (Log4j 2), 2021 | Una funcionalidad antigua que resolvía búsquedas JNDI en el texto registrado permitía a cualquier atacante que lograra que se registrara una cadena ejecutar código en el servidor. | Una dependencia vulnerable y profundamente anidada | Una SBOM para encontrar en minutos cada sistema afectado; filtrado del tráfico de salida; aplicación de parches rápida y ensayada. |
| xz utils, 2024 | Tras unos dos años de contribuciones pacientes, un comantenedor entregó tarballs de la versión con una puerta trasera oculta dirigida a OpenSSH en algunas distribuciones de Linux. | El código fuente y el proceso de lanzamiento | Compilar desde el repositorio revisado, no desde tarballs hechos a mano; compilaciones reproducibles; examen atento de los archivos de prueba binarios y de los scripts de compilación. |
Listas de materiales de software
Una lista de materiales de software (SBOM) es una lista legible por máquina de los componentes de un software, con sus versiones, sus identificadores y las relaciones entre ellos. No hace el software más seguro por sí misma; hace que las preguntas tengan respuesta. Cuando se anuncie el próximo Log4Shell, un almacén consultable de SBOM de cada artefacto desplegado convierte ¿estamos afectados, y dónde?
en una consulta.
Dos formatos dominan. SPDX, de la Linux Foundation, nació como formato de cumplimiento de licencias; su versión 2.2.1 es la norma internacional ISO/IEC 5962:2021, y SPDX 3.0 (2024) añade perfiles para seguridad, compilaciones e IA. CycloneDX, un proyecto de OWASP diseñado para casos de uso de seguridad, está normalizado por Ecma International como ECMA-424; la versión 1.7 se lanzó en octubre de 2025. Ambos pueden identificar componentes con una package URL (purl), como pkg:npm/express@4.21.2, que es con lo que se cotejan las bases de datos de vulnerabilidades. La idea complementaria de VEX (Vulnerability Exploitability eXchange) permite a un proveedor declarar que un componente vulnerable de la lista no es explotable en su producto, por ejemplo porque la función vulnerable nunca se llama, lo que reduce el ruido para los clientes.
Las políticas públicas llevaron las SBOM a la corriente principal. La Orden Ejecutiva 14028 de EE. UU., Improving the Nation's Cybersecurity, firmada el 12 de mayo de 2021, estableció medidas de cadena de suministro de software para el software vendido al Gobierno federal, entre ellas proporcionar a los compradores una SBOM; la National Telecommunications and Information Administration publicó después los elementos mínimos de una SBOM (proveedor, nombre del componente, versión, otros identificadores únicos, relaciones de dependencia, autor de los datos de la SBOM y una marca de tiempo). Desde entonces, la política de EE. UU. se ha alejado de los mandatos uniformes: en enero de 2026, el memorando M-26-05 de la Office of Management and Budget revocó el requisito anterior de que los proveedores certificaran sus prácticas de desarrollo seguro, y dejó que los organismos fijaran requisitos basados en el riesgo y pidieran SBOM cuando lo consideraran oportuno. En la UE, el Reglamento de Ciberresiliencia, descrito más abajo, hace que la SBOM forme parte de la documentación técnica de los productos con elementos digitales.
Genera las SBOM durante la compilación, a partir de lo que realmente se resolvió y empaquetó, y no del manifiesto que escribió un desarrollador; guárdalas junto al artefacto, indexadas por su digest; y pásalas a un servicio que vuelva a comprobar cada SBOM almacenada cuando se publique una nueva vulnerabilidad.
{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"metadata": {"timestamp": "2026-10-20T09:14:02Z",
"component": {"bom-ref": "orders-service", "type": "application",
"name": "orders-service", "version": "4.12.0"}},
"components": [
{"bom-ref": "log4j-core", "type": "library", "name": "log4j-core",
"group": "org.apache.logging.log4j", "version": "2.24.3",
"purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.24.3",
"hashes": [{"alg": "SHA-256", "content": "9f2c..."}]},
{"bom-ref": "jackson-databind", "type": "library", "name": "jackson-databind",
"version": "2.18.2",
"purl": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.18.2"}
],
"dependencies": [
{"ref": "orders-service", "dependsOn": ["log4j-core", "jackson-databind"]}
]
}SLSA: niveles de integridad de la compilación
SLSA (Supply-chain Levels for Software Artifacts, que se pronuncia salsa) es un marco, mantenido ahora bajo la Open Source Security Foundation, que describe niveles progresivos de protección frente a la manipulación. La versión 1.0 (2023) definió una vía de compilación (Build track); la versión 1.2 reestructuró la especificación en varias vías y añadió una vía de código fuente (Source track). El artefacto central es la procedencia (provenance): una declaración firmada, normalmente en el formato de atestación in-toto, de qué plataforma de compilación produjo un artefacto, a partir de qué revisión del código fuente y con qué definición y parámetros de compilación. Un consumidor verifica la procedencia frente a expectativas como compilado por nuestra CI a partir de la rama main de github.com/fooddelivery/orders.
La vía Source tiene cuatro niveles: control de versiones (L1), historial continuo e inmutable con procedencia para cada revisión (L2), controles técnicos aplicados de forma continua, como las ramas protegidas (L3), y revisión por dos personas de cada cambio en las ramas protegidas (L4). Para la mayoría de las organizaciones, el objetivo realista es Build L3 en una plataforma de compilación compartida y bien gestionada, más Source L3 o L4 para los repositorios importantes; los niveles dicen lo que una plataforma debe garantizar, y un equipo de plataforma puede cumplirlos una sola vez para todos los servicios.
Niveles de la vía Build de SLSA
| Nivel | Nombre | Qué garantiza |
|---|---|---|
| Build L0 | Sin garantías | Sin requisitos: la ausencia de SLSA. |
| Build L1 | Existe procedencia | La compilación produce una procedencia que describe cómo se compiló el artefacto. Detecta errores, pero es fácil de falsificar. |
| Build L2 | Plataforma de compilación alojada | Un servicio de compilación alojado genera y firma la procedencia, lo que protege frente a la manipulación posterior a la compilación. |
| Build L3 | Compilaciones reforzadas | La plataforma de compilación aísla las compilaciones entre sí y mantiene el material de firma fuera del alcance de los pasos de compilación definidos por el usuario, lo que protege frente a la manipulación durante la compilación. |
Firma y procedencia con Sigstore
Firmar artefactos es posible desde hace mucho, pero gestionar claves de firma de larga duración era tan engorroso que pocos proyectos de código abierto lo hacían, y las claves robadas eran en sí mismas un riesgo. Sigstore, lanzado en 2021 y ahora parte de la Open Source Security Foundation, abarata la firma mediante la firma sin claves (keyless). Un job de CI demuestra su identidad ante Fulcio, la autoridad de certificación de Sigstore, con un token de OpenID Connect; Fulcio emite un certificado válido durante unos minutos que nombra esa identidad, por ejemplo un workflow concreto de un repositorio concreto; la herramienta firma el artefacto y anota la firma en Rekor, un registro de transparencia público en el que solo se pueden añadir entradas; después se descarta la clave privada efímera. Los verificadores comprueban la firma, la identidad del certificado y la entrada del registro, en lugar de confiar en una clave que podría haberse filtrado.
La herramienta cosign aplica esto a las imágenes de contenedor y a otros artefactos, y los ecosistemas de paquetes han adoptado las mismas ideas: npm puede publicar paquetes con declaraciones de procedencia que los vinculan con el repositorio de código y la compilación (2023), y PyPI admite la publicación de confianza (trusted publishing) desde CI sin tokens de larga duración (2023) y atestaciones basadas en Sigstore (2024). En el despliegue, un controlador de admisión de Kubernetes, como el policy controller de Sigstore o Kyverno, puede rechazar cualquier imagen que no esté firmada por la identidad esperada o que carezca de la procedencia esperada. Recuerda SolarWinds: la firma y la procedencia demuestran de dónde vino algo; solo el aislamiento de la compilación, la revisión y la detección hacen fiable lo que salió.
Un pipeline reforzado del commit a producción
Lockfiles, fijación de versiones y actualizaciones automatizadas
Un manifiesto como package.json o pyproject.toml indica los rangos de versiones aceptables; un lockfile (archivo de bloqueo) (package-lock.json, poetry.lock, uv.lock, go.sum, Cargo.lock) registra las versiones exactas resueltas, normalmente con un hash criptográfico de cada una. Hacer commit del lockfile e instalar a partir de él en CI (npm ci, pip install --require-hashes) significa que cada compilación usa los mismos bytes revisados, y que un paquete republicado con un contenido distinto no supera la comprobación del hash. La fijación de versiones (pinning) se aplica también a las herramientas de compilación: haz referencia a las acciones de CI por su hash de commit completo, no por una etiqueta que su propietario, o un atacante, puede mover, que es justo lo que hizo que se propagara el incidente de tj-actions; haz referencia a las imágenes base por digest.
Fijar sin actualizar crea el riesgo contrario: las versiones antiguas acumulan vulnerabilidades conocidas y las actualizaciones se vuelven demasiado grandes para intentarlas. Los bots de actualización como Dependabot y Renovate abren pull requests pequeñas y frecuentes que la CI prueba automáticamente. Un refinamiento útil es una antigüedad mínima de la versión (minimum release age): esperar unos días antes de adoptar una versión nueva rutinaria, porque la mayoría de las versiones maliciosas se detectan y se retiran en horas o días; las correcciones de seguridad quedan exentas y se aceleran.
Las herramientas de análisis de composición de software (SCA), como OWASP Dependency-Check, Trivy, Grype o servicios comerciales, cotejan tus dependencias con las bases de datos de vulnerabilidades. Su punto débil es el ruido: cientos de hallazgos, la mayoría en rutas de código que nunca llamas. Prioriza con datos de explotación (¿está en el catálogo Known Exploited Vulnerabilities de la CISA?, ¿cuál es su puntuación EPSS?), con análisis de alcanzabilidad cuando tus herramientas lo ofrezcan, y con la exposición (¿el servicio está expuesto a internet?). La Sección 8.8 trata la gestión de vulnerabilidades como proceso.
Contenedores e integridad de la compilación
Una imagen de contenedor lleva el espacio de usuario de un sistema operativo además de tu código, y cada paquete que contiene forma parte de la cadena de suministro. Parte de imágenes base mínimas (distroless, Alpine o imágenes slim de distribuciones), que contienen menos paquetes que puedan ser vulnerables; recompila las imágenes con regularidad para que las correcciones de la imagen base lleguen aunque tu código no haya cambiado; analiza las imágenes en CI y de nuevo de forma continua en el registro, porque cada día se publican nuevas vulnerabilidades que afectan a imágenes antiguas; y despliega las imágenes por digest para que lo que se analizó sea lo que se ejecuta.
El sistema de compilación es el objetivo más valioso de la cadena porque lo toca todo, como demostró SolarWinds. Ejecuta las compilaciones en runners efímeros que se crean para un solo job y se destruyen después, para que un atacante no pueda persistir entre compilaciones. Haz que las compilaciones sean herméticas, con todas las entradas declaradas y descargadas por hash y sin acceso a la red durante la compilación, para que no puedan colarse entradas no declaradas. Mantén los secretos de larga duración fuera de la CI usando la federación OIDC para obtener credenciales de nube de corta duración para cada job, y da a cada pipeline el mínimo privilegio que necesita, para que una pull request desde un fork no pueda llegar a las credenciales de despliegue. Protege la ruta de lanzamiento con protección de ramas y revisión por dos personas. Por último, las compilaciones reproducibles, en las que el mismo código fuente produce siempre un resultado idéntico bit a bit, permiten que terceros independientes recompilen y comparen; el proyecto Reproducible Builds y distribuciones como Debian han hecho reproducibles la mayoría de sus paquetes, y una discrepancia es un indicio sólido de manipulación.
El Reglamento de Ciberresiliencia de la UE
El Reglamento de Ciberresiliencia (Cyber Resilience Act) (CRA), Reglamento (UE) 2024/2847, establece requisitos horizontales de ciberseguridad para los productos con elementos digitales introducidos en el mercado de la UE: productos de hardware y software, incluidas sus soluciones de tratamiento de datos a distancia. Entró en vigor el 10 de diciembre de 2024 y se aplica por etapas. Las normas sobre la notificación de los organismos de evaluación de la conformidad se aplican desde el 11 de junio de 2026. Las obligaciones de notificación del artículo 14 se aplican desde el 11 de septiembre de 2026: un fabricante debe notificar una vulnerabilidad aprovechada activamente o un incidente grave que afecte a la seguridad de su producto con una alerta temprana en un plazo de 24 horas desde que tenga conocimiento, una notificación más completa en un plazo de 72 horas y un informe final más adelante (para una vulnerabilidad, en un plazo de 14 días desde que haya disponible una medida correctora; para un incidente grave, en un plazo de un mes), a través de la plataforma única de notificación que gestiona ENISA, la agencia de ciberseguridad de la UE. La mayoría de las demás obligaciones se aplican desde el 11 de diciembre de 2027.
Los requisitos esenciales del anexo I son tanto de arquitectura como de procedimiento: los productos deben diseñarse con un nivel de seguridad adecuado, entregarse con una configuración segura por defecto, limitar las superficies de ataque, proteger la confidencialidad y la integridad de los datos, minimizar los datos y ser capaces de registrar eventos de seguridad y de recibir actualizaciones de seguridad. Los fabricantes deben identificar y documentar los componentes, entre otras cosas elaborando una SBOM que cubra al menos las dependencias de máximo nivel, gestionar las vulnerabilidades mediante una política de divulgación coordinada y proporcionar actualizaciones de seguridad durante un periodo de soporte que normalmente debería ser de al menos cinco años, salvo que se prevea que el producto se use durante menos tiempo. Las multas por incumplir los requisitos esenciales o las obligaciones de los fabricantes pueden llegar a 15 millones de EUR o al 2.5% del volumen de negocios anual mundial, si esta cifra es superior.
El ámbito importa. El software libre y de código abierto desarrollado o suministrado fuera de una actividad comercial queda fuera del CRA, y se aplica un régimen más ligero a los administradores de comunidad de programas informáticos de código abierto que dan soporte a ese software para uso comercial. El software como servicio puro suele quedar fuera del CRA, salvo que sea la solución de tratamiento de datos a distancia de un producto; los proveedores de servicios en la nube y otros servicios digitales pueden quedar sujetos, en cambio, a la Directiva NIS2. Si un producto concreto entra en el ámbito, y qué vía de evaluación de la conformidad se aplica, es una cuestión jurídica para cada organización; la consecuencia arquitectónica es que las SBOM, la gestión de vulnerabilidades, los mecanismos de actualización y el registro de eventos de seguridad se convierten en pruebas que tienen que existir, no en buenas intenciones.
Lista de comprobación: seguridad de la cadena de suministro para un equipo de servicio
La mayoría de estos puntos son funcionalidades de la plataforma una vez y hábitos a partir de entonces.
- Mantén un inventarioGenera una SBOM en cada compilación y guárdala con el artefacto, para que "¿estamos afectados?" sea una consulta y no un proyecto.
- Bloquea y verifica las dependenciasHaz commit de los lockfiles, instala con comprobación de hashes en CI y haz fallar la compilación si el lockfile y el manifiesto no coinciden.
- Elige las dependencias de forma deliberadaAntes de añadir una, comprueba su mantenimiento, el número de mantenedores, los resultados de OpenSSF Scorecard, la licencia y cuánto código arrastra de forma transitiva.
- Actualiza de forma continua, pero no al instanteDeja que un bot proponga pequeñas actualizaciones cada semana; aplica una antigüedad mínima de la versión corta a las actualizaciones rutinarias; acelera las correcciones de seguridad.
- Analiza y luego priorizaEjecuta el análisis de composición de software y el análisis de imágenes en CI y de forma continua en el registro; prioriza por explotabilidad y alcanzabilidad, no por cantidad.
- Fija las herramientas de compilación además de las bibliotecasFija las acciones de CI y los plug-ins a hashes de commit completos y las imágenes base a digests; revisa sus cambios como si fueran código.
- Aísla y refuerza la compilaciónRunners efímeros, sin secretos de larga duración (usa la federación OIDC), tokens de mínimo privilegio, ramas protegidas y revisión por dos personas para las rutas de lanzamiento.
- Firma y registra la procedenciaFirma los artefactos con Sigstore o un equivalente, publica la procedencia SLSA y aspira a Build L3 en la plataforma.
- Verifica en el despliegueLas políticas de admisión rechazan las imágenes sin firmar, firmadas por una identidad equivocada o que carecen de procedencia del repositorio esperado.
- Prepárate para el próximo Log4ShellEnsaya cómo encontrar y parchear una biblioteca en todos los servicios en un día, y conoce tus obligaciones de notificación según el CRA, los contratos y los clientes.
Preguntas frecuentes
¿Deberíamos copiar (vendoring) todas las dependencias en nuestro repositorio?
El vendoring da control y compilaciones sin conexión, pero dificulta las actualizaciones y oculta las correcciones de origen. Un lockfile con hashes más un espejo privado del registro que guarda en caché los paquetes aprobados da la mayor parte del control con menos mantenimiento.
¿Basta un registro privado para evitar la confusión de dependencias?
Solo si las compilaciones están configuradas para resolver los nombres internos exclusivamente desde él. Usa nombres de paquete con ámbito o con espacio de nombres, registra tus nombres internos en los registros públicos y configura el gestor de paquetes para que un paquete público nunca pueda sustituir a uno interno.
¿Quién es responsable de la seguridad de la cadena de suministro en la organización?
Normalmente es compartida: un equipo de plataforma o de seguridad proporciona una sola vez el pipeline reforzado, la firma, el análisis y las políticas; cada equipo de servicio mantiene sus dependencias pocas, actualizadas y justificadas.
Comprueba lo que has entendido
¿Por qué no protegieron a los clientes de SolarWinds sus comprobaciones de firma?
La puerta trasera se insertó durante la propia compilación de SolarWinds, así que la actualización troyanizada estaba firmada auténticamente por SolarWinds. Una firma muestra quién produjo un artefacto, no que la compilación estuviera limpia.
¿Qué añade un lockfile a un manifiesto?
El manifiesto indica los rangos de versiones aceptables; el lockfile registra las versiones exactas resueltas y normalmente sus hashes, de modo que cada compilación instala los mismos bytes y un paquete modificado no supera la verificación.
¿Por qué hacer referencia a una acción de CI por etiqueta es más arriesgado que por hash de commit?
Quien controle el repositorio, incluido un atacante, puede mover una etiqueta, así que la misma referencia puede ejecutar en silencio un código distinto; un hash de commit completo identifica un contenido inmutable.
¿Qué pregunta responde una SBOM que un escáner de vulnerabilidades por sí solo no responde rápidamente en todo un parque de sistemas?
Qué artefactos desplegados, en qué servicios y entornos, contienen un componente y una versión determinados, para poder encontrar en todas partes a la vez la exposición a una vulnerabilidad recién anunciada.
Fuentes y lecturas recomendadas
¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.
Pregunta: “¿Cómo debería priorizar nuestro equipo cientos de alertas de vulnerabilidades en dependencias, y cuáles importan de verdad?”