highCWE-200A01:2021

Exposición de Secretos en __NEXT_DATA__

Los props de página de Next.js pasados por getServerSideProps o getStaticProps filtran datos sensibles como API keys, URLs de base de datos o configuración interna a través del script tag __NEXT_DATA__.

Cómo Funciona

En Next.js, los datos retornados de getServerSideProps o getStaticProps se serializan en un objeto JSON __NEXT_DATA__ embebido en el HTML como un script tag. Estos datos son visibles para cualquiera que vea el source de la página. Los devs frecuentemente hacen fetch de datos server-side y accidentalmente pasan el objeto de respuesta completo — incluyendo API keys, URLs internas, tokens de usuario o strings de conexión a base de datos — como props de página. Aunque la UI solo muestre un subconjunto de los datos, el objeto completo queda expuesto en __NEXT_DATA__.

Código Vulnerable
export async function getServerSideProps() {
  const res = await fetch('https://api.internal.com/users', {
    headers: { 'X-API-Key': process.env.INTERNAL_API_KEY }
  });
  const data = await res.json();
  // Entire response including internal fields passed to client
  return { props: { data } };
}
Código Seguro
export async function getServerSideProps() {
  const res = await fetch('https://api.internal.com/users', {
    headers: { 'X-API-Key': process.env.INTERNAL_API_KEY }
  });
  const data = await res.json();
  // Only pass the fields the UI actually needs
  const safeData = data.map(u => ({
    id: u.id, name: u.name, avatar: u.avatar
  }));
  return { props: { users: safeData } };
}

Ejemplo Real

En 2022, investigadores de seguridad encontraron múltiples aplicaciones Next.js filtrando Stripe secret keys, strings de conexión a base de datos y tokens de API internos a través de __NEXT_DATA__. Un sitio de e-commerce expuso su Stripe secret key, que podía ser usada para emitir reembolsos o acceder a datos de pago.

Cómo Prevenirlo

  • Solo retorna los campos específicos que necesita la UI en los props de página
  • Nunca pases respuestas completas de API o registros de base de datos como props
  • Audita __NEXT_DATA__ en producción viendo el source de la página
  • Usa Next.js App Router con Server Components para evitar serializar datos sensibles

Tecnologías Afectadas

ReactNext.jsNode.js

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas