mediumCWE-942A05:2021

CORS Abierto en API Routes de Next.js

Las API routes de Next.js configuradas con Access-Control-Allow-Origin: * permiten a cualquier sitio web hacer requests cross-origin autenticados, habilitando ataques tipo CSRF.

Cómo Funciona

Cuando las API routes configuran Access-Control-Allow-Origin a *, cualquier sitio web puede hacer requests a tu API desde el navegador del usuario. Si la API también permite credenciales (cookies), el sitio de un atacante puede hacer requests autenticados en nombre de usuarios logueados. Esto habilita robo de datos cross-site: el atacante hostea una página maliciosa que hace fetch de datos de tu API usando las cookies de sesión de la víctima. Incluso sin credenciales, CORS abierto expone respuestas de la API a cualquier origen, filtrando datos que solo deberían ser accesibles desde tu frontend.

Código Vulnerable
// pages/api/user/profile.ts
export default function handler(req, res) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', '*');
  const user = await getUser(req);
  res.json(user);
}
Código Seguro
// pages/api/user/profile.ts
const ALLOWED_ORIGINS = [process.env.NEXT_PUBLIC_APP_URL];

export default function handler(req, res) {
  const origin = req.headers.origin;
  if (ALLOWED_ORIGINS.includes(origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
    res.setHeader('Access-Control-Allow-Credentials', 'true');
  }
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  const user = await getUser(req);
  res.json(user);
}

Ejemplo Real

En 2019, una política CORS mal configurada en una API bancaria permitió a investigadores demostrar exfiltración de datos cross-origin de balances de cuentas e historial de transacciones hosteando una página proof-of-concept en un dominio controlado por el atacante.

Cómo Prevenirlo

  • Nunca uses Access-Control-Allow-Origin: * en API routes autenticadas
  • Valida el header Origin contra un allowlist de dominios de confianza
  • Evita Access-Control-Allow-Credentials: true con orígenes wildcard
  • Usa middleware de Next.js para centralizar la configuración CORS

Tecnologías Afectadas

ReactNext.jsNode.js

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas