Seguridad de aplicación es una rama en la cual se ve bastante temas de vulnerabilidades, pentesting, análisis de amenazas e incluso respuesta incidentes (Al menos en mi caso); sin embargo creo que hay algo que no se ve, o no llegué a ver en AppSec : el Modelado de amenaza.
Desde el punto de vista del desarrollador, es un proceso estructurado que permite identificar, analizar y priorizar las amenazas potenciales con base en las funcionalidades y caracteristicas de la aplicación. El análisis de la arquitectura, flujos de datos , actores que interactuan, permite anticipar los vectores de ataques de forma anticipada.
Para el Pentester, es una herramienta para mapear las superficie de ataque, identificar vectores prioriatrios y estructurar las pruebas con mayor precisión, realizando un trabajo quirurgico con base en las amenazas y vectores identificados.
Para este caso práctico de modelado de amenazas utilizaremos DVWA https://github.com/digininja/DVWA, aplicación desarrollada deliberadamente vulnerable para prácticar y mejorar las habilidades de seguridad web, pentesting web, hacking web, o como querras llamarlo.
1.- Metodología
- Descomponer : ¿Qué funcionalidad ofrece la aplicación? , Salida : Mapa de Capacidades
- Modelar diseño : ¿Quién las usa y qué datos/activos tocan?, Salida : DFD por funcionalidad
- Enumerar Amenazas: ¿Qué podria salir mal (STRIDE)?, Salida : Hipótesis de amenaza
- Planificar Verificación: ¿ Cómo confirmo o descarto cada hipétesis?, Salida: Técnica de prueba por amenaza.
- Ejecutar pruebas: ¿Qué ocurre en un entorno controlado? , Salida: Evidencia
- Corroborar: ¿La hipótesis es real?, Salida : Veredicto (Confirmada / Refutada)
- Documentar: ¿Qué priorizamos y mitigamos?, Salida: Registro + backlog

2.- Descomposición funcional
DVWA se analizó como un conjunto de capacidades de negocio, dejando a un lado las vulnerabilidades. Cada módulo se re interpreta como una funcionalidad que presentaría una aplicación real. En la siguiente imagen solo estan mapeados algunas de las funciones, como un ejemplo, no estan todas las funcionalidades mapeadas.

| ID | Funcionalidad (negocio) | Módulo DVWA | Propósito declarado |
|---|---|---|---|
| F1 | Inicio de sesión | brute / login.php | Autenticar a un usuario con credenciales |
| F3 | Generación de identificador de sesión | weak_id | Emitir un token que identifica la sesión |
| F4 | Cambio de contraseña | csrf | Permitir al usuario actualizar su contraseña |
| F5 | Cambio de contraseña con CAPTCHA | captcha | Igual que F4 con verificación anti-bot |
| F6 | Control de acceso por rol | authbypass / bac | Restringir recursos según privilegios |
| F7 | Búsqueda de usuario por ID | sqli | Consultar datos de un usuario por identificador |
| F8 | Consulta con respuesta booleana | sqli_blind | Indicar existencia de un registro (sí/no) |
| F9 | API de datos | api | Exponer datos/operaciones de forma programática |
| F10 | Subida de ficheros | upload | Permitir cargar un fichero (p. ej. avatar) |
| F11 | Carga dinámica de páginas | fi | Cargar contenido/página según un parámetro |
| F12 | Saludo personalizado | xss_r | Mostrar un mensaje que incluye datos del usuario |
| F13 | Libro de visitas | xss_s | Publicar y mostrar mensajes a otros usuarios |
| F14 | Selección de idioma (cliente) | xss_d | Cambiar el idioma usando lógica de navegador |
| F16 | Reto validado en cliente | javascript | Enviar un valor que se valida en el navegador |
| F17 | Diagnóstico de red (ping) | exec | Comprobar conectividad hacia una dirección |
| F18 | Redirección de navegación | open_redirect | Llevar al usuario a otra ubicación |
| F19 | Cifrado / descifrado de datos | cryptography | Proteger datos mediante operaciones criptográficas |
3.-Modelo de diseño : Flujo genérico de una funcionalidad
Toda funcionalidad de DVWA comparte el mismo patrón de flujo de datos. Modelarlo una vez permite razonar las amenazas de forma sistemática y consistente: cada paso y cada cruce de frontera es un punto de control candidato.

Lectura del flujo: el usuario envía datos (1) que se reciben (2), deberían validarse y autorizarse (3), alimentan la lógica de negocio (4–5) y se renderizan en la respuesta (6). Las amenazas aparecen en los puntos donde un control esperado podría faltar o ser insuficiente: recepción, validación/autorización, acceso a recursos y construcción de la salida.
4.-Modelado de amenazas por funcionalidad (STRIDE)
Para cada funcionalidad se plantea qué podría salir mal según su propósito, sin mirar la implementación. Las categorías son STRIDE: Spoofing, Tampering, Repudiation, Info disclosure, Denial of service, Elevation
4.1.- Capacidad : Identidad y acceso

4.2.- Capacidad : Consulta de Datos

4.3.- Capacidad : Ficheros y contenido

5.- Mapa de trazabilidad amenaza (Verificación)
Cada hipótesis avanza por el mismo recorrido hasta un veredicto. Este es el núcleo del enfoque: el modelo produce preguntas; la verificación produce respuestas.

6.- Plan de verificación y confirmación
Para cada hipótesis se asigna una técnica de verificación y un criterio de corroboración (qué evidencia confirma o refuta la amenaza). Todas las pruebas se ejecutan en el entorno aislado de DVWA (127.0.0.1).

Niveles de seguridad como banco de pruebas
DVWA permite repetir cada verificación bajo cuatro configuraciones (low, medium, high, impossible). Esto convierte la corroboración en un experimento controlado:
- Una hipótesis que se confirma en
lowpero se refuta enimpossibledemuestra que el control esperado existe y funciona. - El punto exacto donde la amenaza deja de corroborarse identifica qué control concreto la mitiga (limitación de tasa, parametrización, token de intención, validación servidor, etc.).
7.- Registro de resultados (Plantilla)
La corroboración se documenta de forma homogénea para cada hipótesis y configuración:

El modelado de amenazas nos permite anticipar a vectores de ataques, en el caso de desarrolladores, ahora para vos que queres ser Web Pentester, te permite mapear de manera quirurgicas las posibles vulnerabilidades para intentar explotarlas, no reemplaza tu metodologia de web pentesting, la complementa.
Hasta la proxima!