M188 sem · 160 h32 lecciones

Sigla en azul →glosario(primera vez: expansión entre paréntesis).

M18 — Seguridad del software (AppSec)

Por qué existe

Es la capa B de la pista de ciberseguridad. Un ingeniero que “sabe hacer CRUDs” pero deja SQLi (inyección SQL)/XSS (cross-site scripting)/IDOR (referencia directa insegura a un objeto) no es competente. Aquí aprendes a modelar amenazas, romper (solo tu sistema) y reparar.

En resumen: amenazas → PoC (prueba de concepto) en tu app → fix → test. Las siglas azules están en el glosario.

Objetivos de aprendizaje

  1. Hacer threat modeling ligero (STRIDE (modelo de amenazas en 6 categorías)) de tu producto.
  2. Explicar y mitigar el OWASP (proyecto abierto de seguridad en aplicaciones web) Top 10 en código real.
  3. Diseñar auth (hashing, sesiones/JWT (JSON Web Token), CSRF (falsificación de petición en sitios cruzados)) sin inventar crypto.
  4. Meter seguridad en el pipeline (secrets, npm audit, headers).
  5. Escribir tests que fallen si reaparece una vulnerabilidad básica.

Cómo estudiar esta materia (lecciones)

M18 es la capa B de AppSec (seguridad de aplicaciones) con lecciones L01–L32 (formato M01): amenaza → PoC en tu Agenda Ops → fix → test.

  1. Orden L01 → L32; marca solo con “Hecho cuando” cumplido.
  2. Solo atacas localhost/staging que controlas.
  3. Evidencia en projects/m18-appsec/ y commits de hardening en el repo del producto.
  4. OWASP Top 10 y Cheat Sheets en español; mapa cada lectura a un endpoint real.
  5. Cómo estudiar y hilo seguridad.

Semana tipo (20 h)

Bloque Horas Qué haces
Lecciones OWASP 10–12 4× ~5 h (lectura + lab en tu API (interfaz de programación de aplicaciones))
Hallazgos P2 4–6 Tabla PoC → fix → test
CI (integración continua) / informe (P3) 4–6 Pipeline, headers, informe
Retro 1 Riesgo residual escrito

Si un día solo tienes 2 h: una lección práctica (pasos + evidencia). No saltes la lectura OWASP de esa lección.

Lecciones

Semana 1 — Threat modeling STRIDE y OWASP Top 10 (~20 h)

ID Lección ~h
L01 Activos, actores y datos sensibles en Agenda Ops 5
L02 Trust boundaries y flujos de confianza 5
L03 STRIDE aplicado al CRM de citas 5
L04 Threat model v0 y lectura OWASP Top 10 5

Semana 2 — Autenticación: hashing, sesiones y JWT (~20 h)

ID Lección ~h
L05 Inventario de autenticación actual 5
L06 Hashing de contraseñas con bcrypt o argon2 5
L07 Sesiones server-side vs JWT en Agenda Ops 5
L08 Threat model v1 post-autenticación (P1) 5

Semana 3 — Cookies, CSRF y ciclo de sesión (~20 h)

ID Lección ~h
L09 Cookies Secure, HttpOnly y SameSite 5
L10 CSRF en formularios y mutaciones state-changing 5
L11 Fijación de sesión y logout completo 5
L12 Checklist cookies y CSRF en staging 5

Semana 4 — Inyección: SQLi y XSS en Agenda Ops (~20 h)

ID Lección ~h
L13 SQLi: reproducir en tu propia API 5
L14 Mitigar SQLi: queries parametrizadas y permisos DB 5
L15 XSS reflejado en campos de cliente o búsqueda 5
L16 XSS almacenado y escape en plantillas/API 5

Semana 5 — Control de acceso, IDOR y rate limiting (~20 h)

ID Lección ~h
L17 IDOR en citas y recursos por ID 5
L18 Autorización por rol owner vs staff 5
L19 Rate limiting en login y endpoints sensibles 5
L20 Tests automatizados cross-user (P2 avance) 5

Semana 6 — SSRF, uploads y JSON de confianza (~20 h)

