Array-Based Batch Queries
Requêtes par lots basées sur des tableaux
Description
Les requêtes par lots basées sur des tableaux dans GraphQL se produisent lorsqu'un attaquant envoie plusieurs requêtes dans une seule requête HTTP en utilisant une structure de tableau, ce qui peut surcharger les capacités de traitement du serveur.
Dans GraphQL, les clients sont généralement autorisés à envoyer une seule requête par requête HTTP. Cependant, s'ils ne sont pas correctement restreints, les attaquants peuvent regrouper plusieurs requêtes dans une seule requête HTTP à l'aide d'un tableau. Cela peut entraîner une attaque par déni de service (DoS) en consommant des ressources serveur excessives, en dégradant les performances ou en provoquant une interruption de service.
Exemple :
[
{ query: "{ user(id: 1) { name } }" },
{ query: "{ user(id: 2) { name } }" },
{ query: "{ user(id: 3) { name } }" }
]
Impact sur la sécurité des requêtes par lots basées sur des tableaux :
Déni de service : Les attaquants peuvent envoyer de grands lots de requêtes en une seule fois, forçant le serveur à traiter de nombreuses opérations simultanément. Cela peut entraîner un épuisement des ressources et des plantages potentiels du service. Épuisement des ressources : Comme pour la duplication de champs, les requêtes par lots basées sur des tableaux peuvent augmenter l'utilisation du processeur et de la mémoire en surchargeant le serveur avec un grand nombre de requêtes en un seul appel. Interruption de service : S'ils ne sont pas contrôlés, les lots de requêtes basés sur des tableaux peuvent rendre l'API GraphQL indisponible pour les utilisateurs légitimes, entraînant des temps d'arrêt du système ou une dégradation des performances.
Recommandation
Pour atténuer les risques d'attaques par lots de requêtes basées sur des tableaux dans GraphQL, où plusieurs requêtes sont regroupées en une seule, vous pouvez appliquer les stratégies suivantes :
- Implémenter des limites de complexité des requêtes : Définissez des règles qui tiennent compte du nombre de requêtes traitées dans une seule requête HTTP. Cela permet de limiter la charge sur le serveur et d'empêcher les attaquants d'envoyer des lots de requêtes excessivement volumineux.
- Limiter le nombre de requêtes par requête HTTP : Appliquez des restrictions côté serveur sur le nombre de requêtes pouvant être envoyées dans un seul lot. Des outils comme GraphQL Armor peuvent aider à imposer des limites et à empêcher la surcharge des ressources via des requêtes par lots basées sur des tableaux.
// Configuring for GraphQL Armor
GraphQLArmorConfig({
maxBatchQueries: {
// Enable or disable the plugin | default: true
enabled: true,
// Set the maximum number of queries allowed per request | default: 5
n: 5,
// Callbacks to execute when a query batch is accepted
onAccept: [],
// Callbacks to execute when a query batch 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_batch_queries(query: str) -> None:
"""
This validation prevents the execution of requests containing excessive
batch queries to avoid overloading the server.
"""
class BatchQueryParser(parser.Parser):
def parse_batch_queries(self) -> list[ast.OperationDefinitionNode]:
query_count = 0
while self.peek(graphql.TokenKind.BRACKET_L):
self.parse_operation_definition()
query_count += 1
if query_count > api.API_MAX_BATCH_QUERIES:
raise graphql.GraphQLError("Exception - Max batch queries exceeded")
return []
ast_parser = BatchQueryParser(query)
ast_parser.parse_document()
Liens
Normes
- CWE_TOP_25:
- CWE_20
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_4
- REQ_11_3
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- OWASP_ASVS_L2:
- V5_3_3
- V5_3_4
- V9_1_1
- V12_1_1
- V12_1_2
- OWASP_ASVS_L3:
- V5_3_3
- V5_3_4
- 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