Piensa en un restaurante en plena hora pico, donde los clientes siguen llegando sin parar y la cocina tiene que preparar platos a velocidad récord. Ahora, imagina que cada cliente pide más platos de los que puede comer. La cocina se satura, los tiempos de espera se disparan y el servicio se resiente. En el mundo digital, algo similar ocurre con los sistemas y aplicaciones cuando enfrentan un “Allocation of Resources Without Limits”. Esta vulnerabilidad se presenta cuando los sistemas reciben más solicitudes de las que pueden manejar o se les fuerza a consumir más recursos de los necesarios, llevando potencialmente a una situación de colapso o denegación de servicio.
En este artículo, detallamos la naturaleza de esta vulnerabilidad, ofrecemos dos ejemplos prácticos del ámbito de la programación y las APIs, y proponemos soluciones efectivas para reducir el riesgo asociado.
¿En qué consiste la vulnerabilidad Allocation of Resources Without Limits?
La vulnerabilidad Allocation of Resources Without Limits surge cuando un sistema permite la asignación de sus recursos sin establecer límites claros y definidos. En el mundo digital, si un sistema no limita cuántos recursos (como memoria, CPU, conexiones de red) puede consumir una tarea o usuario, se corre el riesgo de que actividades legítimas y maliciosas agoten estos recursos. Esto no solo afecta el rendimiento, sino que también puede dejar el sistema vulnerable a ataques, provocando desde ralentizaciones hasta caídas completas del servicio.
¿Cuáles son los riesgos de Allocation of Resources Without Limits?
Los riesgos asociados con esta vulnerabilidad son significativos y variados, entre los principales encontramos: ralentizaciones, interrupciones del servicio, y potencialmente, la pérdida de datos críticos.
Los ciberatacantes pueden explotar esta vulnerabilidad para lanzar ataques de Denegación de Servicio (DoS) o Denegación de Servicio Distribuida (DDoS), dejando los sistemas inaccesibles para los usuarios legítimos. Además, el exceso en la asignación de recursos puede ser un camino para infiltrarse en sistemas más seguros, ampliando el alcance del ataque.
Un ejemplo práctico
El siguiente código muestra una situación peligrosa, asigna un socket y realiza un fork cada vez que recibe una nueva conexión:
sock=socket(AF_INET, SOCK_STREAM, 0);
while (1) {
newsock=accept(sock, ...);
printf("A connection has been accepted\n");
pid = fork();
}
El bucle infinito crea un nuevo proceso para cada conexión entrante sin verificar cuántas ya existen. Como realizar un fork es costoso, un atacante podría fácilmente agotar los recursos del sistema (CPU, procesos, memoria) con múltiples conexiones, llevando al sistema a un estado de parálisis. De forma alternativa, un atacante podría consumir todas las conexiones disponibles, impidiendo que otros accedan al sistema de forma remota.
Denial-of-Wallet mediante API Keys
Otro escenario preocupante involucra la exposición de claves de API, como en el caso de una API Key de Google Maps pública. Un atacante podría utilizarla para generar costos exorbitantes mediante consultas automáticas, un ataque conocido como “denial-of-wallet”.
Un especialista en realizar trabajos de Bug Bounty, ha reportado una ganancia de más de 10 mil dólares, solo demostrando como diversos sistemas no tienen limitado el consumo de recursos.
Solución y mejoras prácticas para Allocation of Resources Without Limits
Para abordar los riesgos presentados por la vulnerabilidad “Allocation of Resources Without Limits”, es crucial implementar medidas de control y restricción adecuadas. A continuación, presentamos un código vulnerable seguido de estrategias de mitigación efectivas.
Código Vulnerable:
Este fragmento de código ilustra una vulnerabilidad debido a la ausencia de restricciones en las operaciones de archivo:
{
fs.writeFileSync(runtime.settings.userSettingsFile, JSON.stringify(req.body, null, 4));
mergeUserSettings(req.body);
res.end();
}
En este ejemplo, el sistema escribe datos directamente a un archivo basándose en la entrada del usuario sin limitaciones, lo que podría llevar a un consumo desmedido de recursos del sistema.
Estrategia de Mitigación con Rate Limiting:
Para prevenir esta vulnerabilidad, recomendamos la implementación de un límite de tasa (Rate Limit), como se muestra a continuación:
const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 5,
});
app.use(limiter);
Este código limita a los usuarios a un máximo de 5 solicitudes por minuto, ayudando a prevenir el abuso en el uso de recursos.
Otras Recomendaciones:
Para proteger tus sistemas cuando las API Keys no están restringidas, sigue estas medidas:
- Implementa verificaciones de IP, Referrer o App para controlar el acceso.
- Usa autenticación basada en firmas o identificación del cliente en vez de API Keys.
- Desactiva las APIs que no uses para minimizar vulnerabilidades.
- Emplea paginación para evitar el excesivo consumo de recursos al mostrar grandes volúmenes de datos.
Conclusión
La Allocation of Resources Without Limits es una vulnerabilidad que no debe tomarse a la ligera. En Hackmetrix, comprendemos la importancia de proteger tu sistema contra estos riesgos. A través de nuestros servicios de Hacking Ético y nuestra Plataforma de Seguridad y Cumplimiento, ofrecemos una evaluación de tus sistemas para identificar y mitigar vulnerabilidades como esta. Nuestro equipo está listo para ayudarte a implementar las mejores prácticas de seguridad y asegurar que tu empresa se mantenga resiliente ante los desafíos del mundo digital.