mediumCWE-770A04:2021

GraphQL Sin Límite de Profundidad de Query

API GraphQL sin límite de profundidad en queries anidadas, permitiendo a los atacantes crear queries profundamente anidadas que agotan los recursos del servidor y causan denegación de servicio.

Cómo Funciona

El querying flexible de GraphQL permite a los clientes solicitar relaciones anidadas. Sin un límite de profundidad, un atacante puede escribir una query 100 niveles de profundidad (usuario -> amigos -> amigos -> amigos...) que cause queries de base de datos exponenciales o agotamiento de memoria. Es un ataque de denegación de servicio específico de la naturaleza de queries recursivas de GraphQL.

Código Vulnerable
// MAL: sin límite de profundidad — esta query tumbaría el servidor
// query { usuario { amigos { amigos { amigos { amigos { nombre } } } } } }
Código Seguro
// BIEN: usa el plugin graphql-depth-limit
import depthLimit from 'graphql-depth-limit';
const server = new ApolloServer({
  typeDefs,
  resolvers,
  validationRules: [depthLimit(5)], // máximo 5 niveles de profundidad
});

Ejemplo Real

La API GraphQL de GitHub enforced límites de profundidad después de descubrir que las queries anidadas complejas podían causar tiempos de respuesta de más de 30 segundos. GitHub también introdujo un sistema de puntuación de complejidad para prevenir queries costosas, no solo profundas.

Cómo Prevenirlo

  • Instala graphql-depth-limit y configura un límite razonable (5-7 niveles suele ser suficiente)
  • También implementa límites de complejidad de queries usando graphql-query-complexity
  • Configura un timeout de query en tu servidor GraphQL para matar queries desbocadas
  • Limita la tasa por puntuación de complejidad de query, no solo por conteo de requests

Tecnologías Afectadas

nodejsNext.js

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas