Saltar al contenido
Open Security
Ciberseguridad PrácticaIntermedio· 30 min

Threat modeling de una app chica

No necesitás un framework caro ni un equipo de seguridad para pensar en amenazas. Con cuatro preguntas y un diagrama de flujo de datos, encontrás los riesgos reales de tu app antes de escribir una línea de defensa.

#ciberseguridad#threat-modeling#diseño

Antes de empezar necesitás

  • Haber construido o leído el diseño de una app web simple
  • Idea básica de autenticación vs autorización

Al terminar vas a poder

  • Dibujar un data flow diagram simple con sus trust boundaries
  • Aplicar STRIDE como checklist de amenazas, sin ceremonia
  • Priorizar riesgos por impacto y probabilidad, no por miedo
  • Traducir cada amenaza en una mitigación concreta

Threat modeling suena a reunión de tres horas con consultores. No lo es. En el fondo son cuatro preguntas que te hacés mirando un dibujo de tu app: ¿qué estás construyendo? ¿qué puede salir mal? ¿qué vas a hacer al respecto? ¿lo hiciste bien? El resto es disciplina, no herramientas.

Paso 1: dibujá el flujo de datos

No podés proteger lo que no ves. Un data flow diagram muestra por dónde viajan los datos y, sobre todo, dónde cruzan un trust boundary: el límite entre algo que controlás y algo que no.

flowchart LR
U[Usuario / navegador] -->|HTTPS| A[API / backend]
A -->|query| D[(Base de datos)]
A -->|lee/escribe| S[(Bucket de archivos)]
A -->|llama| X[API externa de pagos]
subgraph confiable [Tu infraestructura]
  A
  D
  S
end
App chica: el trust boundary está donde los datos del usuario (no confiable) entran a tu sistema.

Todo lo que cruza desde “Usuario” hacia “Tu infraestructura” es input no confiable. Esa frontera es donde viven la mayoría de los bugs de seguridad.

Paso 2: STRIDE como checklist

STRIDE es un acrónimo para no olvidarte ninguna familia de amenaza. Recorrés cada flecha del diagrama y te preguntás las seis:

S  Spoofing        ¿alguien puede hacerse pasar por otro?       → autenticación
T  Tampering       ¿pueden alterar datos en tránsito o reposo?  → integridad, TLS, validación
R  Repudiation     ¿pueden negar que lo hicieron?               → logs, auditoría
I  Info disclosure ¿se filtra info que no debería?              → cifrado, mínimo privilegio
D  Denial of svc   ¿pueden tirarlo abajo o saturarlo?           → rate limiting, timeouts
E  Elevation       ¿pueden ganar permisos que no les tocan?     → authz, IDOR

Paso 3: priorizá por impacto, no por miedo

Vas a encontrar más amenazas de las que podés arreglar hoy. Ordenalas por impacto × probabilidad, no por cuál suena más aterradora:

amenaza                          impacto   prob.   prioridad
IDOR en /facturas/{id}           alto      alta    🔴 ahora
Sin rate limit en /login         medio     alta    🟠 pronto
Logs sin el actor de la acción   medio     media   🟡 backlog
DoS por payload gigante          bajo      baja    ⚪ después

Paso 4: cada amenaza, una mitigación

El modelo recién sirve cuando cada riesgo alto tiene una acción concreta y un responsable:

amenaza                  mitigación concreta
IDOR en /facturas/{id}   chequeo de ownership: owner_id == sub (404 si no)
Sin rate limit en login  límite por IP + backoff; alertar sobre picos
Repudiation              log con actor, acción, recurso y timestamp
Info disclosure en S3    Block Public Access + roles de IAM acotados

Lo que practicás en este lab

Llevátelo a tu repo si querés, pero no es obligatorio: es tu aprendizaje.

  • Un data flow diagram de tu app con los trust boundaries marcados
  • Una tabla STRIDE: amenaza → dónde aplica → mitigación
  • Writeup de 2 líneas: el riesgo más alto que encontraste y por qué

Reto

Tomá una app que conozcas (o la de ejemplo de abajo). Dibujá su flujo de datos, marcá un trust boundary y encontrá una amenaza por cada letra de STRIDE que aplique. Elegí la más grave y escribí en dos líneas cómo la mitigarías.

Resolvelo y escribí dos líneas explicando qué pasó. Con eso lo fijás.

¿Hiciste el lab?

Si querés, guardá lo que hiciste (comandos, notas, un repo) para volver después. Y si encontrás un error o querés mejorar este lab,contribuí al repo. El progreso se guarda solo en tu navegador.