Saltar a contenido

Brute Force Login Using Alias Batching in GraphQL API

Inicio de sesión por fuerza bruta usando procesamiento por lotes de alias en API GraphQL

Descripción

El inicio de sesión por fuerza bruta utilizando el procesamiento por lotes de alias en GraphQL implica que un atacante aproveche la función de alias para automatizar los intentos de inicio de sesión, lo que facilita el envío de numerosas combinaciones de credenciales en una sola consulta.

En GraphQL, los alias permiten a los clientes enviar múltiples versiones de la misma consulta bajo diferentes nombres. Los atacantes aprovechan esto agrupando las solicitudes de inicio de sesión dentro de una sola consulta utilizando diferentes nombres de alias para cada intento. Esto puede conducir a un ataque de fuerza bruta eficiente, eludiendo las protecciones tradicionales de limitación de velocidad (rate limiting) y abrumando el sistema de autenticación con intentos de inicio de sesión.

Ejemplo:

query loginBatch {
  login1: login(username: "user1", password: "password1") { token }
  login2: login(username: "user2", password: "password2") { token }
  login3: login(username: "user3", password: "password3") { token }
  ...
}

Recomendación

Para mitigar el riesgo de ataques de inicio de sesión por fuerza bruta utilizando lotes de alias, considere implementar las siguientes medidas:

  • Limitar los alias: Configure límites en el lado del servidor sobre la cantidad de alias permitidos en una sola consulta de GraphQL. Puede configurar herramientas como GraphQL Armor para limitar los alias y evitar la sobrecarga.

  • Implementar CAPTCHA: Introduzca CAPTCHA u otros mecanismos de verificación de usuarios para desafiar a los usuarios después de un cierto número de intentos fallidos de inicio de sesión, agregando una capa de protección adicional.

  // Configuring rate limiting and alias limits for a GraphQL server
  const express = require('express');
  const rateLimit = require('express-rate-limit');
  const { ApolloServer, gql } = require('apollo-server-express');
  const { GraphQLArmorConfig } = require('graphql-armor');

  const app = express();

  // Rate limit for login attempts
  const loginLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 5, // limit each IP to 5 requests per windowMs
    message: "Too many login attempts, please try again later."
  });

  // Define your GraphQL schema
  const typeDefs = gql`
    type Query {
      login(username: String!, password: String!): String
    }
  `;

  // Implement the alias limit configuration
  GraphQLArmorConfig({
    maxAliases: {
      enabled: true,
      n: 20, // Set the maximum number of aliases allowed per query
      onAccept: [],
      onReject: [],
      propagateOnRejection: true,
    }
  });

  const server = new ApolloServer({ typeDefs, resolvers });

  // Apply rate limiter middleware
  app.use('/graphql', loginLimiter);

  server.applyMiddleware({ app });

  app.listen({ port: 4000 }, () =>
    console.log(`Server ready at http://localhost:4000${server.graphqlPath}`)
  );
  import graphql
  from graphql.language import ast
  from graphql.language import parser
  from settings import api

  def validate_aliases(query: str) -> None:
      """
      This validation prevents the execution of queries containing an excessive
      number of aliases to prevent server overload.
      """
      class AliasesParser(parser.Parser):
          def parse_aliases(self) -> list[ast.FieldNode]:
              aliases = 0
              while self.peek(graphql.TokenKind.NAME):
                  aliases += 1
                  if aliases > api.API_MAX_ALIASES:
                      raise graphql.GraphQLError("Exception - Max aliases exceeded")
                  self.parse_field()
              return []

      ast_parser = AliasesParser(query)
      ast_parser.parse_document()

Enlaces

Estándares

  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_4
    • REQ_11_3
  • OWASP_ASVS_L3:
    • V13_4_1
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY221
    • SECURITY212
    • SECURITY213