Aller au contenu

Directive Overloading in GraphQL API

Surcharge de Directives (Directive Overloading) dans l'API GraphQL

Description

La surcharge de directives (Directive Overloading) dans GraphQL se produit lorsqu'un attaquant utilise un grand nombre de directives dans une requête pour submerger les capacités de traitement du serveur.

Les directives dans GraphQL sont utilisées pour modifier le comportement des requêtes, mais une utilisation excessive peut mener à des attaques par Déni de Service (DoS) en épuisant les ressources du serveur. Ce type d'attaque peut causer une dégradation des performances ou des interruptions complètes de service.

Exemple :

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

L'impact de sécurité de la surcharge de directives peut mener aux problèmes suivants :

  • Déni de Service (DoS) : En envoyant un nombre excessif de directives dans une seule requête, les attaquants peuvent submerger le serveur, ce qui entraîne des réponses lentes ou des interruptions de service pour les utilisateurs légitimes.
  • Épuisement des Ressources : Les serveurs peuvent utiliser d'importantes ressources de calcul pour analyser et valider les directives, ce qui peut se traduire par un épuisement de la mémoire ou des pics de CPU.
  • Indisponibilité du Système : Si elle n'est pas contrôlée, une attaque par surcharge de directives pourrait rendre le service GraphQL indisponible pour tous les utilisateurs.

Recommandation

Pour atténuer le risque d'attaques par surcharge de directives, vous pouvez prendre les mesures suivantes :

  • Implémenter des délais d'attente (timeouts) : L'implémentation de timeouts pour interrompre (kill) les requêtes qui mettent trop de temps à se résoudre peut être très efficace. En définissant un temps d'exécution maximal, vous pouvez automatiquement terminer les requêtes qui dépassent cette limite, les empêchant ainsi de consommer excessivement les ressources du serveur.

  • Limiter les Directives : Implémentez des limites côté serveur sur le nombre de directives autorisées dans une seule requête GraphQL. Vous pouvez configurer des outils comme GraphQL Armor pour limiter les directives et prévenir la surcharge.

// 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()

Liens

Normes

  • 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