Der Fehler steckt nach Angaben von Endor Labs in der Komponente ExternalCopy. Diese Klasse dient in isolated-vm dazu, JavaScript-Objekte sicher aus dem Host-Isolate zu serialisieren und im Gast-Isolate wieder zu deserialisieren. Dieser Mechanismus ist nötig, weil sich JavaScript-Objekte nicht direkt vom Haupt-Thread von Node.js in ein Worker-Isolate übergeben lassen, da jedes V8 Isolate einen eigenen Zustand und eigenen Heap verwaltet.

Cristian-Alexandru Staicu von Endor Labs, dem die Entdeckung und Meldung der Schwachstelle zugeschrieben wird, beschreibt die Ursache als Typverwechslung bei der Verarbeitung der Option transferList in ExternalCopy. Dadurch könne Code innerhalb der Sandbox den Speicher der Host-Anwendung beschädigen. In seiner technischen Analyse erklärte Staicu, ausgehend von nichts weiter als einer einzelnen ivm.Reference – also dem üblichen Mechanismus, mit dem Hosts einer Sandbox überhaupt Fähigkeiten einräumen – habe sich der Fehler von einem Absturz mit kontrollierter Adresse bis zur Übernahme des Kontrollflusses des Host-Prozesses ausbauen lassen.

Die Folgen reichen laut den veröffentlichten Angaben von einem reproduzierbaren Absturz des Host-Prozesses mit einem Segmentation Fault (SIGSEGV) bis zu einem vollständigen Ausbruch aus der Sandbox vom Gast zum Host. Damit werde die Vertrauensgrenze unterlaufen, die isolated-vm eigentlich schaffen soll.

Projektmaintainer Marcel Laverdet schrieb in einem Advisory, die minimal nachgewiesene Auswirkung sei ein zuverlässig auslösbarer Denial-of-Service durch einen Absturz mit kontrollierter Adresse, sofern einem Gast eine ivm.Reference übergeben wurde. Die maximal demonstrierte Auswirkung sei die Übernahme des Kontrollflusses des Host-Prozesses und damit eine potenzielle Remotecodeausführung auf dem Host.

Gepatcht wurde die Schwachstelle in den Versionen 6.2.0 und 7.0.1, die in diesem Monat erschienen sind. Alle früheren Versionen bis einschließlich 7.0.0 gelten als verwundbar. Nutzer, die isolated-vm in ihren Entwicklungsumgebungen einsetzen, sollen auf die aktuelle Version aktualisieren.

Details zum vollständigen Exploit wurden absichtlich zurückgehalten, um Missbrauch zu erschweren. Staicu betonte zudem, dass nicht die Isolationsprimitive selbst versagt hätten. Nach seiner Darstellung hielt die Isolate-Grenze von V8 stand; das Problem liege in dem C++-Bindungscode, der Werte über diese Grenze hinweg transportiert.