Podatności vm2
70 znanych podatności CVE w vm2, przetłumaczonych i ocenionych.
- CVE-2026-100722Średnie
vm2 przed wersją 3.12.2 nie stosuje obsługi odrzuceń Promise po stronie hosta w pułapce konstrukcji sandbox-host. W BaseHandler, pułapka apply wywołuje markHostPromiseHandled() na zwróconej wartości, ale sąsiednia ścieżka construct zwraca wynik Reflect.construct bez tej samej sanityzacji. Jeśli embedder udostępnia konstruowalną funkcję hosta, której konstruktor zwraca natywnie odrzuconą Promise, niezaufany skrypt uruchomiony przez VM.run może ją wywołać z `new` i zignorować wynik; odrzucona Promise hosta przechodzi przez most nieobsłużona i, zgodnie z rygorystyczną polityką nieobsłużonych odrzuceń Node, jest promowana do nieprzechwyconego wyjątku, który kończy proces hosta.
- CVE-2026-92963Średnie
W vm2 w wersjach przed 3.11.2 nieprawidłowo ograniczono dostęp do globalnej zmiennej VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL. Atakujący może uzyskać dostęp do tego wewnętrznego obiektu stanu poprzez globalThis i pozyskać wrażliwe elementy wewnętrzne piaskownicy.
- CVE-2026-92961Wysokie
vm2 przed wersją 3.11.6 nie egzekwuje limitu bufferAllocLimit dla konstruktorów ArrayBuffer, SharedArrayBuffer i TypedArray, co pozwala atakującym alokować dowolną pamięć hosta. Atakujący mogą obejść limit alokacji bufora, używając tych wbudowanych funkcji V8 do wyczerpania pamięci procesu hosta i wywołania warunków braku pamięci.
- CVE-2026-92959Wysokie
vm2 przed wersją 3.11.8 nie egzekwuje w pełni opcji allowAsync: false w VM i NodeVM. Mimo że localPromise.prototype.then jest zastąpione procedurą rzucającą błąd 'Async not available', statyczne metody Promise w sandboxie (Promise.resolve, Promise.all, Promise.race, Promise.any, Promise.allSettled) nadal asymilują dostarczone przez atakującego thenable, co pozwala na zaplanowanie pracy po zakończeniu VM.run() lub NodeVM.run() i poza skonfigurowanym limitem czasu.
- CVE-2026-92958Wysokie
vm2 do wersji 3.11.6 zawiera obejście listy zablokowanych modułów wbudowanych w NodeVM. Gdy osadzający używa symbolu wieloznacznego builtin wraz z wpisami negatywnymi (np. require: { builtin: ['*', '-fs', '-child_process'] }), wpisy negatywne są dopasowywane po dokładnej nazwie modułu, więc -fs usuwa tylko moduł fs, a nie jego podścieżki, takie jak fs/promises. Kod w sandboxie może wywołać require('fs/promises') lub require('node:fs/promises') i uzyskać dostęp do API systemu plików opartego na obietnicach.
- CVE-2026-92954Wysokie
vm2 w wersjach od 3.10.0 do 3.11.7 nie oznacza jako obsłużonych obietnic zwracanych z realm hosta do sandboxa na granicy mostu. Tylko obietnice utworzone wewnątrz sandboxa są opakowywane w procedurę pochłaniającą odrzucenie, a most instaluje sanitizery odrzuceń po stronie hosta tylko wtedy, gdy kod sandboxa wywoła .then/.catch/.finally. W rezultacie kod w sandboxie może wywołać funkcję hosta zwracającą odrzuconą obietnicę i zignorować wartość zwracaną, pozostawiając obietnicę hosta nieobsłużoną, co powoduje zakończenie procesu hosta przez domyślne zachowanie Node.js.
- CVE-2026-92949Średnie
W vm2 w wersjach od 3.9.6 przed 3.11.7 nieprawidłowo ograniczono dostęp do właściwości akcesorów na zamrożonych obiektach, co pozwala skryptom w piaskownicy obejść zabezpieczenia vm.freeze() i vm.readonly(). Atakujący może użyć Object.getOwnPropertyDescriptor() lub __lookupSetter__() do wyodrębnienia i wywołania setterów obiektów hosta bezpośrednio, modyfikując właściwości oznaczone przez osadzającego jako tylko do odczytu.
- CVE-2026-92942Wysokie
W wersjach vm2 ≤ 3.11.6 opcja VM({ timeout }) nie jest egzekwowana dla kodu wykonywanego poza synchronicznym wywołaniem VM#run(). Sandboxowany kod może zarejestrować wywołanie zwrotne FinalizationRegistry i po zwolnieniu obiektu zablokować pętlę zdarzeń hosta na nieograniczony czas, powodując denial of service.
- CVE-2026-92933Średnie
vm2 w wersjach <= 3.11.7 udostępnia hostowy moduł util w sandboxie jako niefiltrowaną płytką kopię, a przestarzały wbudowany moduł sys (alias hostowego util) jest udostępniany przez ogólny loader wbudowany. W Node.js >= 22.9 daje to kodowi w sandboxie dostęp do util.getCallSites(), który zwraca pełny stos wywołań procesu hosta, w tym bezwzględne ścieżki plików, nazwy funkcji i numery linii. Podatność została naprawiona w vm2 3.11.8.
- CVE-2026-47683Wysokie
vm2 przed wersją 3.11.6 zawiera podatność, gdzie egzekwowanie limitu bufferAllocLimit nie obejmuje funkcji Buffer.concat(list, totalLength) ani Buffer.from(arrayLike) z kontrolowaną długością, co pozwala kodowi w sandboxie na duże synchroniczne alokacje pamięci poza limitem, mogące wyczerpać proces hosta.
- CVE-2026-47209Wysokie
W wersjach przed 3.11.4 biblioteka vm2 ma lukę w metodzie BaseHandler.set, która ignoruje parametr receiver i nieprawidłowo zapisuje do obiektu docelowego. To prowadzi do wycieku właściwości dziedziczonych do obiektu hosta, co stwarza możliwość ataku na klucze Symbol w różnych kontekstach.
- CVE-2026-47141Średnie
vm2 to otwarte źródło vm/sandbox dla Node.js. W wersjach przed 3.11.4, NodeVM udostępnia niektóre wbudowane funkcje obserwacji, które mogą być używane przez kod w piaskownicy do obserwacji danych aplikacji hosta.
- CVE-2026-47139Wysokie
vm2 to otwarte źródło vm/sandbox dla Node.js. W wersjach przed 3.11.4, NodeVM umożliwiało wykluczenie publicznych modułów sieciowych, jednak wewnętrzne moduły HTTP z podkreśleniem, takie jak _http_client i _http_server, nie były blokowane, co pozwalało na wykonywanie żądań HTTP mimo wykluczenia publicznych modułów.
- CVE-2026-47135Wysokie
vm2 to otwarte źródło vm/sandbox dla Node.js. W wersjach przed 3.11.4, nadpisanie Symbol.for w setup-sandbox.js przechwytuje tylko 2 z 9 niebezpiecznych symboli cross-realm Node.js, co pozwala na uzyskanie rzeczywistych symboli cross-realm i kontrolowanie zachowania po stronie hosta.
- CVE-2026-44004Wysokie
Podatność w bibliotece vm2 dla Node.js przed wersją 3.11.0 pozwala uruchomionemu w sandboxie kodowi na wywołanie funkcji Buffer.alloc() z dowolnym rozmiarem, co prowadzi do alokacji pamięci bezpośrednio na stercie hosta. Ponieważ Buffer.alloc jest synchronicznym natywnym wywołaniem C++, opcja timeout w vm2 nie jest w stanie przerwać tej operacji, co umożliwia wyczerpanie pamięci hosta i awarię procesu.
- CVE-2026-44003Średnie
W vm2 przed wersją 3.11.0 transformer kodu ma optymalizację wydajności, która pomija analizę AST, gdy kod nie zawiera słów kluczowych catch, import lub async. Ta ścieżka szybka pozwala kodowi w sandboxie uzyskać bezpośredni dostęp do wewnętrznej zmiennej VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL, ujawniając wewnętrzne funkcje bezpieczeństwa (handleException, wrapWith, import). Podatność naprawiono w wersji 3.11.0.
- CVE-2026-44002Średnie
W vm2 przed wersją 3.11.0 klasa opakowująca CallSite (pomyślana jako bezpieczne opakowanie dla natywnego CallSite V8) blokuje getThis() i getFunction(), aby zapobiec wyciekowi obiektów hosta, ale pozwala getFileName() zwracać nieoczyszczone bezwzględne ścieżki hosta. Kod w sandboxie może wyodrębnić pełną strukturę katalogów, ścieżki bibliotek i wersje frameworków serwera hosta. Podatność naprawiono w wersji 3.11.0.
- CVE-2026-44001Wysokie
Podatność w vm2 przed wersją 3.11.0 pozwala na ucieczkę z sandboksa poprzez konstruktor Promise, co powoduje nieobsłużone odrzucenie propagujące do hosta i crash procesu Node.js. Problem dotyczy wersji 3.10.5 i został załatany w 3.11.0.
- CVE-2026-44000Średnie
W vm2 przed wersją 3.11.0 naruszenie granicy piaskownicy pozwala tożsamości obiektu hosta przedostać się do piaskownicy poprzez rozwiązywanie obietnic (Promise) po stronie hosta. Gdy obietnica hosta rozwiązująca się do obiektu hosta jest udostępniona piaskownicy, wartość przekazana do callbacku .then() zachowuje tożsamość hosta, co pozwala piaskownicy na bezpośrednią interakcję z obiektem hosta, w tym sprawdzanie tożsamości za pomocą WeakMap i modyfikację stanu obiektu hosta.
- CVE-2026-43998Wysokie
W vm2 3.10.5, ograniczenie ścieżki require.root w NodeVM może zostać ominięte za pomocą dowiązań symbolicznych systemu plików, co pozwala kodowi w piaskownicy na ładowanie modułów spoza dozwolonego katalogu głównego w kontekście hosta. Ponieważ walidacja ścieżki używa path.resolve() (która nie rozwiązuje dowiązań symbolicznych), a ładowanie modułów używa natywnego require() Node.js (który je rozwiązuje), atakujący może załadować dowolne moduły hosta i uzyskać zdalne wykonanie kodu.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

