Array-Based Batch Queries
Consultas por lotes basadas en matrices
Descripción
Las consultas por lotes basadas en matrices en GraphQL ocurren cuando un atacante envía múltiples consultas en una sola solicitud utilizando una estructura de matriz, lo que puede sobrecargar las capacidades de procesamiento del servidor.
En GraphQL, a los clientes generalmente se les permite enviar una sola consulta por solicitud. Sin embargo, si no se restringen adecuadamente, los atacantes pueden agrupar múltiples consultas en una sola solicitud utilizando una matriz. Esto puede provocar un ataque de Denegación de Servicio (DoS) al consumir recursos excesivos del servidor, degradar el rendimiento o causar una interrupción del servicio.
Ejemplo:
[
{ query: "{ user(id: 1) { name } }" },
{ query: "{ user(id: 2) { name } }" },
{ query: "{ user(id: 3) { name } }" }
]
Impacto en la seguridad de las consultas por lotes basadas en matrices:
Denegación de servicio: Los atacantes pueden enviar grandes lotes de consultas en una sola solicitud, obligando al servidor a manejar numerosas operaciones simultáneamente. Esto puede provocar el agotamiento de los recursos y posibles fallas en el servicio. Agotamiento de recursos: Al igual que con la duplicación de campos, las consultas por lotes basadas en matrices pueden aumentar el uso de CPU y memoria al sobrecargar el servidor con una gran cantidad de consultas en una sola llamada. Interrupción del servicio: Si no se controlan, las consultas por lotes basadas en matrices pueden hacer que la API GraphQL no esté disponible para usuarios legítimos, causando tiempo de inactividad del sistema o un rendimiento degradado.
Recomendación
Para mitigar el riesgo de ataques de consultas por lotes basadas en matrices en GraphQL, donde múltiples consultas se agrupan en una sola solicitud, puede aplicar las siguientes estrategias:
- Implementar límites de complejidad de las consultas: Establezca reglas que tengan en cuenta la cantidad de consultas que se procesan en una sola solicitud. Esto ayuda a limitar la carga en el servidor y evita que los atacantes envíen lotes de consultas excesivamente grandes.
- Limitar la cantidad de consultas por solicitud: Imponga restricciones en el lado del servidor sobre la cantidad de consultas que se pueden enviar en un solo lote. Herramientas como GraphQL Armor pueden ayudar a imponer límites y prevenir la sobrecarga de recursos a través de consultas por lotes basadas en matrices.
// 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()
Enlaces
Estándares
- 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