lowCWE-400API4:2023

Queries N+1 Explotables

La expansion de relaciones sin limites en queries de ORM permite a los atacantes disparar miles de queries a la base de datos con un solo request de API, causando denegacion de servicio.

Cómo Funciona

Los queries N+1 ocurren cuando una aplicacion carga una lista de registros y luego hace un query separado para los datos relacionados de cada registro. Aunque esto es principalmente un problema de rendimiento, se convierte en una vulnerabilidad de seguridad cuando los atacantes pueden controlar el alcance de la expansion de relaciones. Al solicitar relaciones profundamente anidadas o datasets grandes a traves de parametros de API, un atacante puede forzar al servidor a ejecutar miles de queries simultaneamente. Esto satura el pool de conexiones a la base de datos y puede crashear la aplicacion. Las APIs GraphQL son especialmente susceptibles porque los clientes controlan la profundidad del query.

Código Vulnerable
// API endpoint with unbounded includes
app.get('/api/users', async (req, res) => {
  const users = await prisma.user.findMany({
    include: { posts: { include: { comments: {
      include: { author: { include: { posts: true } } }
    } } } }
  });
  res.json(users);
});
Código Seguro
// Bounded query with pagination and limited depth
app.get('/api/users', async (req, res) => {
  const users = await prisma.user.findMany({
    take: 20,
    select: { id: true, name: true, email: true,
      posts: { take: 5, select: { id: true, title: true } }
    }
  });
  res.json(users);
});

Ejemplo Real

En 2023, multiples APIs GraphQL fueron atacadas con ataques de profundidad de query. Los atacantes construyeron queries profundamente anidados que se expandian en millones de operaciones de base de datos, tumbando servicios de produccion. GitHub habia abordado esto previamente implementando limites de complejidad de query en su API GraphQL.

Cómo Prevenirlo

  • Limita la profundidad y complejidad de queries con herramientas como graphql-depth-limit
  • Siempre pagina resultados con take/limit y paginacion basada en cursor
  • Usa select en vez de include para obtener solo los campos necesarios
  • Monitorea y configura alertas para volumenes inusuales de queries por request

Tecnologías Afectadas

Node.jsPythonJavaPHPGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas