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.
// 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 });
}// 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
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
API Keys Hardcodeadas
criticalAPI keys, tokens o secretos escritos directo en el código fuente, visibles para cualquiera con acceso al repo — incluyendo repos públicos de GitHub.
Sin Validación de Inputs
mediumDatos enviados por el usuario pasados directo a bases de datos o APIs externas sin ninguna validación de tipo, formato o contenido.
Contraseñas en Texto Plano
criticalContraseñas de usuarios guardadas como strings crudos en la base de datos en lugar de hashearse con bcrypt o Argon2.
JWT Sin Expiración
highJWTs firmados sin el claim `exp` que nunca expiran, lo que significa que un token robado da acceso permanente sin forma de revocarlo.