ID Lección ~h
L21 SSRF: superficie en webhooks e integraciones 5
L22 Subida de archivos segura 5
L23 Deserialización y JSON peligroso 5
L24 Consolidar hallazgos semana 6 en P2 5

Semana 7 — Dependencias, secretos, headers y CSP (~20 h)

ID Lección ~h
L25 npm audit y cadena de dependencias 5
L26 Secretos, .env y rotación 5
L27 Cabeceras de seguridad con Helmet o equivalente 5
L28 CSP básica sin romper Agenda Ops 5

Semana 8 — Secure SDLC, informe y tests de regresión (~20 h)

ID Lección ~h
L29 Pipeline CI: lint, test, audit, anti-secretos 5
L30 Estructura del informe AppSec 5
L31 Tests de regresión de seguridad (≥3) 5
L32 Cierre M18 — dominio y riesgo residual 5

Empieza por L01 hoy.

Lecturas (mapa rápido)

Canon: OWASP Top 10 + Cheat Sheets. Ver bibliografía y hilo seguridad.

Semana Lecciones Lectura OWASP / recurso Enfoque Agenda Ops
1 L01–L04 STRIDE / Threat Modeling Activos, boundaries, mapa Top 10
2 L05–L08 A07 Auth + Password Storage Hashing, sesión/JWT, threat model v1 (P1)
3 L09–L12 CSRF + Session Management Cookies, CSRF, checklist staging
4 L13–L16 A03 Injection + XSS Prevention SQLi/XSS en citas y clientes
5 L17–L20 A01 Access Control + Rate Limit IDOR, roles, tests cross-user
6 L21–L24 SSRF (falsificación de petición del lado del servidor), File Upload, API hardening Hallazgos P2 ≥5
7 L25–L28 A06 + Secrets + Headers + CSP (Content Security Policy) audit, rotación, Helmet, CSP
8 L29–L32 Secure SDLC (ciclo de vida del desarrollo de software) + informe CI P3, informe, ≥3 tests seguridad

Regla: hallazgo → PoC en tu app → fix → test. Nada de laboratorio genérico sin trasladar al piloto.

Ejemplo — hashing de contraseñas (idea correcta)

// Usa una lib madura (p.ej. bcrypt / argon2). NUNCA MD5/SHA solo.
import bcrypt from "bcrypt";

export async function hashPassword(plain: string): Promise<string> {
  return bcrypt.hash(plain, 12);
}

export async function verifyPassword(plain: string, hash: string): Promise<boolean> {
  return bcrypt.compare(plain, hash);
}

Ejemplo — IDOR (qué buscar)

Si GET /api/citas/123 devuelve la cita sin comprobar que pertenece al usuario autenticado, tienes IDOR. Fix: autorización por userId/rol en el servidor, no solo ocultar botones en el front.

Prácticas

  1. P1: Threat model v1 revisado (después de semana 2).
  2. P2: Tabla hallazgo → PoC (en tu app) → commit de fix → test.
  3. P3: CI con al menos: lint, test, npm audit (o equivalente), grep anti-secretos básico.

Proyecto útil

Entrega en projects/m18-appsec/:

  1. Informe AppSec (amenazas, hallazgos, mitigaciones, residual risk).
  2. PR (pull request)/commits de hardening en el repo del producto.
  3. ≥3 tests automatizados de seguridad (ej. usuario A no lee recurso de B; input XSS escapado).

Errores comunes

  • “Security by obscurity” (ocultar rutas admin sin auth).
  • Guardar JWT en localStorage sin entender XSS.
  • Inventar cifrado casero.
  • Atacar sitios ajenos (ilegal e inútil para tu egreso).

Evidencia de hecho

Marca la práctica en la UI (interfaz de usuario) solo si existe esto (o equivalente claro):

  • P1 — STRIDE: Documento de threat model v1.
  • P2 — ≥5 hallazgos: Tabla PoC → commit fix → test.
  • P3 — CI: Lint+test+audit (+ grep secretos).
  • Proyecto — Informe: projects/m18-appsec/ + PRs hardening.

Criterios de dominio

  • Explicas SQLi y XSS con ejemplo y mitigación.
  • Tu app no lee recursos cross-user (demo + test).
  • No hay secretos en el historial de git del producto.
  • Tienes checklist pre-deploy de seguridad y la usas.