Lección 6 de 613 min
OWASP y la cadena de suministro
OWASP Top 10, ASVS y SAMM, la seguridad de tus dependencias, los SBOM y el análisis con SonarQube.
Llegas a un equipo nuevo y te piden «mejorar la seguridad». ¿Por dónde empiezas? ¿Qué requisitos debe cumplir la aplicación? ¿Cómo sabes si el equipo trabaja mejor que hace un año? Para no inventar la respuesta cada vez, existe OWASP, una fundación sin ánimo de lucro que publica guías y herramientas gratuitas usadas en todo el mundo.
Y hay un frente que no está en tu código: el de los demás. Una aplicación típica incluye cientos de dependencias que no has escrito ni leído. En esta lección verás los tres marcos principales de OWASP, cómo proteger tu cadena de suministro con lockfiles, procedencia y SBOM, y cómo analizar tu propio código de forma automática con SonarQube.
Los marcos de OWASP
Cada marco responde a una pregunta distinta: qué suele fallar, qué debe cumplir una aplicación y cómo de madura es una organización.
OWASP Top 10
La lista de los riesgos más críticos de las aplicaciones web, revisada cada pocos años.
- Tipo:
- Concienciación
- N.º 1 reciente:
- Control de acceso roto
El Top 10 es un documento de concienciación: reúne en diez categorías los riesgos de seguridad más críticos de las aplicaciones web, a partir de datos de vulnerabilidades que aportan empresas y de una encuesta a profesionales. Se actualiza periódicamente para reflejar cómo cambian los ataques.
En sus ediciones recientes, el primer puesto es el control de acceso roto (broken access control): usuarios que pueden ver o modificar lo que no deberían, casi siempre porque falta una comprobación en el servidor. Otras categorías habituales son las inyecciones, los fallos de configuración, los de criptografía, los de autenticación y los de los componentes de terceros.
Úsalo cuando
Como vocabulario común del equipo, para formar a quien empieza y para decidir qué revisar primero en una auditoría o en una revisión de código.
Ten en cuenta
No es un estándar ni una lista de comprobación completa: «cubrimos el Top 10» no significa «somos seguros». Para verificar una aplicación requisito a requisito está el ASVS.
// Control de acceso roto: cualquiera con sesión ve cualquier factura
app.get("/api/facturas/:id", requiereSesion, async (req, res) => {
const factura = await db.factura.findUnique({ where: { id: req.params.id } });
res.json(factura);
});
// Corregido: la factura tiene que ser del usuario que la pide
app.get("/api/facturas/:id", requiereSesion, async (req, res) => {
const factura = await db.factura.findFirst({
where: { id: req.params.id, clienteId: req.usuario.id },
});
if (!factura) return res.status(404).end();
res.json(factura);
});OWASP ASVS
Un estándar de requisitos de seguridad verificables, con tres niveles según el riesgo.
- Tipo:
- Estándar de verificación
- Niveles:
- 1, 2 y 3
El ASVS (Application Security Verification Standard) es un catálogo de requisitos concretos y comprobables, agrupados por áreas: autenticación, sesiones, control de acceso, validación, criptografía, registros y más. Cada requisito se puede verificar con una prueba, una revisión de código o una auditoría.
Tiene tres niveles. El 1 es el mínimo para cualquier aplicación. El 2 es el recomendado para la mayoría de las que manejan datos sensibles. El 3 es para las críticas, como banca, salud o infraestructuras, y exige la verificación más profunda.
Úsalo cuando
Para definir los requisitos de seguridad de un proyecto, convertirlos en criterios de aceptación de las historias de usuario y pedir a un auditor que verifique la aplicación «contra el ASVS de nivel 2».
Ten en cuenta
Son cientos de requisitos: no intentes cumplirlos todos de golpe. Elige el nivel adecuado y empieza por las áreas que tu aplicación realmente tiene.
Como usuaria, quiero cambiar mi contraseña.
Criterios de seguridad, inspirados en el ASVS de nivel 2:
- Pide la contraseña actual antes de aceptar la nueva
- Acepta contraseñas largas, con espacios y cualquier carácter
- Rechaza contraseñas que aparecen en filtraciones conocidas
- Ofrece cerrar las demás sesiones abiertasOWASP SAMM
Un modelo para medir y mejorar cómo trabaja la seguridad una organización.
- Funciones:
- 5
- Madurez:
- De 1 a 3
SAMM (Software Assurance Maturity Model) no evalúa una aplicación, sino el programa de seguridad de una organización: cómo incorpora la seguridad en todo el ciclo de vida del software. Se organiza en cinco funciones (gobierno, diseño, implementación, verificación y operaciones), cada una con varias prácticas.
Para cada práctica, un cuestionario te da un nivel de madurez de 1 a 3. Con esa foto fijas un objetivo realista y un plan: por ejemplo, pasar de no hacer análisis de amenazas a hacerlo en los proyectos nuevos durante el próximo año.
Úsalo cuando
Cuando eres responsable de varios equipos y necesitas saber dónde estáis, decidir en qué invertir y demostrar que mejoráis con el tiempo.
Ten en cuenta
La meta no es el nivel 3 en todo: cada organización elige el nivel que necesita en cada práctica. Rellenar el cuestionario para sacar buena nota no mejora nada.
Función Práctica Hoy Objetivo
Gobierno Estrategia y métricas 1 2
Diseño Evaluación de amenazas 0 1
Implementación Construcción segura 1 2
Verificación Pruebas de seguridad 1 2
Operaciones Gestión de incidentes 0 1La cadena de suministro
Tu cadena de suministro es todo lo que interviene entre el código que escribes y lo que llega a producción: dependencias, herramientas de build, el pipeline de CI y las imágenes de contenedor. Atacar un eslabón popular permite llegar a miles de aplicaciones a la vez.
Seguridad de las dependencias
Saber qué instalas, instalar siempre lo mismo y enterarte cuando algo es vulnerable.
- Lockfiles:
- package-lock.json, pnpm-lock.yaml
Los ataques más comunes son tres. El typosquatting: publicar un paquete con un nombre casi idéntico a uno popular, como pasó en 2017 con crossenv, que imitaba a cross-env y robaba variables de entorno. La cuenta robada: alguien se hace con la cuenta de un mantenedor y publica una versión maliciosa. Y los scripts de instalación, que ejecutan código en tu máquina o en tu CI con solo instalar el paquete.
Las defensas básicas: sube el lockfile al repositorio y usa npm ci en el pipeline, que instala exactamente las versiones revisadas y falla si no cuadran con package.json. Ejecuta npm audit para detectar vulnerabilidades conocidas y deja que una herramienta como Dependabot o Renovate proponga las actualizaciones. pnpm, en sus versiones recientes, ya no ejecuta por defecto los scripts de instalación de las dependencias.
Úsalo cuando
En todos los proyectos. Antes de añadir una dependencia, comprueba su nombre exacto, quién la mantiene y si de verdad la necesitas: cada dependencia es código ajeno con acceso a todo.
Ten en cuenta
npm audit solo conoce vulnerabilidades ya publicadas: no detecta un paquete malicioso que nadie ha descubierto todavía. Y genera mucho ruido; prioriza lo que afecta al código que llega a producción.
# En CI: exactamente lo que dice el lockfile, o falla
npm ci
# Vulnerabilidades conocidas de gravedad alta o crítica
npm audit --audit-level=high
# Antes de instalar: ¿es el paquete que crees?
npm view cross-env repository.url maintainersProcedencia, Sigstore y SLSA
Poder demostrar de qué código y en qué pipeline se construyó cada artefacto.
- Firma sin claves:
- Sigstore
- SLSA:
- Se dice «salsa»
La procedencia (provenance) es una declaración firmada que dice de qué repositorio, de qué commit y en qué pipeline se construyó un paquete o una imagen. Si alguien publica una versión desde un portátil robado, no tendrá una procedencia válida. npm la genera con npm publish --provenance desde un CI compatible y la muestra en la página de cada paquete.
Sigstore es el proyecto abierto que hace posible firmar sin gestionar claves: firmas con tu identidad (la de tu pipeline, por ejemplo), recibes un certificado de corta duración y la firma queda en un registro público de transparencia. Su herramienta cosign firma imágenes de contenedor.
SLSA (se pronuncia «salsa») es un marco que define niveles crecientes de garantías para el proceso de build: desde que exista procedencia hasta que se genere en una plataforma endurecida, de forma que no se pueda falsificar.
Úsalo cuando
Si publicas paquetes o imágenes que otros usan, y para verificar lo que tú consumes. Úsalo como hoja de ruta: no hace falta el nivel más alto de SLSA desde el primer día.
Ten en cuenta
La procedencia prueba de dónde viene un artefacto, no que su código sea bueno: un mantenedor malicioso puede publicar con procedencia perfecta. Es una pieza más, no un sello de calidad.
# Al publicar desde CI: npm firma la procedencia con Sigstore
npm publish --provenance
# Al instalar: verifica las firmas y la procedencia de tus dependencias
npm audit signatures
# Imágenes de contenedor: firmar con la identidad del pipeline
cosign sign registro.ejemplo.com/tienda/api:1.4.0SBOM
La lista de ingredientes de tu software: cada componente, con su versión y su licencia.
- Formatos:
- CycloneDX, SPDX
Un SBOM (Software Bill of Materials) es un inventario de todos los componentes de tu software, incluidas las dependencias de tus dependencias, con su versión, su licencia y un identificador estándar. Se genera de forma automática en el pipeline y se guarda junto a cada versión que publicas.
Su valor se ve el día de la crisis. Cuando en 2021 apareció Log4Shell, una vulnerabilidad gravísima en la librería de registros Log4j, muchas empresas tardaron semanas en saber qué sistemas la usaban. Con un SBOM de cada servicio, la respuesta es una búsqueda. Los dos formatos principales son CycloneDX, de OWASP, y SPDX, de la Linux Foundation.
Úsalo cuando
En cualquier software que publiques o despliegues, y cuando un cliente o una normativa lo pida, algo cada vez más habitual, como con la Cyber Resilience Act europea.
Ten en cuenta
Un SBOM que nadie consulta no protege de nada: conéctalo a una herramienta que lo cruce con las bases de datos de vulnerabilidades y te avise.
# SBOM del proyecto a partir del lockfile, en formato CycloneDX
npm sbom --sbom-format cyclonedx > sbom.cdx.json
# SBOM de una imagen de contenedor ya construida, en formato SPDX
syft registro.ejemplo.com/tienda/api:1.4.0 -o spdx-json > sbom.spdx.json¿Sabías que…?
En 2024 se descubrió una puerta trasera en xz utils, una librería de compresión presente en muchas distribuciones Linux. La introdujo un colaborador que llevaba años ganándose la confianza del proyecto, y la detectó casi por casualidad un ingeniero que notó que algo iba más lento de lo normal.
Analizar tu propio código
SAST, DAST y SCA
Buscar fallos leyendo el código, atacando la aplicación en marcha o revisando las dependencias.
- SAST:
- El código
- DAST:
- La app en marcha
- SCA:
- Las dependencias
El SAST (Static Application Security Testing) lee el código fuente sin ejecutarlo y busca patrones peligrosos, como una consulta SQL montada concatenando texto. Encuentra fallos pronto, en cada pull request, pero da falsos positivos.
El DAST (Dynamic Application Security Testing) ataca la aplicación en marcha desde fuera, como haría un atacante, con herramientas como ZAP. Encuentra problemas reales, como cabeceras que faltan o configuraciones inseguras, pero solo cuando ya hay algo desplegado. El SCA (Software Composition Analysis) revisa tus dependencias contra las bases de datos de vulnerabilidades: es lo que hacen npm audit o Dependabot.
Úsalo cuando
Los tres juntos en el pipeline: SCA y SAST en cada cambio, DAST contra el entorno de pruebas. Cada uno ve lo que los otros no ven.
Ten en cuenta
Ninguno entiende la lógica de tu negocio: no sabrán que un cliente no debería ver las facturas de otro. Las revisiones de código y las pruebas manuales siguen siendo necesarias.
sca:
stage: test
script: npm audit --audit-level=high
sast:
stage: test
image: sonarsource/sonar-scanner-cli
script: sonar-scanner -Dsonar.qualitygate.wait=true
dast:
stage: verify
image: ghcr.io/zaproxy/zaproxy:stable
script: zap-baseline.py -t https://staging.tienda.comSonarQube
Análisis estático de calidad y seguridad, con quality gates que frenan el pipeline.
- Tipo:
- SAST y calidad
- Frena con:
- Quality gates
SonarQube analiza el código de muchos lenguajes y señala errores probables, código difícil de mantener, vulnerabilidades y security hotspots: fragmentos que tocan algo sensible, como la configuración de una cookie o una expresión regular, y que una persona debe revisar para decidir si son un problema. En el módulo de testing lo verás desde el lado de la calidad.
Su pieza clave es el quality gate: un conjunto de condiciones que cada análisis debe cumplir, como no introducir vulnerabilidades nuevas o cubrir con pruebas un porcentaje del código nuevo. Si no se cumple, el pipeline falla y el cambio no se fusiona. Se centra en el código nuevo, así que la deuda antigua no bloquea al equipo.
Existe en versión instalable, con una edición gratuita y otras de pago, y como servicio en la nube, SonarQube Cloud. Su extensión para el editor avisa de los problemas mientras escribes.
Úsalo cuando
Cuando quieres que la calidad y la seguridad básica del código se comprueben en cada pull request, sin depender de que alguien se acuerde de revisarlo.
Ten en cuenta
Un quality gate en verde no significa «seguro»: el análisis estático no ve la mayoría de los fallos de control de acceso. Y marcar los hotspots como seguros sin revisarlos anula su utilidad.
sonar.projectKey=tienda-api
sonar.sources=src
sonar.tests=src
sonar.test.inclusions=**/*.spec.ts
sonar.javascript.lcov.reportPaths=coverage/lcov.info
# En CI: espera al quality gate y falla si no se cumple
sonar.qualitygate.wait=trueInteractivo
Los tres marcos de OWASP
Activa o desactiva opciones para compararlas cara a cara.
| Característica | Top 10 | ASVS | SAMM |
|---|---|---|---|
| Qué es | Lista de concienciación | Estándar de requisitos verificables | Modelo de madurez |
| Pregunta que responde | ¿Qué suele fallar en las aplicaciones web? | ¿Cumple esta aplicación lo que debe? | ¿Cómo trabaja la seguridad nuestra organización? |
| Para quién | Todo el equipo | Desarrollo, QA y auditores | Responsables de equipos y de seguridad |
| Niveles | No tiene: es una lista | 1, 2 y 3, según el riesgo de la aplicación | De 1 a 3 en cada práctica |
| Úsalo para | Formar y priorizar | Definir requisitos y auditar | Planificar mejoras a largo plazo |
Ponlo en práctica
Saber qué es cada cosa es la mitad del trabajo. La otra mitad es reconocer cuándo usarla.
Interactivo
¿Qué usarías?
Lee cada situación y elige la opción que mejor la resuelve. Fallar aquí no cuenta: es para practicar.
Se incorporan cinco desarrolladores junior y quieres darles, en una tarde, una visión de los riesgos más habituales de las aplicaciones web.
Para recordar
- El OWASP Top 10 sirve para concienciar y priorizar; en sus ediciones recientes lo encabeza el control de acceso roto.
- El ASVS da requisitos verificables en tres niveles, y SAMM mide la madurez del programa de seguridad de una organización.
- Lockfile en el repositorio,
npm cien CI ynpm auditson lo mínimo para controlar tus dependencias. - La procedencia firmada (Sigstore, SLSA) prueba dónde se construyó un artefacto, y el SBOM, qué contiene.
- SAST, DAST y SCA se complementan; los quality gates de SonarQube los convierten en una barrera en el pipeline.
Comprueba lo aprendido
Cuestionario
Responde las 5 preguntas para completar la lección.
1.¿Qué es exactamente el OWASP Top 10?
2.¿Qué nivel del ASVS se recomienda para la mayoría de las aplicaciones que manejan datos sensibles?
3.¿Para qué sirve usar
npm cicon el lockfile en el pipeline?4.¿Qué problema resuelve un SBOM?
5.SonarQube marca un fragmento de código como security hotspot. ¿Qué significa?