Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск
CVE-2026-22709, произвольный код на хосте и миллионы уязвимых установок. Почему баг в vm2 — это катастрофа для Node.js экосистемы
Все версии vm2 ниже 3.10.2 уязвимы к атаке.
В библиотеке vm2, которую часто используют как JavaScript-песочницу для запуска недоверенного кода в Node.js, нашли критическую уязвимость побега из sandbox. Проблема получила идентификатор CVE-2026-22709 и оценку 9.8 по CVSS, а успешная эксплуатация позволяет выполнить произвольный код уже на хост-системе, то есть фактически превращает песочницу в «открытую дверь».
Суть бага связана с обработкой Promise: в vm2 есть механизм «очистки» колбэков для Promise.prototype.then и Promise.prototype.catch, но он применялся не везде. В lib/setup-sandbox.js санитизация затрагивала localPromise.prototype.then, однако для globalPromise.prototype.then ее можно было обойти. Так как async-функции возвращают именно globalPromise, атакующий получал путь к выходу из изоляции и исполнению команд на машине, где запущен vm2.
По данным GitHub Security Advisory, уязвимы версии vm2 до 3.10.2 включительно по линии 3.10.0, а исправление выпущено в 3.10.2. При этом в сторонних заметках встречается более широкий диапазон «затронутых» версий, поэтому безопасная практическая граница простая: все релизы ниже 3.10.2 стоит считать рискованными и обновлять.
Рекомендация для команд, у которых vm2 стоит напрямую или как транзитивная зависимость: обновиться минимум до 3.10.2 (а лучше до 3.10.3, где добавили дополнительные фиксы, связанные с обходами через символы и Promise), затем перепроверить дерево зависимостей (например, через npm list vm2) и пересмотреть места, где вообще требуется исполнение чужого JavaScript в одном процессе. Некоторые аналитики отдельно напоминают, что даже после патча стоит оценить альтернативы вроде более жесткой изоляции на уровне процесса или контейнера, если модель угроз это предполагает.
В библиотеке vm2, которую часто используют как JavaScript-песочницу для запуска недоверенного кода в Node.js, нашли критическую уязвимость побега из sandbox. Проблема получила идентификатор CVE-2026-22709 и оценку 9.8 по CVSS, а успешная эксплуатация позволяет выполнить произвольный код уже на хост-системе, то есть фактически превращает песочницу в «открытую дверь».
Суть бага связана с обработкой Promise: в vm2 есть механизм «очистки» колбэков для Promise.prototype.then и Promise.prototype.catch, но он применялся не везде. В lib/setup-sandbox.js санитизация затрагивала localPromise.prototype.then, однако для globalPromise.prototype.then ее можно было обойти. Так как async-функции возвращают именно globalPromise, атакующий получал путь к выходу из изоляции и исполнению команд на машине, где запущен vm2.
По данным GitHub Security Advisory, уязвимы версии vm2 до 3.10.2 включительно по линии 3.10.0, а исправление выпущено в 3.10.2. При этом в сторонних заметках встречается более широкий диапазон «затронутых» версий, поэтому безопасная практическая граница простая: все релизы ниже 3.10.2 стоит считать рискованными и обновлять.
Рекомендация для команд, у которых vm2 стоит напрямую или как транзитивная зависимость: обновиться минимум до 3.10.2 (а лучше до 3.10.3, где добавили дополнительные фиксы, связанные с обходами через символы и Promise), затем перепроверить дерево зависимостей (например, через npm list vm2) и пересмотреть места, где вообще требуется исполнение чужого JavaScript в одном процессе. Некоторые аналитики отдельно напоминают, что даже после патча стоит оценить альтернативы вроде более жесткой изоляции на уровне процесса или контейнера, если модель угроз это предполагает.
В библиотеке vm2, которую часто используют как JavaScript-песочницу для запуска недоверенного кода в Node.js, нашли критическую уязвимость побега из sandbox. Проблема получила идентификатор CVE-2026-22709 и оценку 9.8 по CVSS, а успешная эксплуатация позволяет выполнить произвольный код уже на хост-системе, то есть фактически превращает песочницу в «открытую дверь».
Суть бага связана с обработкой Promise: в vm2 есть механизм «очистки» колбэков для Promise.prototype.then и Promise.prototype.catch, но он применялся не везде. В lib/setup-sandbox.js санитизация затрагивала localPromise.prototype.then, однако для globalPromise.prototype.then ее можно было обойти. Так как async-функции возвращают именно globalPromise, атакующий получал путь к выходу из изоляции и исполнению команд на машине, где запущен vm2.
По данным GitHub Security Advisory, уязвимы версии vm2 до 3.10.2 включительно по линии 3.10.0, а исправление выпущено в 3.10.2. При этом в сторонних заметках встречается более широкий диапазон «затронутых» версий, поэтому безопасная практическая граница простая: все релизы ниже 3.10.2 стоит считать рискованными и обновлять.
Рекомендация для команд, у которых vm2 стоит напрямую или как транзитивная зависимость: обновиться минимум до 3.10.2 (а лучше до 3.10.3, где добавили дополнительные фиксы, связанные с обходами через символы и Promise), затем перепроверить дерево зависимостей (например, через npm list vm2) и пересмотреть места, где вообще требуется исполнение чужого JavaScript в одном процессе. Некоторые аналитики отдельно напоминают, что даже после патча стоит оценить альтернативы вроде более жесткой изоляции на уровне процесса или контейнера, если модель угроз это предполагает.