Saltar a contenido

Array-Based Batch Queries

Consultas por lotes basadas en matrices

Descripción

Las consultas por lotes basadas en matrices en GraphQL ocurren cuando un atacante envía múltiples consultas en una sola solicitud utilizando una estructura de matriz, lo que puede sobrecargar las capacidades de procesamiento del servidor.

En GraphQL, a los clientes generalmente se les permite enviar una sola consulta por solicitud. Sin embargo, si no se restringen adecuadamente, los atacantes pueden agrupar múltiples consultas en una sola solicitud utilizando una matriz. Esto puede provocar un ataque de Denegación de Servicio (DoS) al consumir recursos excesivos del servidor, degradar el rendimiento o causar una interrupción del servicio.

Ejemplo:

[
  { query: "{ user(id: 1) { name } }" },
  { query: "{ user(id: 2) { name } }" },
  { query: "{ user(id: 3) { name } }" }
]

Impacto en la seguridad de las consultas por lotes basadas en matrices:

Denegación de servicio: Los atacantes pueden enviar grandes lotes de consultas en una sola solicitud, obligando al servidor a manejar numerosas operaciones simultáneamente. Esto puede provocar el agotamiento de los recursos y posibles fallas en el servicio. Agotamiento de recursos: Al igual que con la duplicación de campos, las consultas por lotes basadas en matrices pueden aumentar el uso de CPU y memoria al sobrecargar el servidor con una gran cantidad de consultas en una sola llamada. Interrupción del servicio: Si no se controlan, las consultas por lotes basadas en matrices pueden hacer que la API GraphQL no esté disponible para usuarios legítimos, causando tiempo de inactividad del sistema o un rendimiento degradado.

Recomendación

Para mitigar el riesgo de ataques de consultas por lotes basadas en matrices en GraphQL, donde múltiples consultas se agrupan en una sola solicitud, puede aplicar las siguientes estrategias:

  • Implementar límites de complejidad de las consultas: Establezca reglas que tengan en cuenta la cantidad de consultas que se procesan en una sola solicitud. Esto ayuda a limitar la carga en el servidor y evita que los atacantes envíen lotes de consultas excesivamente grandes.
  • Limitar la cantidad de consultas por solicitud: Imponga restricciones en el lado del servidor sobre la cantidad de consultas que se pueden enviar en un solo lote. Herramientas como GraphQL Armor pueden ayudar a imponer límites y prevenir la sobrecarga de recursos a través de consultas por lotes basadas en matrices.
  // Configuring for GraphQL Armor
  GraphQLArmorConfig({
      maxBatchQueries: {
          // Enable or disable the plugin | default: true
          enabled: true,

          // Set the maximum number of queries allowed per request | default: 5
          n: 5,

          // Callbacks to execute when a query batch is accepted
          onAccept: [],

          // Callbacks to execute when a query batch is rejected
          onReject: [],

          // Propagate rejection details to the client | default: true
          propagateOnRejection: true,
      }
  });
  import graphql
  from graphql.language import ast
  from graphql.language import parser
  from settings import api

  def validate_batch_queries(query: str) -> None:
      """
      This validation prevents the execution of requests containing excessive
      batch queries to avoid overloading the server.
      """
      class BatchQueryParser(parser.Parser):
          def parse_batch_queries(self) -> list[ast.OperationDefinitionNode]:
              query_count = 0
              while self.peek(graphql.TokenKind.BRACKET_L):
                  self.parse_operation_definition()
                  query_count += 1
                  if query_count > api.API_MAX_BATCH_QUERIES:
                      raise graphql.GraphQLError("Exception - Max batch queries exceeded")
              return []

      ast_parser = BatchQueryParser(query)
      ast_parser.parse_document()

Enlaces

Estándares

  • CWE_TOP_25:
    • CWE_20
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_4
    • REQ_11_3
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • OWASP_ASVS_L2:
    • V5_3_3
    • V5_3_4
    • V9_1_1
    • V12_1_1
    • V12_1_2
  • OWASP_ASVS_L3:
    • V5_3_3
    • V5_3_4
    • V12_1_1
    • V12_1_2
    • V12_1_3
  • 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:
    • SECURITY212
    • SECURITY213