Estudio técnico de la vulnerabilidad CVE-2025-68613 en n8n, que cubre las versiones afectadas, el escenario de exploración en laboratorio, el análisis ofensivo y defensivo, y las estrategias de mitigación.
n8n es una plataforma de automatización de flujos de trabajo utilizada para integrar sistemas y servicios a través de flujos visuales y expresiones JavaScript.
CVE-2025-68613 es una vulnerabilidad crítica de Ejecución Remota de Código (RCE), con CVSS 9.9, que afecta a múltiples versiones de n8n. El fallo ocurre en el procesamiento de expresiones JavaScript en flujos de trabajo en versiones vulnerables que no están correctamente aisladas. Esto permite que usuarios autenticados con permisos de edición ejecuten código fuera del comportamiento esperado de la aplicación.
En la práctica, este fallo puede ser explotado para ejecutar comandos en el servidor donde se ejecuta n8n, utilizando los privilegios de la propia aplicación. Las versiones afectadas van desde 0.211.0 hasta versiones anteriores a las correcciones aplicadas en 1.120.4, 1.121.1 y 1.122.0.
Este repositorio documenta técnicamente CVE-2025-68613, cubriendo el contexto del fallo, las versiones afectadas, la explotación y las medidas de mitigación recomendadas.

| Estado | Versión n8n | Nota |
|---|---|---|
| ❌ Afectada | >= 0.211.0 | Introducción del mecanismo vulnerable |
| ❌ Afectada | < 1.120.4 | Vulnerable hasta el parche en la rama 1.120 |
| ❌ Afectada | < 1.121.1 | Vulnerable hasta el parche en la rama 1.121 |
| ❌ Afectada | < 1.122.0 | Vulnerable hasta el parche en la rama 1.122 |
| ✅ Corregida | 1.120.4 | Corrección oficial aplicada |
| ✅ Corregida | 1.121.1 | Corrección oficial aplicada |
| ✅ Corregida | >= 1.122.0 | Corrección incorporada por defecto |
Se recomienda actualizar inmediatamente a la versión 1.122.0 o superior.
Para demostrar la vulnerabilidad, se requieren las siguientes condiciones:
El fallo ocurre durante la creación y ejecución de flujos de trabajo, no antes de la autenticación.
El primer paso es iniciar sesión en la interfaz web de n8n con un usuario válido.

Este paso confirma que el ataque no es anónimo. La vulnerabilidad requiere un usuario autenticado.
Después de iniciar sesión, verificar que el usuario tiene permisos para crear y editar flujos de trabajo.

Esto es relevante porque solo los usuarios con este nivel de acceso pueden insertar expresiones dinámicas en los flujos de trabajo.
Con el usuario autenticado, crear un nuevo flujo de trabajo desde cero.

Aquí comienza el uso legítimo de la funcionalidad de n8n que, en versiones vulnerables, puede ser explotado.
El primer nodo agregado al flujo de trabajo es el Disparador Manual.

Qué hace este nodo: Permite la ejecución manual del flujo de trabajo, utilizado como punto de inicio del flujo.
En este escenario, solo sirve como punto de entrada para la ejecución del flujo de trabajo.
El segundo nodo agregado es Edit Fields (Set).

Qué hace este nodo: Este nodo permite crear, modificar o sobrescribir campos de datos dentro del flujo de trabajo. Acepta valores estáticos o expresiones JavaScript evaluadas en tiempo de ejecución.
Es precisamente en este punto donde se manifiesta la vulnerabilidad.
Dentro del campo de valor del nodo Edit Fields (Set), insertar una expresión JavaScript envuelta por {{ }}, que es el formato utilizado por n8n para evaluar expresiones dinámicas.

Ejemplo de payload:
{{ (function(){
return this.process.mainModule
.require('child_process')
.execSync('id')
.toString()
})() }}
(function(){ ... })(): Define una función autoinvocada, permitiendo encapsular toda la lógica y devolver un valor directamente a la expresión del flujo de trabajo.this.process: Accede al objeto process interno de Node.js, que expone información y recursos del tiempo de ejecución.process.mainModule: Permite acceder al módulo principal de la aplicación, posibilitando la carga de otros módulos internos de Node.js.require('child_process'): Módulo nativo de Node.js que permite crear nuevos procesos en el sistema operativo y ejecutar comandos externos.execSync('id'): Ejecuta un comando directamente en el sistema operativo donde se ejecuta n8n, utilizando los privilegios del proceso de la aplicación..toString(): Convierte la salida del comando ejecutado a texto, permitiendo que el resultado se muestre en la interfaz de n8n.El resultado mostrado confirma que el comando fue ejecutado en el sistema operativo utilizando los privilegios del proceso de n8n, caracterizando una Ejecución Remota de Código (RCE).