Saltar a contenido

Directive Overloading in GraphQL API

Sobrecarga de Directivas (Directive Overloading) en la API GraphQL

Descripción

La sobrecarga de directivas en GraphQL ocurre cuando un atacante aprovecha un gran número de directivas en una consulta para abrumar las capacidades de procesamiento del servidor.

Las directivas en GraphQL se utilizan para modificar el comportamiento de las consultas, pero un uso excesivo puede conducir a ataques de Denegación de Servicio (DoS) al agotar los recursos del servidor. Este tipo de ataque puede causar degradación del rendimiento o interrupciones completas del servicio.

Ejemplo:

query oxo {
  __typename @aa @aa @aa @aa @aa @aa @aa @aa @aa @aa
}

El impacto de seguridad de la sobrecarga de directivas puede conducir a los siguientes problemas:

  • Denegación de Servicio (DoS): Al enviar un número excesivo de directivas en una sola consulta, los atacantes pueden abrumar el servidor, causando que los usuarios legítimos experimenten respuestas lentas o interrupciones del servicio.
  • Agotamiento de Recursos: Los servidores pueden usar recursos computacionales significativos para analizar y validar las directivas, lo cual puede resultar en el agotamiento de la memoria o picos de CPU.
  • Indisponibilidad del Sistema: Si no se controla, un ataque de sobrecarga de directivas podría hacer que el servicio GraphQL deje de estar disponible para todos los usuarios.

Recomendación

Para mitigar el riesgo de ataques de sobrecarga de directivas, usted puede tomar las siguientes medidas:

  • Implementar tiempos de espera (timeouts): Implementar tiempos de espera para interrumpir (kill) consultas que tardan demasiado en resolverse puede ser altamente efectivo. Al establecer un tiempo máximo de ejecución, usted puede terminar automáticamente las consultas que excedan este límite, evitando que consuman recursos excesivos del servidor.

  • Limitar Directivas: Implemente límites en el lado del servidor sobre el número de directivas permitidas en una sola consulta GraphQL. Usted puede configurar herramientas como GraphQL Armor para limitar las directivas y prevenir la sobrecarga.

// Configuring for GraphQL Armor
GraphQLArmorConfig({
  maxDirectives: {
    // Toggle the plugin | default: true
    enabled?: boolean,

    // Directives threshold | default: 50
    n?: int,

    // Callbacks that are ran whenever a Query is accepted
    onAccept?: GraphQLArmorAcceptCallback[],

    // Callbacks that are ran whenever a Query is rejected
    onReject?: GraphQLArmorRejectCallback[],

    // Do you want to propagate the rejection to the client? | default: true
    propagateOnRejection?: boolean,
  }
})
import graphql
from graphql.language import ast
from graphql.language import parser
from settings import api

def validate_directives(query: str) -> None:
    """
    This validation prevents the execution of queries containing an excessive
    amount of directives to prevent abuse.
    """

    class DirectivesParser(parser.Parser):
        def parse_directives(self, is_const: bool) -> list[ast.DirectiveNode]:
            directives = 0
            while self.peek(graphql.TokenKind.AT):
                directives += 1
                if directives > api.API_MAX_DIRECTIVES:
                    raise graphql.GraphQLError("Exception - Max directives exceeded")
                self.parse_directive(is_const)
            return []

    ast_parser = DirectivesParser(query)
    ast_parser.parse_document()

Enlaces

Estándares

  • CWE_TOP_25:
    • CWE_400
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_4
    • REQ_11_3
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • 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:
    • SECURITY212
    • SECURITY213