Cuando se usa `whenloaded ()` en GraphQL, que típicamente es un método para cargar condicionalmente datos o asociaciones relacionadas (por ejemplo, en los resoluciones GraphQL basadas en ORM), pueden surgir varias dificultades de seguridad comunes. Estas dificultades se relacionan principalmente con problemas de seguridad GRAPHQL más amplios, pero son particularmente relevantes porque `whenloaded ()` a menudo implica obtener datos anidados o relacionados adicionales, aumentando la complejidad y el riesgo.
Common Security se enfrentan con `whenloaded ()` en GraphQL
** 1. Verificaciones de autorización inconsistentes o faltantes
`whenloaded ()` a menudo desencadena la carga de datos anidados o relacionados después de que se ejecuta el resolución inicial. Si la lógica de autorización no se aplica de manera consistente en cada resolución o punto de carga de datos (incluidos los activados por `whenloaded ()`), los usuarios no autorizados pueden obtener acceso a datos confidenciales. Este es un problema común en el que algunas rutas a los mismos datos están protegidas, pero otras (como las que a través de `whenloaded ()`) no lo están, permitiendo a los atacantes evitar los controles de acceso [4] [6]. La autorización debe aplicarse tanto a nivel de consulta como dentro de todos los resolutores anidados o cargadores de datos.
** 2. Consultas excesivas y complejas que conducen a la negación del servicio (DOS)
Uso de `whenloaded ()` puede causar consultas profundamente anidadas que obtienen grandes cantidades de datos relacionados. Los atacantes pueden explotar esto creando consultas que causan la carga y el procesamiento de datos excesivos, lo que lleva al agotamiento de los recursos y DOS. La capacidad de GraphQL para obtener múltiples objetos relacionados en una sola consulta hace que sea difícil predecir el uso de recursos, y `whenloaded ()` puede exacerbar esto cargando datos adicionales condicionalmente [4] [5]. Las mitigaciones incluyen limitación de profundidad de consulta, puntuación de complejidad y limitación de velocidad.
** 3. Exposición de datos confidenciales a través de la selección de campo inadecuada
Si `whenloaded ()` Carga datos relacionados sin un control cuidadoso sobre qué campos están expuestos, la información confidencial, como las contraseñas, los tokens o los detalles del usuario privado, se puede devolver inadvertidamente en la respuesta GraphQL [5]. Este riesgo aumenta si faltan las verificaciones de autorización o si los mensajes de error gotan en la información confidencial. Los desarrolladores deben asegurarse de que los campos confidenciales nunca estén expuestos, incluso cuando se cargan los datos anidados.
** 4. Ataques de inyección a través de una validación de entrada inadecuada
Cuando `whenloaded ()` se usa con argumentos dinámicos o filtros, la validación de entrada inadecuada puede conducir a vulnerabilidades de inyección, como la inyección de consulta GraphQL o incluso la inyección de SQL si la obtención de datos subyacentes no se parametriza correctamente [6]. Los atacantes pueden inyectar consultas o comandos maliciosos que manipulan la lógica de recuperación de datos. La validación de entrada adecuada y el uso de consultas parametrizadas son esenciales.
** 5. Omitiendo la limitación de la velocidad y las protecciones de la fuerza bruta
Debido a que `whenloaded ()` puede causar múltiples obtacas de datos anidados dentro de una sola consulta, los atacantes pueden explotar esto para evitar la limitación de la velocidad tradicional. Por ejemplo, pueden enviar una consulta compleja única que desencadena muchos datos o mutaciones de datos, realizando efectivamente la fuerza bruta o los ataques de enumeración sin desencadenar límites por solicitud [4] [7]. Las estrategias de limitación de tarifas deben considerar la complejidad de la consulta y las operaciones anidadas.
** 6. Aumento de la superficie de ataque debido a la introspección y las herramientas del esquema
El uso de `whenloaded ()` a menudo refleja un esquema complejo con múltiples relaciones anidadas. Los atacantes pueden usar la introspección GraphQL y las herramientas como Graphiql para descubrir estas relaciones y crear consultas que exploten `whenloaded ()` para acceder a datos no intencionados [1] [8]. Deshabilitar la introspección en la producción o restringirla a los usuarios autorizados puede reducir este riesgo.
Resumen
Las principales dificultades de seguridad cuando se usan `whenloaded ()` en GraphQL giran alrededor:
- No hacer cumplir la autorización consistente en todas las rutas de carga de datos anidados.
- Permitir consultas demasiado complejas o profundas que causan DOS.
- Exponer datos confidenciales a través de campos anidados.
- Validación de entrada insuficiente que conduce a ataques de inyección.
- Pasando los límites de la tasa debido a consultas anidadas complejas.
- Aumento de la exposición debido a la introspección del esquema y las herramientas.
Las mitigaciones incluyen verificaciones de autorización rigurosas en cada resolución, complejidad de consultas y limitación de profundidad, validación de entrada estricta, diseño cuidadoso de esquemas, deshabilitación de la introspección en la producción y limitación de tasa integral personalizada para la estructura de consultas GraphQL [3] [4] [5] [6] [8].
Citas:
[1] https://portswigger.net/web-security/graphql
[2] https://www.imperva.com/blog/graphql-vulnerability-common-attacks/
[3] https://tyk.io/blog/graphql-security-7-common-vulnerability--how-to-mitate-the-risks/
[4] https://www.brightsec.com/blog/graphql-security/
[5] https://blog.convisoappsec.com/en/security-ingraphql/
[6] https://wundergraph.com/blog/the_complete_graphql_security_guide_fixing_the_13_most_common_graphql_vulnerability_to_make_your_api_production_ready_ready
[7] https://beaglesecurity.com/blog/article/graphql-attacks-vulnerability.html
[8] https://www.fastly.com/blog/exploring-the-security-implications-of-Graphql