Fundamentos de seguridad
La tríada CIA: confidencialidad, integridad y disponibilidad
La tríada CIA explicada: confidencialidad, integridad y disponibilidad, con ejemplos, comprobaciones de hash y firma, y diez incidentes.
Aprende diagramas de flujo de datos, límites de confianza y las seis categorías STRIDE, y modela un Juice Shop local en Threat Dragon.
STRIDE es una lista de seis categorías de amenaza: suplantación de identidad (spoofing), manipulación (tampering), repudio (repudiation), revelación de información (information disclosure), denegación de servicio (denial of service) y elevación de privilegios (elevation of privilege). Microsoft lo usa en su guía de modelado de amenazas. STRIDE no encuentra amenazas por usted. Le da seis preguntas que hacerle a cada parte de un diseño, para que el resultado no dependa de lo que recuerde en una tarde cualquiera.
El método va antes que la mayoría de las herramientas de seguridad. Un escáner revisa un sistema que ya está en marcha. Un modelo de amenazas revisa el plan: qué componentes existen, qué datos pasan entre ellos y en qué punto cambia el nivel de confianza. Se puede empezar con papel y lápiz antes de que exista cualquier código.
Muchas fallas de seguridad en aplicaciones web son fallas de diseño. El servidor confía en un precio que envió el navegador. Una ruta de administración comprueba que el usuario inició sesión, pero nunca comprueba que sea administrador. Un archivo de registro guarda tokens de sesión. Cada una de estas fallas se puede corregir en el código, pero el código suele reflejar el diseño que recibió. El problema empieza en el diseño.
La OWASP Threat Modeling Cheat Sheet dice lo mismo. Antes de saber qué amenazas aplican, hace falta entender los flujos de datos, los límites de confianza y las demás partes del sistema. Un modelo de amenazas deja escrito ese entendimiento en una forma que otras personas pueden revisar.
Un diagrama de flujo de datos (DFD) tiene cuatro tipos de elemento:
Mantenga el diagrama en una sola página. Si necesita una segunda, probablemente está dibujando dos sistemas.
Un límite de confianza es la línea por la que los datos pasan de un lugar con cierto nivel de confianza a otro con un nivel distinto. Su servidor está dentro de la línea. El navegador está fuera, porque quien lo usa puede cambiar cualquier solicitud antes de que llegue a usted. Todo flujo que cruza un límite necesita validación, y la mayoría de las amenazas interesantes están en esos cruces. La OWASP Cheat Sheet llama a estos cruces posibles puntos de ataque.
Los límites no son solo bordes de red. Un proceso que corre con otra cuenta del sistema operativo, un proveedor de identidad externo o una base de datos que acepta conexiones de varios servicios pueden ser, cada uno, un límite.
Cada categoría rompe una propiedad de seguridad.
| Categoría | Propiedad que rompe | Pregunta que hay que hacer |
|---|---|---|
| Spoofing | Autenticación | ¿Alguien puede hacerse pasar por otro usuario, servicio o componente? |
| Tampering | Integridad | ¿Los datos pueden cambiar en tránsito o en reposo sin que nadie lo note? |
| Repudiation | Responsabilidad | ¿Alguien puede negar una acción sin que exista un registro que lo demuestre? |
| Information disclosure | Confidencialidad | ¿Alguien puede leer datos que no debería ver? |
| Denial of service | Disponibilidad | ¿Alguien puede dejar este componente lento o no disponible? |
| Elevation of privilege | Autorización | ¿Alguien puede hacer más de lo que tiene permiso para hacer? |
Estas descripciones coinciden con la documentación de modelado de amenazas de Microsoft. La suplantación, por ejemplo, consiste en usar la información de autenticación de otro usuario.
No todas las categorías aplican a todos los elementos. Un mapa inicial habitual, que usan muchas herramientas de modelado, es este: las entidades externas reciben spoofing y repudiation; los procesos reciben las seis; los almacenes reciben tampering, repudiation, information disclosure y denial of service; los flujos reciben tampering, information disclosure y denial of service. Trate el mapa como un recordatorio, no como una regla. Si una categoría le parece irrelevante para un elemento, anote por qué, para que quien revise pueda cuestionarlo.
En una funcionalidad pequeña, los pasos del 1 al 5 pueden tomar una hora. La primera vez, espere rehacer el diagrama al menos una vez. Es normal.
OWASP Juice Shop es una aplicación web intencionalmente insegura para practicar. En este laboratorio usted no la explota. Dibuja su diseño, enumera amenazas y escribe mitigaciones. Las amenazas salen de leer el diseño, no de atacar la aplicación.
Ejecute el laboratorio solo en su propia máquina, con el acceso limitado a 127.0.0.1. Si todavía no preparó el contenedor, siga primero OWASP Juice Shop con Docker.
Necesita:
En la máquina de prueba usada para este artículo, git --version mostró:
git version 2.49.0.windows.1docker run --rm -d --name juice-shop-lab -p 127.0.0.1:3000:3000 bkimminich/juice-shopLa parte -p 127.0.0.1:3000:3000 publica el puerto solo en la interfaz de loopback, así que otros equipos de su red no pueden alcanzarlo.
Confirme que la aplicación web responde:
curl -sI http://127.0.0.1:3000/ | head -n 1En la máquina de prueba, la primera línea de la salida fue:
HTTP/1.1 200 OKConfirme que la API responde. Esta es una solicitud GET sencilla para una lista de productos:
curl -s -o /dev/null -w "products %{http_code} %{content_type}\n" http://127.0.0.1:3000/api/ProductsSalida:
products 200 application/json; charset=utf-8Revise la versión que informa la aplicación:
curl -s http://127.0.0.1:3000/rest/admin/application-versionSalida:
{"version":"20.3.0"}Esa versión es la que informó la imagen el 8 de noviembre de 2026 en la máquina de prueba. Su imagen puede informar otra. Anote la versión que vea, porque el modelo de amenazas describe una versión concreta.
Descargue el build de escritorio para su sistema operativo desde la página de releases, instálelo y ábralo. Los nombres de los menús de los pasos siguientes no se comprobaron con un build de Threat Dragon para este artículo, y cambian entre versiones. Use los nombres que muestre su build.
Cree un modelo de amenazas nuevo y agregue estos elementos:
El modelo debería verse así:
Browser (actor externo)
| solicitudes y respuestas HTTP
v
=================== límite de confianza ===================
Juice Shop web y API (proceso, 127.0.0.1:3000)
| consultas SQL y filas
v
Base de datos SQLite (almacén de datos)El esquema de texto es solo una guía. El archivo real es el que guarda Threat Dragon.
El modelo usa SQLite como almacén de datos. Revise la documentación del proyecto para la versión que ejecute, porque los detalles de almacenamiento pueden cambiar entre releases.
Aplique el mapa inicial que vio antes. El navegador es una entidad externa, así que recibe spoofing y repudiation. Cada flujo del navegador a la API recibe tampering, information disclosure y denial of service. El proceso de la API recibe las seis categorías. El almacén SQLite recibe tampering, repudiation, information disclosure y denial of service.
Aquí hay un ejemplo por categoría. Un modelo real tendrá más filas para cada elemento.
| Categoría | Elemento | Amenaza | Mitigación |
|---|---|---|---|
| Spoofing | Sesión del navegador y de la API | Un token robado permite actuar como cliente | Vida útil corta del token, verificación de firma en cada solicitud, invalidar tokens al cerrar sesión, limitar intentos de inicio de sesión |
| Tampering | Flujo del navegador a la API | Un cliente cambia el precio o la cantidad en un pedido | El servidor recalcula los precios desde la base de datos y nunca confía en los totales del cliente; validar el esquema de la solicitud |
| Repudiation | Proceso de pedidos | Un cliente dice que nunca hizo el pedido, y ningún registro muestra lo contrario | Registro de auditoría en el servidor con ID de usuario, fecha y hora e ID de la solicitud; ningún secreto en el registro |
| Information disclosure | Flujo de la API al navegador | Una respuesta de error revela trazas de pila o campos internos | Devolver solo campos de una lista de permitidos; mensajes de error genéricos para el cliente; detalles completos solo en los registros del servidor |
| Denial of service | Endpoint de búsqueda | Muchas búsquedas costosas dejan lento el servicio para todos | Límite de solicitudes por cliente, tamaño máximo de consulta y de página, tiempos de espera en las consultas a la base de datos |
| Elevation of privilege | Funciones de administración | Un usuario normal llama a un endpoint de administrador después de cambiar un valor de rol | Comprobación de autorización en el servidor en cada solicitud, denegar por defecto, rol leído de la sesión del servidor |
Use la documentación del proyecto para ver qué debilidades incluye su versión a propósito. Describa cada amenaza en términos de diseño. No escriba pasos de explotación en el modelo. Este laboratorio no necesita tráfico de ataque.
En Threat Dragon, agregue cada amenaza al elemento al que pertenece, con un título, una descripción y la mitigación. Si su build tiene un campo de estado, márquelo como abierto para las mitigaciones que todavía no implementó.
Exporte el modelo como JSON desde el menú de archivo y llame al archivo juice-shop-threat-model.json. Después, en la carpeta del laboratorio:
git init
cp /ruta/a/juice-shop-threat-model.json .
git add juice-shop-threat-model.json && git commit -m "First STRIDE model"Git muestra un resumen corto con el nombre de la rama y el mensaje del commit. El texto exacto depende de su versión de Git y de la configuración. Si Git pide una identidad, defínala con git config user.name y git config user.email, y haga el commit con su propio nombre.
Antes de hacer el commit, lea el archivo. No debe contener nombres de host reales, tokens ni datos de clientes. Este modelo usa solo 127.0.0.1.
Detenga el laboratorio al terminar:
docker stop juice-shop-lab
curl -s -o /dev/null -w "%{http_code}\n" --max-time 2 http://127.0.0.1:3000/En la máquina de prueba, la salida fue:
juice-shop-lab
000La primera línea viene de docker stop. El 000 significa que curl no recibió respuesta del puerto, o sea, el laboratorio está apagado.
Un modelo de amenazas describe un diseño el día en que se escribió. Cuando el diseño cambia, el modelo queda desactualizado. Algunos disparadores comunes:
El Threat Modeling Manifesto dice que el modelado de amenazas debe seguir los cambios de diseño, en iteraciones, cada una limitada a una parte manejable del sistema. En la práctica, eso significa tres hábitos. Mantenga el archivo JSON en el repositorio, junto al código. Agregue una pregunta de revisión a los pull requests que tocan autenticación, flujos de datos o integraciones externas: ¿el modelo sigue coincidiendo con el sistema? Registre la fecha y la versión de la aplicación que describe el modelo. Las amenazas marcadas como mitigadas siguen siendo un historial útil, así que consérvelas.
Fundamentos de seguridad
La tríada CIA explicada: confidencialidad, integridad y disponibilidad, con ejemplos, comprobaciones de hash y firma, y diez incidentes.
Fundamentos de seguridad
Separa vulnerabilidad, amenaza, riesgo y exploit, mira cómo CWE y CVE nombran las fallas y entiende por qué las fallas inalcanzables pueden importar.
Fundamentos de seguridad
Qué cubre la ciberseguridad, la tríada CIA, formas comunes de falla y un primer ejercicio seguro con hashes en tu propia máquina.