Podatność w bibliotece vm2 (Node.js) pozwala na ucieczkę z sandboxa i wykonanie dowolnego kodu w procesie hosta, gdy uruchamiany jest niezaufany kod z obsługą async na środowiskach udostępniających WebAssembly JSPI. Luka otrzymała krytyczny wynik CVSS 9.8, co czyni ją ekstremalnie niebezpieczną dla aplikacji korzystających z vm2 do izolacji niezaufanego kodu.
▸ Pokaż oryginał (EN)
vm2 is an open source vm/sandbox for Node.js. Prior to version 3.11.4, a sandbox escape vulnerability in vm2 allows arbitrary code execution in the host process when untrusted code is executed with async support on runtimes exposing WebAssembly JSPI (WebAssembly.promising / WebAssembly.Suspending). In the tested configuration, a JSPI-backed Promise can reach Promise.prototype.finally() in a way that bypasses the expected Promise-species hardening and exposes a host-originated rejection object to attacker-controlled species logic, breaking the sandbox boundary. This issue has been patched in version 3.11.4.
Błąd polega na tym, że Promise oparty na mechanizmie WebAssembly JSPI (WebAssembly.promising / WebAssembly.Suspending) może dotrzeć do metody Promise.prototype.finally() w sposób omijający oczekowane zabezpieczenie Promise-species hardening. W efekcie obiekt odrzucenia (rejection object) pochodzący z hosta zostaje ujawniony kontrolowanej przez atakującego logice species, co prowadzi do przełamania granicy sandboxa. Atakujący dostarczający niezaufany kod do wykonania w vm2 może w ten sposób uzyskać pełny dostęp do procesu hosta.
Atakujący może wykonać dowolny kod (RCE) poza sandboxem — bezpośrednio w procesie hosta Node.js, co może prowadzić do pełnego przejęcia kontroli nad serwerem, wycieku danych oraz naruszenia integralności i dostępności systemu.
Należy zaktualizować vm2 do wersji 3.11.4 lub nowszej, w której podatność została załatana. Patch dostępny jest w repozytorium GitHub pod tagiem v3.11.4 (commit 6915fa4d9bcebd47b9a4f39a1adc1aa94ef6ffc6).
Biblioteka vm2 w wersjach wcześniejszych niż 3.11.4, uruchamiana na środowiskach Node.js eksponujących WebAssembly JSPI.
Podatność dotyczy wyłącznie środowisk, w których dostępne jest WebAssembly JSPI (eksperymentalna funkcja). Jeśli środowisko uruchomieniowe nie eksponuje WebAssembly.promising / WebAssembly.Suspending, wektor ataku jest niedostępny.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H