In this article
Cómo proteger aplicaciones Node.js frente a vulnerabilidades de redirección abierta
Como desarrolladores, sabemos que escribir código seguro no es un lujo: es una necesidad. Entre los numerosos problemas de seguridad que pueden afectar a las aplicaciones, las vulnerabilidades de redirección abierta ocupan un lugar importante.
Las vulnerabilidades de redirección abierta ocurren cuando una aplicación incorpora datos proporcionados por el usuario en una redirección de URL. Esto puede permitir que usuarios malintencionados redirijan a sus víctimas a sitios de phishing o malware a través de la aplicación vulnerable. En las aplicaciones Node.js, estas vulnerabilidades pueden causar mucho daño, ya que es común manejar URL proporcionadas por los usuarios como entradas para la lógica de negocio, por ejemplo, la página personal, el perfil en redes sociales o la foto de perfil de un usuario.
Consulta esta guía completa para conocer más sobre las vulnerabilidades de redirección abierta en Node.js. Estas prácticas recomendadas también pueden ayudarte a proteger tus aplicaciones Node.js.
Entender las vulnerabilidades de redirección abierta
Una vulnerabilidad de redirección abierta ocurre cuando una aplicación incorpora de forma insegura datos proporcionados por el usuario en el destino de una operación de redirección. Esto puede permitir que los atacantes redirijan a usuarios desprevenidos desde un sitio confiable a uno malicioso.
Entender las vulnerabilidades de redirección abierta es fundamental para la seguridad de las aplicaciones al crear aplicaciones Node.js o programar JavaScript para el código del cliente en el navegador. En esta sección, explicaremos cómo detectarlas, cuáles son los riesgos y cómo las describe el Open Web Application Security Project (OWASP).
Por ejemplo, considera una aplicación Node.js Express con la siguiente ruta definida como parte del middleware de la aplicación:
app.get('/home, function(req, res){
let redirectURL = req.query.url;
res.redirect(redirectURL);
});
En el ejemplo de código Express anterior, se puede redirigir a un usuario a cualquier URL que se pase en el parámetro de consulta url. Esto puede ser útil para redirigirlo a una página de facturación o de planes de suscripción, a un panel específico o a una página de perfil de usuario. Sin embargo, los atacantes pueden aprovecharse de esto creando una URL que redirija a un sitio malicioso y engañando a los usuarios para que la abran.
Cómo detectar una vulnerabilidad de redirección abierta
Para identificar una vulnerabilidad de redirección abierta, debes entender cómo maneja tu aplicación las entradas de los usuarios, sobre todo cuando se usan para redirigir. En las aplicaciones Node.js, presta atención a métodos como res.redirect() en Express, que podrían usarse sin sanitizar correctamente las entradas del usuario.
En las aplicaciones Node.js, las redirecciones de URL se usan comúnmente por varios motivos, como:
Redirigir a los usuarios a una versión diferente del sitio web (por ejemplo, para dispositivos móviles o de escritorio) según el dispositivo que usen.
Gestionar la autenticación, cuando se redirige a los usuarios a la página original después de iniciar sesión correctamente.
Rastrear la actividad de los usuarios o sus clics con fines analíticos.
Sin embargo, el uso incorrecto de estas redirecciones puede provocar una falla de seguridad conocida como vulnerabilidad de redirección abierta.
Snyk Code, la función de seguridad de código de la herramienta Snyk, puede ser de gran ayuda en este sentido. Analiza tu código fuente en busca de posibles problemas de seguridad como este, genera informes detallados y sugiere soluciones. ¡Instala la extensión para VS Code y comienza a proteger tu código!
Vulnerabilidades de redirección abierta según OWASP
OWASP reconoce las vulnerabilidades de redirección abierta como una amenaza importante. Las incluye en su lista de riesgos de seguridad que los desarrolladores deben conocer, lo que indica la gravedad potencial de este tipo de vulnerabilidad.
Estos son algunos de los riesgos y efectos de las vulnerabilidades de redirección abierta:
Phishing: los atacantes pueden redirigir a los usuarios a un sitio web malicioso que parece legítimo y engañarlos para que proporcionen información confidencial.
Distribución de malware: el atacante podría redirigir a los usuarios a un sitio que aloja malware, lo que provocaría descargas automáticas sin que los usuarios lo sepan.
Daño a la reputación: si se descubre que tu aplicación es la fuente de este tipo de ataques, su reputación podría verse gravemente afectada.
Una vulnerabilidad de redirección abierta puede infiltrarse en una base de código a través de dependencias de código abierto de terceros. En este caso, puedes usar Snyk Open Source para analizar tus paquetes de código abierto, detectar vulnerabilidades y recibir orientación para corregirlas y mantener seguras tus aplicaciones.
Empieza gratis a proteger tus aplicaciones frente a las vulnerabilidades de redirección abierta: regístrate en Snyk.
Vulnerabilidades de redirección abierta en aplicaciones Node.js
Como recordatorio, las vulnerabilidades de redirección abierta ocurren cuando una aplicación acepta entradas que no son de confianza. Esto puede hacer que la aplicación web Node.js redirija la solicitud a una URL incluida en esa entrada no confiable. Para mantener un entorno seguro, es fundamental entender y mitigar estas vulnerabilidades en las definiciones de rutas, los controladores y otros puntos de manejo de URL de la lógica de negocio implementada en aplicaciones Node.js.
Las vulnerabilidades de redirección abierta también afectan a las aplicaciones frontend que usan Node.js como solución del lado del servidor para renderizar componentes de interfaz de usuario y entregarlos al cliente.
Vulnerabilidades de redirección abierta en aplicaciones Next.js con renderizado del lado del servidor (SSR)
Next.js es un framework popular para aplicaciones React renderizadas del lado del servidor. Al igual que otras aplicaciones Node.js, las aplicaciones Next.js también pueden ser vulnerables a ataques de redirección abierta.
En una aplicación Next.js, puede producirse una vulnerabilidad de redirección abierta cuando la aplicación usa propiedades del lado del servidor para obtener datos en el momento de la solicitud y luego redirige al usuario según esos datos. Por ejemplo:
export async function getServerSideProps(context) {
const { req, res } = context
const target = req.headers.referer
if (target) {
res.writeHead(302, { Location: target })
res.end()
}
return { props: {} }
}
En este fragmento de código, la aplicación redirige al usuario a la URL que aparece en el encabezado referer. Si no se valida correctamente, esto puede provocar ataques de redirección abierta.
Vulnerabilidades de redirección abierta en el framework web Fastify
El ejemplo más básico de una vulnerabilidad de redirección abierta es una redirección a una ruta absoluta, la forma más simple en que una aplicación Fastify podría manejar entradas directas del usuario. Así se vería el código de Express mencionado anteriormente al escribirlo para el framework web Fastify:
const fastify = require('fastify')({ logger: true });
fastify.get('/home, (request, reply) => {
const target = request.query.target;
reply.redirect(target);
});
fastify.listen(3000, (err, address) => {
if (err) throw err;
fastify.log.info(`server listening on ${address}`);
});
En este ejemplo de Fastify, al igual que en el código de Express, existe una vulnerabilidad de redirección abierta. La vulnerabilidad se produce cuando la aplicación confía ciegamente en las entradas del usuario para determinar el destino de una redirección de URL.
Considera otra variante de las redirecciones de URL:
fastify.get('/safeRedirect', (request, reply) => {
const target = request.query.target
if (isValidUrl(target)) {
// isValidUrl is a hypothetical function to validate the URL
reply.redirect(target)
} else {
reply.send({ error: 'Invalid URL' })
}
})En este ejemplo, se agrega algún tipo de validación (isValidUrl). Sin embargo, si la validación no es lo suficientemente sólida, los atacantes podrían encontrar la manera de eludirla. Por ejemplo, el patrón de expresión regular en isValid() podría tener fallas.
Problemas de seguridad que provocan vulnerabilidades de redirección abierta
Es importante que los desarrolladores conozcan los siguientes problemas de seguridad que pueden provocar vulnerabilidades de redirección abierta:
No validar ni sanitizar las entradas de los usuarios que determinan la URL de redirección.
Permitir redirecciones a cualquier dominio externo sin usar una lista de permitidos.
No codificar la URL de redirección puede provocar vulnerabilidades como el Cross-Site Scripting (XSS).
Detecta y corrige vulnerabilidades de redirección abierta con Snyk
Snyk Code y Snyk Open Source son herramientas de seguridad para desarrolladores que pueden ayudar a detectar y corregir vulnerabilidades de redirección abierta en tus aplicaciones Node.js. Estas herramientas analizan el código fuente, los paquetes de código abierto, las imágenes de contenedores y las configuraciones incorrectas en la nube para detectar vulnerabilidades.
Snyk Code es una solución eficaz que ayuda a encontrar y corregir vulnerabilidades en tu código. Ofrece resultados precisos con menos falsos positivos, lo que permite a los desarrolladores enfocarse en los problemas más críticos.
Snyk Open Source te ayuda a encontrar, corregir y monitorear vulnerabilidades conocidas en dependencias de código abierto de Node.js y JavaScript.
A continuación, te mostramos cómo puedes usar Snyk para analizar tu aplicación Node.js o Next.js en busca de vulnerabilidades de redirección abierta.
Primero, integra Snyk en tu entorno de desarrollo. Para hacerlo, instala Snyk CLI y ejecuta un comando sencillo:
npm install -g snykDespués de instalar Snyk CLI, puedes ejecutar una prueba en tu aplicación Node.js para comprobar si tiene vulnerabilidades:
snyk testEste comando analizará tu aplicación y generará un informe de todas las vulnerabilidades conocidas, incluidas las de redirección abierta.
Snyk identifica vulnerabilidades y ofrece información práctica para corregirlas. Por ejemplo, si detecta una vulnerabilidad de redirección abierta, te indicará la ubicación exacta de la vulnerabilidad en tu código, su nivel de gravedad y recomendaciones detalladas para corregirla, como estas:
✗ Open Redirect [Medium Severity][https://snyk.io/vuln/SNYK-JS-REDIRECT-569620] in redirect@1.0.0
introduced by your-app@1.0.0 > redirect@1.0.0
This issue was fixed in versions: 2.0.0Herramientas como Snyk ayudan a los desarrolladores a escribir código seguro y detectar vulnerabilidades. Snyk es una herramienta de seguridad diseñada para desarrolladores que analiza el código fuente, los paquetes de código abierto, las imágenes de contenedores y las configuraciones en la nube para detectar vulnerabilidades ocultas.
Snyk es compatible con muchos lenguajes de programación y frameworks; JavaScript y Node.js son dos de los más importantes.
Si eres desarrollador y quieres proteger tus aplicaciones y reducir los riesgos asociados con las vulnerabilidades de redirección abierta, regístrate en Snyk hoy mismo y mejora tus prácticas de seguridad de aplicaciones.
Protege tu código mientras desarrollas
Snyk analiza tu código para detectar problemas de calidad y seguridad, y te ofrece recomendaciones para corregirlos directamente en tu IDE.