Read in English · Lire en français · Auf Deutsch lesen
Sección 8.2 de 8.8 · Intermedio · 22 min de lectura
Modelado de amenazas: STRIDE, árboles de ataque y diagramas de flujo de datos
Videolección
5 min · narrado en inglés, con subtítulosSolo escuchar (audio)
Leer la transcripción
El modelado de amenazas es la forma en que los principios de seguridad se convierten en decisiones de diseño concretas. En esta lección verás cómo un equipo examina un diseño, descubre qué podría salir mal y decide qué hacer al respecto.
Antes de que una familia se vaya de vacaciones, alguien suele recorrer la casa preguntándose qué podría salir mal. ¿Está cerrada la puerta trasera? ¿Está la llave de repuesto debajo de la maceta? ¿Se acumulará el correo y delatará que no hay nadie en casa? Luego deciden qué hacer con cada cosa. El modelado de amenazas es ese mismo recorrido por un diseño de software: dibujar cómo se mueven los datos, preguntarse qué podría hacer un atacante en cada paso y decidir.
Adam Shostack, que dirigió el trabajo de modelado de amenazas en Microsoft, lo reduce a cuatro preguntas. Primera: ¿en qué estamos trabajando? Eso significa un modelo del sistema, normalmente un diagrama. Segunda: ¿qué puede salir mal? Las amenazas se encuentran de forma sistemática, no adivinando. Tercera: ¿qué vamos a hacer al respecto? Cada amenaza recibe una decisión. Cuarta: ¿lo hemos hecho suficientemente bien? Revisas el modelo y el seguimiento. Cualquier método que responda a estas cuatro preguntas es modelado de amenazas.
El modelo habitual es un diagrama de flujo de datos. Los rectángulos son entidades externas, las elipses son procesos, las líneas paralelas son almacenes de datos, las flechas son flujos de datos y los recuadros discontinuos son límites de confianza. Este muestra un nuevo proceso de pago. La app del cliente está fuera del límite de confianza de la plataforma. El flujo uno, el pedido y un token, cruza ese límite hacia el API gateway. Dentro, el servicio de pedidos pide a Precios que calcule el precio del carrito y graba el pedido en su base de datos. Una segunda zona, muy restringida, rodea a Pagos y su base de datos, que solo guardan tokens y referencias de pago. Pagos pide al proveedor de pagos que cobre el dinero, y el proveedor comunica el resultado mediante un webhook. Ambos flujos cruzan un límite, y los ataques siguen a los datos a través de los límites. Y fíjate en el flujo nueve, en la parte inferior. Los datos de la tarjeta van desde los campos alojados en la app directamente al proveedor, así que nunca llegan a entrar en la plataforma.
Para encontrar amenazas, la mayoría de los equipos usan STRIDE, creado en Microsoft en 1999. Cada letra nombra una amenaza que viola una propiedad. La suplantación, o spoofing, viola la autenticidad, como un proceso malicioso que se hace pasar por el servicio de pedidos. La manipulación, o tampering, viola la integridad: un cliente envía un total del carrito modificado. El repudio: alguien niega una acción y nada demuestra lo contrario. La divulgación de información viola la confidencialidad, como direcciones que se muestran a los repartidores equivocados. La denegación de servicio viola la disponibilidad. Y la elevación de privilegios viola la autorización. Una forma práctica de usarlo es recorrer cada elemento del diagrama, dedicando la mayor parte de la atención a los flujos que cruzan límites de confianza.
Los árboles de ataque miran desde el lado del atacante. La raíz es un objetivo: aquí, conseguir comida sin pagar. Cada hijo es una forma de alcanzarlo. Estos tres son alternativas, y cualquiera sirve: abusar de los cupones, cambiar el precio o pagar con una tarjeta robada. Pagar con una tarjeta robada necesita sus dos pasos a la vez. El atacante debe comprar los datos de la tarjeta y además superar los controles antifraude, lo que es costoso. Pero editar el total en la solicitud del cliente es trivial, si el servidor se fía de él. El camino más barato decide el riesgo. Así que recalcular cada precio en el servidor vale más que cualquier ajuste del sistema antifraude de tarjetas.
Esto es lo que salió de una sesión de noventa minutos sobre este proceso de pago. Un precio modificado se mitiga recalculando cada total en el servidor. Un llamante falso que pide reembolsos a Pagos se detiene con TLS mutuo e identidad de carga de trabajo. Un webhook falsificado de pago realizado se detiene comprobando la firma del proveedor y confirmando el estado. Adivinar los números de pedido de otros clientes se impide con una comprobación de propiedad en cada solicitud. Y los números de tarjeta no se mitigan en absoluto. Se eliminan. La forma más barata de protegerlos es no guardarlos.
Valora cada amenaza por probabilidad e impacto en una escala sencilla. El motivo escrito importa más que el número. Después, toda amenaza termina en una de cuatro decisiones: mitigar, eliminar, transferir a alguien mejor situado o aceptar. El fallo más habitual es la aceptación no registrada: se encontró la amenaza, nadie la corrigió y nadie decidió no corregirla. Modela las amenazas en la fase de diseño, cuando el cambio es más barato, y de nuevo cada vez que cambien los límites de confianza, los datos sensibles o la autenticación.
La sección completa incluye la tabla completa de amenazas del proceso de pago y los errores habituales que conviene evitar. A continuación, en la sección ocho punto tres, veremos la identidad y el acceso: ¿quién llama y qué puede hacer? Nos vemos allí.
Lo que necesitas saber
- El modelado de amenazas responde a las cuatro preguntas de Shostack: en qué estamos trabajando, qué puede salir mal, qué vamos a hacer al respecto y si lo hemos hecho suficientemente bien.
- Un diagrama de flujo de datos con entidades externas, procesos, almacenes de datos, flujos de datos y límites de confianza es el modelo habitual; los flujos que cruzan límites de confianza merecen la mayor atención.
- STRIDE (Kohnfelder y Garg, Microsoft, 1999) nombra seis categorías de amenaza, cada una de las cuales viola una propiedad: suplantación o spoofing (autenticidad), manipulación o tampering (integridad), repudio (no repudio), divulgación de información (confidencialidad), denegación de servicio (disponibilidad) y elevación de privilegios (autorización).
- Los árboles de ataque (Schneier, 1999) modelan el objetivo de un atacante como nodos AND y OR; el camino más barato a través del árbol muestra dónde importa más una mitigación.
- Valora las amenazas por probabilidad e impacto, con los motivos por escrito; DREAD cayó en desuso porque sus puntuaciones eran subjetivas, y CVSS valora vulnerabilidades conocidas, no amenazas de diseño.
- Toda amenaza termina mitigada, eliminada, transferida o aceptada de forma explícita por alguien con autoridad para ello; modela las amenazas en la fase de diseño y de nuevo cada vez que cambien los límites de confianza, los datos o la autenticación.
Qué es el modelado de amenazas
El modelado de amenazas es la actividad de examinar un diseño para descubrir qué podría fallar en su seguridad y decidir qué hacer al respecto, antes de que lo descubran por ti los atacantes o los incidentes. Es la principal vía por la que los principios de seguridad se convierten en decisiones concretas, y la respuesta más directa a la categoría de OWASP de diseño inseguro: defectos que ninguna cantidad de código correcto puede arreglar porque el control necesario nunca se diseñó.
Adam Shostack, que dirigió el trabajo de modelado de amenazas en Microsoft y escribió el libro de referencia sobre el tema, reduce la actividad a cuatro preguntas. ¿En qué estamos trabajando? (un modelo del sistema, normalmente un diagrama). ¿Qué puede salir mal? (amenazas, encontradas de forma sistemática). ¿Qué vamos a hacer al respecto? (mitigar, eliminar, transferir o aceptar cada amenaza). ¿Lo hemos hecho suficientemente bien? (revisar el modelo, las amenazas y el seguimiento). Cualquier método que responda a las cuatro preguntas es modelado de amenazas; el resto de esta sección describe las técnicas que la mayoría de los equipos usan para responderlas.
En 2020, un grupo de profesionales, entre ellos Shostack, publicó el Threat Modeling Manifesto, inspirado en el Manifiesto Ágil. Valora una cultura de encontrar y corregir problemas de diseño por encima del cumplimiento de casillas, las personas y la colaboración por encima de los procesos y las herramientas, un camino de comprensión por encima de una instantánea de seguridad puntual, hacer modelado de amenazas por encima de hablar de él, y el refinamiento continuo por encima de una única entrega. Su idea es que el modelado de amenazas es un hábito del equipo que construye el sistema, no un documento que elaboran personas ajenas una vez al año.
Modelar el sistema: diagramas de flujo de datos y límites de confianza
La primera pregunta necesita un modelo del sistema que muestre adónde van los datos y dónde cambia la confianza. La opción tradicional es un diagrama de flujo de datos (DFD) con cinco tipos de elementos: entidades externas (personas o sistemas fuera de tu control, dibujados como rectángulos), procesos (código que ejecutas tú, dibujado como círculos o elipses), almacenes de datos (bases de datos, archivos, colas y cachés, dibujados entre dos líneas paralelas), flujos de datos (flechas que muestran los datos que se mueven entre los demás elementos) y límites de confianza (líneas o recuadros discontinuos donde cambia el nivel de confianza).
Los DFD encajan con el modelado de amenazas porque los ataques siguen a los datos: cada flujo que cruza un límite de confianza es un lugar donde un atacante puede inyectar, interceptar o reenviar algo. Un diagrama de contenedores C4 del Capítulo 4 es un buen punto de partida: añade los límites de confianza, convierte cada flecha en un flujo de datos con dirección y etiqueta, e incluye los almacenes y las colas que los diagramas de contenedores a veces dejan implícitos. Mantén el diagrama en el nivel en el que se encuentran las amenazas: un diagrama por cada funcionalidad o flujo significativo es más útil que un único diagrama enorme de todo.
Encontrar amenazas con STRIDE
STRIDE lo crearon en Microsoft en 1999 Loren Kohnfelder y Praerit Garg como regla mnemotécnica para ayudar a los desarrolladores a pensar en las amenazas a sus productos. Cada letra nombra una categoría de amenaza, y cada categoría es la violación de una propiedad de seguridad, que es lo que la hace útil: es un estímulo sistemático, no una lista de ataques conocidos.
STRIDE y la propiedad que viola cada amenaza
| Amenaza | Propiedad violada | Ejemplo de reparto de comida | Mitigaciones habituales |
|---|---|---|---|
| Spoofing (suplantación) | Autenticidad | Un atacante inicia sesión como cliente con una contraseña obtenida por relleno de credenciales; un proceso malicioso llama a Pagos haciéndose pasar por Pedidos. | Autenticación fuerte (MFA, passkeys), límites de tasa, TLS mutuo e identidad de carga de trabajo entre servicios. |
| Tampering (manipulación) | Integridad | Un cliente envía un total del carrito modificado; alguien altera un webhook de pago o una fila de la base de datos. | Recálculo en el servidor, firmas y MAC, TLS, acceso de escritura con mínimo privilegio. |
| Repudiation (repudio) | No repudio (responsabilidad) | Un cliente niega haber hecho un pedido; un agente de soporte niega haber emitido un reembolso, y nada demuestra lo contrario. | Logs de auditoría vinculados a identidades autenticadas, marcas de tiempo, almacenamiento a prueba de manipulaciones. |
| Information disclosure (divulgación de información) | Confidencialidad | Una API devuelve las direcciones de los clientes a repartidores que no les están haciendo una entrega; los mensajes de error revelan detalles internos. | Autorización en cada objeto, minimización de datos, cifrado, mensajes de error genéricos. |
| Denial of service (denegación de servicio) | Disponibilidad | Unos bots inundan el proceso de pago durante el pico de la noche; una consulta de búsqueda costosa agota la base de datos. | Límites de tasa y cuotas, timeouts, bulkheads, autoescalado, límites al costo de las consultas. |
| Elevation of privilege (elevación de privilegios) | Autorización | Un cliente llama a un endpoint de gerente de restaurante; una inyección permite a un atacante ejecutar código con la identidad del servicio. | Autorización con denegación por defecto, validación de la entrada, sandboxing, mínimo privilegio. |
Una forma práctica de aplicar STRIDE es STRIDE por elemento: recorrer cada elemento del DFD y hacer solo las preguntas que se aplican a su tipo. Las entidades externas pueden ser suplantadas y pueden repudiar; los procesos están expuestos a las seis categorías; los almacenes de datos, a la manipulación, la divulgación de información y la denegación de servicio (y al repudio cuando el almacén es un log); los flujos de datos, a la manipulación, la divulgación de información y la denegación de servicio. Dedicar la mayor parte de la atención a los flujos que cruzan límites de confianza mantiene el ejercicio centrado.
STRIDE encuentra amenazas; no las clasifica por prioridad ni elige mitigaciones. Además, en la práctica sus categorías se solapan (una identidad suplantada suele llevar a la divulgación de información o a la elevación de privilegios), lo cual no importa: el objetivo es encontrar la amenaza, no clasificarla a la perfección. Para las amenazas a la privacidad, como vincular o identificar a personas a partir de datos que parecen inofensivos, el método LINDDUN de la KU Leuven cumple el papel que STRIDE cumple para la seguridad; se trata junto con la privacidad desde el diseño.
Árboles de ataque
Un árbol de ataque, popularizado por Bruce Schneier en un artículo de 1999 en Dr. Dobb's Journal, mira el sistema desde el lado del atacante. La raíz es un objetivo, como conseguir comida sin pagar; cada hijo es una forma de alcanzar a su padre. Los hijos de un nodo OR son alternativas; todos los hijos de un nodo AND se necesitan a la vez. Las hojas pueden anotarse con propiedades como el costo, la habilidad necesaria o si el paso es siquiera posible, y esos valores se propagan hacia arriba por el árbol: el costo de un nodo OR es el de su hijo más barato, y el de un nodo AND, la suma de sus hijos.
Los árboles de ataque complementan bien a STRIDE. STRIDE recorre el diseño elemento a elemento y es bueno para la cobertura; un árbol de ataque sigue a un atacante motivado y es bueno para mostrar qué camino es el más barato y, por tanto, dónde rinde más una mitigación. En el árbol de abajo, pagar con una tarjeta robada es relativamente costoso porque necesita dos cosas a la vez, mientras que cambiar el precio en la solicitud del cliente es trivial si el servidor se fía de él. El camino más barato fija el riesgo, así que recalcular cada precio en el servidor vale más que cualquier ajuste del sistema antifraude de tarjetas.
Valorar el riesgo
Un modelo de amenazas suele encontrar más amenazas de las que un equipo puede abordar a la vez, así que cada una necesita una valoración. El enfoque habitual es juzgar la probabilidad (lo fácil, lo atractiva y lo expuesta que es) y el impacto (qué se pierde si ocurre: dinero, datos personales, disponibilidad, reputación, exposición legal) en escalas sencillas como baja, media y alta, y combinarlos en una matriz. El valor de la valoración reside menos en la precisión del número que en un motivo escrito que otros puedan cuestionar. Las organizaciones con una gestión de riesgos madura usan a veces métodos cuantitativos como FAIR (Factor Analysis of Information Risk) para expresar el riesgo como un rango de pérdida esperada.
Conviene conocer dos atajos populares porque a menudo se usan mal. DREAD (damage, reproducibility, exploitability, affected users, discoverability: daño, reproducibilidad, explotabilidad, usuarios afectados y descubribilidad), que se usó en su día en Microsoft, puntuaba cada amenaza en cinco factores (a menudo de 1 a 10) y hacía la media. Cayó en desuso, también en Microsoft, porque distintas personas puntuaban la misma amenaza de forma muy diferente y el número promediado daba una falsa sensación de precisión; la descubribilidad, en particular, premia la ocultación, lo que contradice el diseño abierto. CVSS, el Common Vulnerability Scoring System que mantiene FIRST (versión 4.0, 2023), es la herramienta adecuada para otra tarea: valorar la gravedad de una vulnerabilidad conocida en un producto, como un defecto en una biblioteca. Su puntuación base describe la vulnerabilidad, no el riesgo de una amenaza de diseño en tu contexto, así que no debe usarse para priorizar el resultado de un modelo de amenazas.
Toda amenaza termina en una de cuatro decisiones: mitigar (añadir un control), eliminar (quitar la funcionalidad o los datos, a menudo la mejor opción), transferir (dejar que la asuma alguien mejor situado, como un proveedor de pagos que guarda los datos de las tarjetas) o aceptar (dejar constancia de que una persona con autoridad para ello ha aceptado el riesgo residual, y de por qué). La aceptación no registrada es el fallo más habitual: se encontró la amenaza, nadie la corrigió y nadie decidió no corregirla.
Ejemplo práctico
Ejemplo práctico: modelar las amenazas del proceso de pago
El equipo de reparto de comida está rediseñando el proceso de pago para que los clientes puedan pagar en la app con una tarjeta o un monedero digital. El arquitecto dirige una sesión de 90 minutos con los desarrolladores de pedidos y de pagos, un product owner y un campeón de seguridad. El DFD de abajo responde a la primera pregunta, en qué estamos trabajando. Muestra dos límites de confianza: la plataforma en su conjunto y una zona de pagos más estrecha y muy restringida (etiquetada como zona PCI) en torno al servicio de pagos y su base de datos, que guardan tokens y referencias de pago y se comunican con el proveedor de pagos; aislarlos mantiene pequeño el alcance de PCI DSS de la plataforma. Los datos de las tarjetas en sí (flujo 9) van directamente desde los campos de pago alojados en la app al proveedor de pagos y nunca entran en la plataforma.
| 1. ¿En qué estamos trabajando? | El DFD del proceso de pago de abajo: la app del cliente, el API gateway, Pedidos, Precios, Pagos, dos bases de datos y el proveedor de pagos, con dos límites de confianza (la plataforma y la zona PCI) y nueve flujos numerados. |
|---|---|
| 2. ¿Qué puede salir mal? | STRIDE por elemento en cada flujo que cruza un límite (1, 5, 6, 8 y 9) y en la API de pedidos, más el árbol de ataque para conseguir comida sin pagar que se mostró antes. |
| 3. ¿Qué vamos a hacer al respecto? | Cada amenaza recibe una valoración, una decisión (mitigar, eliminar, transferir o aceptar) y un responsable; las más importantes están en la tabla de abajo. |
| 4. ¿Lo hemos hecho suficientemente bien? | Una revisión un mes después compara el modelo con lo que se construyó y comprueba que cada riesgo alto se mitigó o se aceptó por escrito. |
La forma más barata de proteger los números de tarjeta es no guardarlos: el flujo 9 los mantiene por completo fuera de la plataforma, lo que elimina amenazas en lugar de mitigarlas.
Amenazas seleccionadas del modelo de amenazas del proceso de pago
| ID y ubicación | STRIDE | Amenaza | Riesgo | Decisión y mitigación |
|---|---|---|---|---|
| T1, flujo 1 | S | El relleno de credenciales permite hacerse con cuentas que tienen tarjetas guardadas. | Alto | Mitigar: passkeys, o MFA en dispositivos nuevos; límites de tasa por cuenta e IP; comprobación de contraseñas filtradas. |
| T2, flujos 1 y 2 | T | El cliente envía un precio, un descuento o un gasto de envío alterados. | Alto | Mitigar: Pedidos ignora los precios del cliente; Precios los recalcula a partir de las cartas y los cupones; el pago se crea por el total del servidor. |
| T3, flujo 5 | S, E | Otro servicio interno, o un atacante dentro de la red, pide a Pagos que autorice o reembolse importes arbitrarios. | Alto | Mitigar: TLS mutuo con identidad de carga de trabajo; Pagos solo acepta autorizaciones de la identidad de Pedidos, vinculadas a un ID de pedido y a un importe. |
| T4, flujo 8 | S, T | Un webhook falsificado de "pago realizado" marca como pagado un pedido sin pagar. | Alto | Mitigar: verificar la firma y la marca de tiempo del proveedor; confirmar el estado con la API del proveedor antes de liberar el pedido; procesar cada evento una sola vez. |
T5, GET /orders/{id} | I | Enumerar los ID de pedido revela las direcciones de otros clientes (autorización a nivel de objeto rota). | Alto | Mitigar: comprobación de propiedad en cada solicitud; identificadores aleatorios solo como medida secundaria. |
| T6, BD de pedidos | I | Los registros de pedidos con direcciones se filtran desde una copia de seguridad o a través de una cuenta de analítica con permisos demasiado amplios. | Medio | Mitigar: cifrado en reposo con claves del KMS, cuentas con mínimo privilegio, copias de seguridad en una cuenta separada. |
| T7, flujo 1 | D | Unos bots agotan la capacidad del proceso de pago en el pico de la noche. | Medio | Mitigar: límites de tasa y detección de bots en el borde, capacidad reservada para el proceso de pago, una sala de espera si hace falta. |
| T8, Pedidos | R | Un cliente niega haber hecho un pedido y no hay pruebas. | Bajo | Mitigar: evento de auditoría con el ID de usuario, el dispositivo, la hora y los detalles del pedido, conservado según la política. |
| T9, flujo 9 | I | Si los números de tarjeta pasaran por la plataforma, todos los componentes entrarían en el alcance de PCI DSS. | Diseño | Eliminar y transferir: los campos alojados envían los datos de la tarjeta directamente al proveedor; la plataforma solo guarda tokens y referencias. |
Las respuestas a las dos últimas preguntas son tan importantes como la tabla. Cada mitigación se convierte en un elemento del backlog con un responsable; T3 y T4 se convierten además en escenarios de seguridad con pruebas automatizadas (un webhook con una firma incorrecta debe rechazarse; una llamada a Pagos desde cualquier identidad distinta de Pedidos debe fallar). Las dos decisiones arquitectónicas, los campos de pago alojados y el TLS mutuo entre Pedidos y Pagos, se registran como ADR. Para la cuarta pregunta, el equipo revisa el modelo un mes después frente a lo que realmente se construyó, y el campeón de seguridad comprueba que cada elemento de riesgo alto se mitigó o se aceptó de forma explícita.
Cuándo y con qué frecuencia modelar las amenazas
El modelado de amenazas rinde más en la fase de diseño, cuando cambiar una decisión cuesta lo que una pasada de borrador por la pizarra. Después debe repetirse cada vez que cambia algo significativo: un nuevo límite de confianza o una nueva integración externa, un nuevo tipo de datos sensibles, un cambio en la autenticación o la autorización, un nuevo entorno de despliegue o el paso de un monolito a servicios. Una regla sensata es convertir "¿cambia esto el modelo de amenazas?" en una pregunta de las revisiones de diseño y de la plantilla de los registros de decisiones de arquitectura, y programar una revisión del modelo de cada sistema al menos una vez al año y después de cada incidente de seguridad.
El esfuerzo debe ser proporcionado, en el espíritu del enfoque guiado por el riesgo del Capítulo 1. Un nuevo microservicio que procesa pagos merece una sesión de media jornada con un DFD completo; añadir un campo a una carta pública necesita cinco minutos y un vistazo con STRIDE al flujo modificado. Muchos equipos mantienen su DFD como código junto al sistema (OWASP Threat Dragon y la Threat Modeling Tool de Microsoft son herramientas gratuitas de diagramación, y bibliotecas como OWASP pytm generan diagramas y amenazas candidatas a partir del código), para que el modelo se revise y se actualice junto con el sistema que describe.
Comprueba lo que has entendido
¿Qué categorías de STRIDE se aplican a un flujo de datos en STRIDE por elemento?
Manipulación, divulgación de información y denegación de servicio: los datos en tránsito se pueden alterar, leer o bloquear.
¿Por qué CVSS es la herramienta equivocada para priorizar las amenazas encontradas en un modelo de amenazas?
CVSS puntúa la gravedad de una vulnerabilidad conocida concreta en un producto; no tiene en cuenta tu diseño, tus activos ni tu contexto, así que no mide el riesgo de una amenaza a nivel de diseño.
En un árbol de ataque, ¿cómo se calcula el costo de un nodo AND a partir de sus hijos, y por qué importa?
Es la suma de los costos de sus hijos, porque se necesitan todos los pasos. Por eso los nodos AND suelen ser caminos costosos, mientras que el hijo más barato de un nodo OR fija el riesgo.
¿Cuál es el fallo más habitual en el cuarto paso del modelado de amenazas?
Amenazas que se encontraron pero ni se corrigieron ni se aceptaron de forma explícita: nadie es responsable de ellas y nadie decidió convivir con ellas.
Fuentes y lecturas recomendadas
¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.
Pregunta: “¿Cómo dirigiría una primera sesión de modelado de amenazas para una nueva funcionalidad de pagos y qué debería salir de ella?”