Field Duplication in GraphQL API
Duplicación de campos en la API GraphQL
Descripción
La duplicación de campos en GraphQL ocurre cuando un atacante envía una consulta que solicita el mismo campo repetidamente, sobrecargando las capacidades de procesamiento del servidor.
En GraphQL, los clientes pueden solicitar múltiples campos en una consulta, incluyendo el mismo campo varias veces. Sin embargo, la duplicación excesiva de campos puede resultar en un ataque de denegación de servicio (DoS) al consumir los recursos del servidor. Esto puede degradar el rendimiento o causar una interrupción del servicio. Ejemplo:
query overload {
user {
id
id
id
id
id
...
}
}
Impacto de seguridad de la duplicación de campos:
- Denegación de servicio (Denial of Service): Al duplicar el mismo campo en una consulta, los atacantes pueden forzar al servidor a procesar repetidamente la misma solicitud, lo que lleva a un uso excesivo de recursos y posibles caídas del servicio.
- Agotamiento de recursos (Resource Exhaustion): Similar a la sobrecarga de alias, este ataque puede causar picos en el uso de CPU y memoria, ralentizando el sistema y afectando el rendimiento general.
- Interrupción del servicio: Si no se mitiga, los ataques de duplicación de campos pueden hacer que la API GraphQL no esté disponible para usuarios legítimos, provocando tiempo de inactividad del sistema o un servicio degradado.
Recomendación
Para mitigar el riesgo de ataques de duplicación de campos, puede tomar las siguientes medidas:
- Implementar límites de complejidad de consulta: Aplique reglas de complejidad de consulta que consideren los campos duplicados como parte del costo general de una consulta. Esto ayuda a limitar el número de campos duplicados procesados, protegiendo así al servidor del agotamiento de recursos.
- Limitar las repeticiones de campos: Configure límites en el lado del servidor sobre la cantidad de veces que se puede duplicar un campo en una sola consulta de GraphQL. Puede usar herramientas como GraphQL Armor para aplicar dichos límites y evitar la sobrecarga por duplicación de campos.
// 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()
Enlaces
Estándares
- 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