Ataque de Batching en GraphQL
Endpoints GraphQL que aceptan arrays de operaciones sin límites de tamaño, permitiendo a los atacantes bypassear el rate limiting agrupando miles de requests en una sola llamada HTTP.
Cómo Funciona
GraphQL soporta batching — enviar un array de operaciones en un solo request HTTP. El batching está pensado para rendimiento, pero sin límites de tamaño, los atacantes agrupan miles de intentos de login o requests de recursos en una llamada HTTP. Tu rate limiter ve un request y lo deja pasar, pero el servidor ejecuta miles de operaciones.
// MAL: batching sin límite de tamaño
// El atacante envía: [{query: 'mutation login(email:"a"...)'}, {query: ...}, ...x1000]
app.post('/graphql', graphqlHTTP({ schema }));
// El rate limiter ve 1 request, pero el servidor ejecuta 1000 mutations// BIEN: limita el tamaño del batch
app.post('/graphql', (req, res, next) => {
const body = req.body;
if (Array.isArray(body) && body.length > 10) {
return res.status(400).json({ error: 'Límite de tamaño de batch excedido' });
}
return graphqlHTTP({ schema })(req, res, next);
});Ejemplo Real
El batching de GraphQL fue usado para bypassear el rate limiting de SMS OTP en varias plataformas importantes — los atacantes podían probar cientos de códigos OTP en un solo request en lote. HackerOne ha documentado múltiples payouts de bounty por este problema.
Cómo Prevenirlo
- Limita el tamaño del batch a un número pequeño (5-10 operaciones por request)
- Considera deshabilitar el batching completamente si tus clientes no lo usan
- Aplica rate limiting por operación dentro de un batch, no por request HTTP
- Usa un servidor GraphQL que soporte rate limiting a nivel de operación (Apollo Router, GraphQL Armor)
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Documentación de API Expuesta en Producción
lowSwagger UI, ReDoc u otras interfaces de documentación de API accesibles públicamente en producción, dándole a los atacantes un mapa interactivo gratuito de cada endpoint, parámetro y método de autenticación.
Introspección GraphQL Habilitada en Producción
mediumLa introspección de GraphQL permanece habilitada en producción, permitiendo que cualquiera consulte el schema completo y descubra todos los tipos, campos, mutations y sus estructuras de argumentos.
GraphQL Sin Límite de Profundidad de Query
mediumAPI 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.
Exposición Excesiva de Datos
mediumEndpoints de API que devuelven objetos completos de la base de datos con campos sensibles en lugar de solo los campos que el cliente realmente necesita, exponiendo hashes de contraseñas, IDs internos, flags de admin y otros datos sensibles.