Saltar al contenido
Open Security
Ciberseguridad Práctica Intermedio · 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.