criticalCWE-94A03:2021

eval() con Input de Usuario

Pasar datos controlados por el usuario a eval(), new Function() o funciones similares de ejecución de código dinámico, habilitando ejecución de código arbitrario en tu servidor.

Cómo Funciona

eval() ejecuta como JavaScript cualquier string que le pases. Si ese string contiene input del usuario, el atacante controla qué código corre en tu servidor. Esto es Ejecución Remota de Código (RCE) — el peor resultado posible. new Function(), setTimeout(string) y setInterval(string) tienen el mismo problema.

Código Vulnerable
// MAL: input del usuario ejecutado como código
export async function POST(req: Request) {
  const { formula } = await req.json();
  const result = eval(formula); // el atacante envía: process.exit(1)
  return Response.json({ result });
}
Código Seguro
// BIEN: usa un evaluador de expresiones seguro
import { evaluate } from 'mathjs';
export async function POST(req: Request) {
  const { formula } = await req.json();
  // mathjs solo evalúa matemáticas, no código
  const result = evaluate(formula);
  return Response.json({ result });
}

Ejemplo Real

Una herramienta no-code dejaba a los usuarios definir 'fórmulas personalizadas' usando un campo de texto conectado directo a eval(). Un investigador de seguridad envió `require('child_process').execSync('cat /etc/passwd')` y recibió el archivo de contraseñas del servidor en la respuesta.

Cómo Prevenirlo

  • Nunca uses eval(), new Function() o setTimeout/setInterval con un argumento de string
  • Para expresiones matemáticas, usa mathjs o expr-eval — solo evalúan matemáticas, no código
  • Para lógica de templates, usa un motor de templates con sandbox como Handlebars o Nunjucks
  • Si genuinamente necesitas correr código provisto por el usuario, usa una VM con sandbox (vm2 o isolated-vm)

Tecnologías Afectadas

nodejsNext.jsReact

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas