Index
Sobrecarga de alias en la API GraphQL
Descripción
La sobrecarga de alias en GraphQL ocurre cuando un atacante usa una gran cantidad de alias en una consulta para abrumar las capacidades de procesamiento del servidor.
Los alias en GraphQL permiten a un cliente solicitar el mismo campo varias veces con diferentes nombres. Sin embargo, el uso excesivo de alias en una sola consulta puede provocar ataques de denegación de servicio (DoS) al agotar los recursos del servidor. Este ataque puede degradar el rendimiento o causar cortes de servicio completos. Ejemplo:
query oxo {
alias1: __typename
alias2: __typename
alias3: __typename
alias4: __typename
alias5: __typename
...
}
Impacto de seguridad de la sobrecarga de alias:
- Denegación de servicio (DoS): Al enviar una consulta con una gran cantidad de alias, los atacantes pueden hacer que el servidor use recursos excesivos para procesar y responder, lo que podría ralentizar o bloquear el servicio.
- Agotamiento de recursos: Los servidores pueden tener dificultades para manejar la carga computacional de procesar numerosos alias, lo que podría provocar el agotamiento de la memoria, picos de CPU o un rendimiento degradado.
- Indisponibilidad del sistema: Si no se controla un ataque de sobrecarga de alias, puede hacer que la API GraphQL no esté disponible, interrumpiendo el servicio para todos los usuarios.
Recomendación
Para mitigar el riesgo de ataques de sobrecarga de alias, puede seguir los siguientes pasos:
-
Implementar tiempos de espera (timeouts): Aplique tiempos de espera a las consultas para finalizar aquellas que tarden demasiado en resolverse. Al establecer un tiempo de ejecución máximo, puede finalizar automáticamente las consultas que abusen de los alias y consuman recursos excesivos del servidor, evitando ataques de denegación de servicio (DoS).
-
Limitar alias: Configure límites en el lado del servidor sobre la cantidad de alias permitidos en una sola consulta GraphQL. Puede configurar herramientas como GraphQL Armor para limitar los alias y evitar la sobrecarga.
// Configuración de GraphQL Armor
GraphQLArmorConfig({
maxAliases: {
// Habilitar o deshabilitar el complemento | por defecto: true
enabled: true,
// Establezca el número máximo de alias permitidos por consulta | por defecto: 50
n: 50,
// Devoluciones de llamada para ejecutar cuando se acepta una consulta
onAccept: [],
// Devoluciones de llamada para ejecutar cuando se rechaza una consulta
onReject: [],
// Propagar los detalles del rechazo al cliente | por defecto: 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:
"""
Esta validación evita la ejecución de consultas que contienen un número excesivo
de alias para evitar la sobrecarga del servidor.
"""
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()
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_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