Parte: 11 — DevSecOps y seguridad del SDLC · Fuente: Securing DevOps (Julien Vehent) y OWASP Web Security Testing Guide (WSTG) ⏱️ Duración estimada: 120 min · Nivel: Intermedio
Aprender el análisis dinámico de seguridad (DAST): probar la aplicación en ejecución, como lo haría un atacante externo, para encontrar vulnerabilidades que el análisis estático no ve (errores de configuración, fallos de autenticación en runtime, cabeceras inseguras, inyecciones observables). Integraremos OWASP ZAP en el pipeline con escaneos automatizados y aprenderemos a diferenciar cuándo usar DAST frente a SAST.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | DAST vs SAST vs IAST | Cada uno ve cosas distintas; son complementarios |
| 2 | ZAP: proxy, spider, active scan | El flujo de trabajo del escaneo dinámico |
| 3 | Passive vs active scanning | Pasivo no ataca; activo envía payloads |
| 4 | Autenticación en el escaneo | Sin login solo se prueba la superficie pública |
| 5 | DAST en CI contra staging | Entorno efímero desplegado para el escaneo |
| 6 | Falsos positivos y tuning | Ajustar reglas y umbrales |
| 7 | Límites del DAST | No ve el código; cobertura depende del crawling |
Levantar el objetivo de práctica y ZAP con Docker:
# App vulnerable de práctica (tuya, en local):
docker run --rm -p 3000:3000 bkimminich/juice-shop
# Escaneo baseline con ZAP:
docker run --rm -t ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py -t http://host.docker.internal:3000 -r reporte.html
Nota ética: DAST envía tráfico de ataque real. Ejecútalo únicamente contra sistemas de tu propiedad o con autorización explícita por escrito. Nunca escanees sitios de terceros.
localhost:3000 (es una app diseñada para practicar).docker run --rm -t ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py -t http://host.docker.internal:3000 -r baseline.html -I
Revisa el informe: cabeceras faltantes (CSP, HSTS), cookies inseguras. 3. Escaneo full/activo contra staging (nunca producción):
docker run --rm -t ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py -t http://host.docker.internal:3000 -r full.html
zap-baseline.py, (c) publique el informe y (d) falle si hay hallazgos por encima del umbral. Usa la GitHub Action zaproxy/action-baseline.-c reglas.conf) para bajarlos a WARN/IGNORE y reejecuta.zap-baseline en un pipeline y haz que falle con hallazgos High.Automatiza un escaneo DAST autenticado en CI contra un entorno de staging efímero.
Criterio de aceptación: (a) el pipeline despliega la app en un contenedor temporal; (b) ZAP escanea con sesión autenticada válida; (c) el job publica el informe HTML como artefacto; (d) el build falla si hay vulnerabilidades por encima de un umbral definido; y (e) existe un fichero de reglas que suprime al menos un falso positivo justificado.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| ZAP no encuentra vulnerabilidades en zonas privadas | Falta contexto de autenticación. Configura usuario y sesión en ZAP. |
| El active scan corrompe datos de staging | Es esperado: envía ataques reales. Usa datos desechables y snapshots. |
| Cobertura baja del escaneo | El spider no descubre rutas SPA/JS. Usa el AJAX Spider o alimenta URLs manualmente. |
| El pipeline falla siempre con las mismas alertas | Falsos positivos no suprimidos. Añade un fichero de reglas con IGNORE. |
| Se intenta escanear producción | Riesgo legal y de disponibilidad. DAST activo solo en entornos propios/autorizados. |
❓ ¿Puedo correr DAST en cada PR? El baseline (pasivo) sí, es rápido y seguro. El active scan es más lento; suele correrse en nightly o antes de release contra staging.
❓ ¿DAST reemplaza al pentest manual? No. Automatiza la detección de fallos comunes, pero un pentester encuentra lógica de negocio, cadenas de explotación y bypass de autorización que ninguna herramienta detecta.
❓ ¿Por qué DAST no ve una inyección que SAST sí? Si el crawler no llega a esa ruta o no genera el input adecuado, no la ejercita. La cobertura de DAST depende del descubrimiento; por eso SAST y DAST son complementarios.
❓ ¿Es seguro correr ZAP contra mi app? El baseline sí. El active scan envía payloads que pueden crear/borrar datos: úsalo solo en entornos desechables tuyos.
Clase 238 — SAST: análisis estático de código