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