Skip to main content

Modelado de amenazas para aplicaciones Node.js

Escrito por

31 de agosto de 2016

0 minutos de lectura

Este artículo es una publicación invitada de Gergely Nemeth, director ejecutivo de RisingStack, donde desarrolla Trace by RisingStack para monitorear y depurar aplicaciones y microservicios de Node.js.

¿Contra qué debería proteger mi aplicación? ¿Debería enfrentarme a los ataques de cross-site scripting? ¿Y a la inyección SQL? ¿Debería protegerme contra la falsificación de solicitudes entre sitios? La respuesta corta es sí. Pero, como siempre, no es tan sencillo: según quién podría ser tu atacante y a qué puede acceder (y cuánto vale), tienes que defender tu aplicación de distintas maneras. Hablar de seguridad solo tiene sentido si conoces las respuestas a «¿A salvo de quién?» y «¿A salvo por cuánto tiempo?»

Por eso tienes que modelar las amenazas de seguridad contra tu software. Una de las mejores soluciones que puedes usar son los árboles de ataque.

¿Qué son los árboles de ataque?

Los árboles de ataque ofrecen una forma formal y metódica de describir la seguridad de los sistemas ante distintos ataques. Básicamente, representas los ataques contra un sistema en una estructura de árbol: el objetivo es el nodo raíz y las distintas maneras de alcanzarlo son los nodos hoja. - Bruce Schneier

Ejemplo de árbol de ataque

A continuación, encontrarás un árbol de ataque simplificado para una caja fuerte física, cuyo objetivo evidente para el atacante es abrirla. En este ejemplo, tiene dos maneras principales de hacerlo: forzar la cerradura o averiguar la combinación. Para averiguar la combinación, tiene que sobornar a alguien o escuchar a escondidas. Para hacerlo con éxito, debe escuchar una conversación y lograr que la persona diga la combinación.

Árbol de ataque que muestra los pasos para acceder a una caja fuerte: forzar la cerradura o averiguar la combinación escuchando a escondidas o sobornando a alguien.

Una vez que establecemos las relaciones entre los objetivos, podemos asignarles valores. En este ejemplo, los valores son posible (P) e imposible (I). No lo olvides: algo es posible o imposible desde el punto de vista del atacante. Así que, si el atacante dispone de muchos recursos financieros, sobornar a alguien es posible. Desde el punto de vista de un estudiante universitario, probablemente sería imposible.

Después de asignar estos valores, verás exactamente contra qué rutas debes protegerte:

Diagrama de árbol de ataque que muestra formas de acceder a una caja fuerte, como forzar la cerradura, averiguar la combinación, espiar, sobornar y escuchar conversaciones.

Por supuesto, también puedes asignar otros valores a las hojas, como el costo del ataque.

Crear árboles de ataque para aplicaciones Node.js

Ahora que conoces los conceptos básicos de los árboles de ataque, ¡es hora de aplicarlos a tus aplicaciones Node.js!

Primero, tienes que identificar los posibles objetivos de ataque; cada uno formará un árbol de ataque independiente. Para todos los objetivos, intenta recopilar tantos ataques como se te ocurran y repite el proceso para construir el árbol completo. Es posible que distintos árboles compartan el mismo subárbol, y eso está perfectamente bien.

Cuando estés conforme con el estado de tus árboles de ataque, puedes empezar a usarlos para tomar decisiones de seguridad. Ahora puedes determinar si tu sistema es vulnerable a un tipo de ataque específico, como el cross-site scripting o la falsificación de solicitudes entre sitios.

Te sorprenderá lo que encuentres: la mayoría de las personas intenta defender sus sistemas contra vectores de ataque que no debería, mientras deja enormes brechas de seguridad sin atender.

Ejemplo de árbol de ataque para una aplicación Node.js

Veamos un árbol de ataque para una aplicación Node.js. Como en RisingStack desarrollamos una solución de monitoreo de Node.js, voy a mostrar un árbol de ataque en el entorno de Trace.

Página de inicio de sesión de Trace by RisingStack con campos de correo electrónico y contraseña, enlace para recuperar la contraseña, botón para iniciar sesión y opción para registrarse.

El árbol de ataque que voy a crear aquí tiene un objetivo sencillo: eludir la autenticación, como en el ejemplo de la caja fuerte física.

Árbol de ataque que muestra las vías para evadir la autenticación mediante una cookie obsoleta, una contraseña robada o credenciales modificadas.

El ejemplo anterior muestra cómo alguien podría eludir la autenticación en una cuenta de Trace. El primer subárbol muestra el caso de una cookie robada. En nuestro ejemplo, una dependencia insegura podría permitir que robaran la cookie.

  • Para proteger mejor tus cookies, puedes habilitar el modo Secure: este atributo le indica al navegador que solo envíe la cookie si la solicitud se realiza mediante HTTPS.

  • También puedes reducir la duración de una cookie; así, aunque la roben, solo podrán usarla durante un tiempo limitado.

El segundo subárbol muestra el acceso a una cuenta con el nombre de usuario y la contraseña correctos. En este caso, el atacante tendría que obtenerlos del usuario, algo que no podemos controlar.

  • Puedes hacerle la vida más difícil al atacante si agregas la autenticación de dos factores.

El tercer subárbol muestra que las credenciales se modifican directamente en las bases de datos de Trace by RisingStack. Para hacerlo, un atacante tendría que acceder a las bases de datos.

  • Aunque los atacantes accedan a tus datos, tienes una última medida de protección: ¡agrega cifrado a tu conjunto de datos!

Estos ejemplos están lejos de ser exhaustivos y pueden volverse mucho más complejos, pero espero que te hayan dado una idea de cómo empezar a modelar las amenazas de seguridad de tu sistema.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.