CVE-2026-92948
KrytyczneCVSS 9.9Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 38 - wyżej niż 38% wszystkich znanych CVE
Streszczenie
vm2 w wersjach od 3.9.6 do 3.11.6 jest podatny na obejście listy dozwolonych wbudowanych modułów NodeVM, co umożliwia ucieczkę z sandboxa w Node.js 24 i nowszych, gdy osadzający jawnie zezwoli na wbudowany moduł node:test. W Node.js 24+ module.builtinModules ujawnia klucz node:test, który nie jest objęty ochroną DANGEROUS_BUILTINS vm2, a ponieważ requireImpl() usuwa tylko jeden prefiks 'node:', kod sandboxa wywołujący require('node:node:test') otrzymuje proxy do modułu hosta, a wywołania node:test.run() z atakującym kontrolowanym execArgv (np. --eval) wykonują dowolny kod JavaScript w nieograniczonym procesie hosta.
Ocena ryzyka
Ucieczka z sandboxa prowadzi do wykonania dowolnego kodu JavaScript w nieograniczonym procesie hosta Node.js, co oznacza pełną kompromitację systemu przez niezaufany kod pluginu.
Rekomendacja
Zaktualizuj vm2 do wersji 3.11.7, która naprawia obejście listy dozwolonych wbudowanych modułów i normalizację prefiksu 'node:'.
Inne podatności w vm2
Zobacz wszystkie- CVE-2026-93604Wysokie
vm2 do wersji 3.12.0 udostępnia funkcję crypto.setFips() z Node.js niezaufanemu kodowi gościa, gdy osadzający jawnie zezwoli na wbudowany moduł crypto dla NodeVM. Sanitizer nie blokuje crypto.setFips, co pozwala kodowi gościa zmienić tryb FIPS całego procesu hosta, naruszając izolację NodeVM. Naprawiono w vm2 3.12.1.
- CVE-2026-92962Niskie
vm2, sandbox do uruchamiania niezaufanego kodu JavaScript, w wersjach do 3.11.3 włącznie używa przypisania indeksu z przechodzeniem po prototypie w defaultSandboxPrepareStackTrace, co pozwala kodowi w sandboxie przechwycić linie stosu błędów. Luka ma niski wpływ (kanał boczny informacji) i została naprawiona w wersji 3.11.4.
- CVE-2026-92952Średnie
W vm2 w wersjach od 3.11.4 do 3.11.6 niekompletnie filtrowano zarejestrowane wewnętrzne symbole Node.js na granicy piaskownicy. Filtry w lib/setup-sandbox.js oraz sprawdzenia symboli i pułapki zapisu w lib/bridge.js używają stałej listy znanych niebezpiecznych symboli, pomijając nodejs.stream.disturbed i nodejs.stream.errored, które są eksponowane na prototypach WebStream w nowszych wersjach Node.js. Gdy osadzający udostępnia obiekt WebStream i moduł stream/web piaskownicy, kod piaskownicy może uzyskać prawdziwe symbole hosta i użyć ich jako kluczy zapisu na obiektach strumieni hosta, uszkadzając widoczny dla hosta stan strumienia. Może to obejść logikę hosta opartą na publicznych pomocnikach stanu strumienia Node.js. Nie jest to prymityw wykonania kodu hosta w zgłoszonym dowodzie podatności. To niekompletna poprawka wcześniejszego problemu filtrowania symboli nodejs.*. Naprawiono w vm2 3.11.7.
- CVE-2026-92950Wysokie
Podatność w narzędziu CLI vm2 (przed wersją 3.11.7) umożliwia ucieczkę z piaskownicy i wykonanie dowolnego kodu w procesie Node.js hosta. Atakujący może dostarczyć złośliwy plik skryptu, który używa require(__filename) do ponownego wykonania siebie w środowisku hosta, omijając izolację piaskownicy i uzyskując dostęp do modułów takich jak fs i child_process.
- CVE-2026-92945Średnie
vm2 w wersjach przed 3.11.7 zawiera podatność obejścia listy dozwolonych modułów w funkcji isPathAllowedForModule, która używa dopasowania prefiksu ciągu znaków zamiast porównania z granicami ścieżki. Atakujący może uzyskać dostęp do niedozwolonych pakietów dzielących prefiks z modułami z listy dozwolonych, wykonując względne require z dozwolonych pakietów przy wyłączonym ładowaniu tranzytywnym.
- CVE-2026-92936Średnie
vm2 w wersjach od 3.11.0 do 3.11.6 ujawnia bezwzględne ścieżki systemu plików hosta do kodu w sandboxie poprzez formatowanie stosu błędów. Kod dostarczony przez atakującego może wymusić na transformatorze źródła hosta zgłoszenie SyntaxError i odczytać właściwość .stack błędu, omijając redakcję ścieżek hosta po stronie sandboxa. Domyślne konfiguracje new VM() i new NodeVM() są podatne bez specjalnych opcji.
- CVE-2026-100721Krytyczne
Podatność w vm2 przed wersją 3.12.2 umożliwia obejście autoryzacji w resolverze modułów zewnętrznych NodeVM. Gdy konfiguracja `require.external` używa niestandardowego resolwera z `context: 'host'`, kod gościa może zażądać modułu z listy dozwolonych, a następnie ścieżki bezwzględnej modułu nieznajdującego się na liście, który współdzieli prefiks ścieżki. Prowadzi to do ucieczki z sandboxa i wykonania dowolnego kodu w procesie hosta.
- CVE-2026-93606Krytyczne
Podatność w bibliotece vm2 (npm) w wersjach do 3.12.0 umożliwia ucieczkę z sandboxa w klasach VM i NodeVM. Gdy aplikacja udostępnia funkcję hosta zwracającą Promise z innej domeny, mechanizm czyszczący odrzucenia nie obejmuje wszystkich przypadków, a kod w sandboxie może podmienić właściwości Promise i uzyskać nieprzefiltrowany obiekt hosta. Może to prowadzić do wykonania dowolnego kodu na hoście. Problem naprawiono w wersji 3.12.1.
- CVE-2026-93605Krytyczne
Podatność w NodeVM biblioteki vm2 przed wersją 3.12.1 umożliwia ucieczkę z sandboxa, ponieważ lista zablokowanych modułów DANGEROUS_BUILTINS nie zawiera child_process, mimo że blokuje inne moduły uruchamiające procesy. Atakujący może zażądać modułu child_process i wykonać dowolne polecenia na hoście, gdy NodeVM jest skonfigurowany z builtin:['*'] lub jawnym zezwoleniem na child_process.
- CVE-2026-93603Krytyczne
Podatność w vm2 do wersji 3.12.0 (naprawiona w 3.12.1) dotyczy nieprawidłowej obsługi odbiorcy `this` o wartości null w pułapce apply mostka. Gdy kod w sandboxie wywołuje funkcję hosta w trybie nieścisłym bez odbiorcy, niezdefiniowany odbiorca jest przekazywany do hosta, a V8 podstawia globalny obiekt domeny hosta. vm2 zwraca ten obiekt do sandboxa, co umożliwia pełną ucieczkę i dostęp do procesu. Wymaga to, aby aplikacja udostępniała co najmniej jedną funkcję hosta w trybie nieścisłym.
Oryginalny opis (angielski, źródło NVD)
vm2 versions >= 3.9.6 and <= 3.11.6 are affected by a NodeVM builtin allowlist bypass that permits a sandbox escape on Node.js 24 and newer when the embedder explicitly allows the node:test builtin (e.g. require: { builtin: ['node:test'] }). On Node.js 24+, module.builtinModules exposes the scheme-only key node:test, which is not covered by vm2's family-based DANGEROUS_BUILTINS protection, so it is stored in the generic host-passthrough loader. Because requireImpl() in lib/setup-node-sandbox.js strips a single 'node:' prefix before the builtin lookup, sandbox code calling require('node:node:test') resolves to the stored node:test key and receives a readonly proxy to the host module. Calls to node:test.run() are forwarded to the host implementation, which spawns a separate Node process for process-isolated test execution and passes through attacker-controlled execArgv values; supplying --eval=<JavaScript> therefore executes arbitrary JavaScript in an unrestricted host Node process outside the NodeVM sandbox. Fixed in vm2 3.11.7.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

