Aller au contenu

Index

Surcharge d'alias dans l'API GraphQL

Description

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

Les alias dans GraphQL permettent à un client de demander le même champ plusieurs fois avec des noms différents. Cependant, l'utilisation excessive d'alias dans une seule requête peut entraîner des attaques par déni de service (DoS) en épuisant les ressources du serveur. Cette attaque peut dégrader les performances ou provoquer des pannes de service complètes. Exemple :

query oxo {
  alias1: __typename
  alias2: __typename
  alias3: __typename
  alias4: __typename
  alias5: __typename
  ...
}

Impact sur la sécurité de la surcharge d'alias :

  • Déni de service (DoS) : En envoyant une requête avec un grand nombre d'alias, les attaquants peuvent forcer le serveur à utiliser des ressources excessives pour la traiter et y répondre, ce qui pourrait ralentir ou bloquer le service.
  • Épuisement des ressources : Les serveurs peuvent avoir du mal à gérer la charge de calcul liée au traitement de nombreux alias, ce qui peut entraîner un épuisement de la mémoire, des pics d'utilisation du CPU ou une dégradation des performances.
  • Indisponibilité du système : Si une attaque par surcharge d'alias n'est pas contrôlée, elle peut rendre l'API GraphQL indisponible, interrompant le service pour tous les utilisateurs.

Recommandation

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

  • Implémenter des délais d'attente (timeouts) : Appliquez des délais d'attente aux requêtes pour interrompre celles qui prennent trop de temps à se résoudre. En définissant un temps d'exécution maximal, vous pouvez automatiquement interrompre les requêtes qui abusent des alias et consomment des ressources excessives sur le serveur, évitant ainsi les attaques par déni de service (DoS).

  • Limiter les alias : Configurez des limites côté serveur sur le nombre d'alias autorisés dans une seule requête GraphQL. Vous pouvez configurer des outils comme GraphQL Armor pour limiter les alias et empêcher la surcharge.

  // Configuration de GraphQL Armor
  GraphQLArmorConfig({
    maxAliases: {
      // Activer ou désactiver le plugin | par défaut : true
      enabled: true,

      // Définir le nombre maximal d'alias autorisés par requête | par défaut : 50
      n: 50,

      // Callbacks à exécuter lorsqu'une requête est acceptée
      onAccept: [],

      // Callbacks à exécuter lorsqu'une requête est rejetée
      onReject: [],

      // Propager les détails du rejet au client | par défaut : true
      propagateOnRejection: true,
    }
  })
  import graphql
  from graphql.language import ast
  from graphql.language import parser
  from settings import api

  def validate_aliases(query: str) -> None:
      """
      Cette validation empêche l'exécution de requêtes contenant un nombre excessif
      d'alias pour éviter la surcharge du serveur.
      """

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

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