Aller au contenu

Field Duplication in GraphQL API

Duplication de champs dans l'API GraphQL

Description

La duplication de champs dans GraphQL se produit lorsqu'un attaquant envoie une requête demandant le même champ à plusieurs reprises, surchargeant ainsi les capacités de traitement du serveur.

Dans GraphQL, les clients peuvent demander plusieurs champs dans une requête, y compris le même champ plusieurs fois. Cependant, une duplication excessive de champs peut entraîner une attaque par déni de service (DoS) en consommant les ressources du serveur. Cela peut dégrader les performances ou provoquer une interruption de service. Exemple :

query overload {
  user {
    id
    id
    id
    id
    id
    ...
  }
}

Impact sur la sécurité de la duplication de champs :

  • Déni de service (Denial of Service) : En dupliquant le même champ dans une requête, les attaquants peuvent forcer le serveur à traiter la même demande de manière répétée, entraînant une utilisation excessive des ressources et des plantages potentiels du service.
  • Épuisement des ressources (Resource Exhaustion) : À l'instar de la surcharge d'alias, cette attaque peut provoquer des pics d'utilisation du CPU et de la mémoire, ralentissant le système et affectant les performances globales.
  • Interruption de service : Si elle n'est pas atténuée, l'attaque par duplication de champs peut rendre l'API GraphQL indisponible pour les utilisateurs légitimes, entraînant une indisponibilité du système ou une dégradation du service.

Recommandation

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

  • Implémenter des limites de complexité de requête : Appliquez des règles de complexité de requête qui considèrent les champs dupliqués comme faisant partie du coût global d'une requête. Cela permet de limiter le nombre de champs dupliqués traités, protégeant ainsi le serveur de l'épuisement des ressources.
  • Limiter les répétitions de champs : Configurez des limites côté serveur sur le nombre de fois qu'un champ peut être dupliqué dans une seule requête GraphQL. Vous pouvez utiliser des outils comme GraphQL Armor pour appliquer de telles limites et empêcher la surcharge liée à la duplication de champs.
 // Configuring for GraphQL Armor
 GraphQLArmorConfig({
         maxFieldDuplicates: {
    // Enable or disable the plugin | default: true
             enabled: true,

    // Set the maximum number of field duplications allowed per query | default: 10
             n: 10,

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

    // Callbacks to execute when a query 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_field_duplicates(query: str) -> None:
     """
         This validation prevents the execution of queries containing excessive
         duplicated fields to avoid overloading the server.
         """
         class FieldDuplicationParser(parser.Parser):
             def parse_duplicates(self) -> list[ast.FieldNode]:
                     field_counts = {}
                         while self.peek(graphql.TokenKind.NAME):
                             field_name = self.parse_field().name.value
                                 field_counts[field_name] = field_counts.get(field_name, 0) + 1
                                 if field_counts[field_name] > api.API_MAX_FIELD_DUPLICATES:
                                     raise graphql.GraphQLError("Exception - Max field duplicates exceeded")
                                 return []
                 ast_parser = FieldDuplicationParser(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_L2:
    • V4_1_3
    • V4_1_5
    • V5_3_3
    • V5_3_4
    • V9_1_1
    • V9_1_2
    • V12_1_1
    • V12_1_2
  • OWASP_ASVS_L3:
    • V4_1_3
    • V4_1_5
    • V5_3_3
    • V5_3_4
    • V9_1_1
    • V9_1_2
    • 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