
Критическая уязвимость CVE-2026-22709 в библиотеке vm2 позволяет злоумышленникам обходить песочницу и выполнять произвольный код на хост-системе. Это затрагивает тысячи Node.js-проектов, где vm2 используется для изоляции ненадежного кода.
Понимание проблемы поможет быстро проверить свои приложения, обновить зависимости и избежать компрометации сервера. Мы разберем детали, эксплуатацию и пути исправления, чтобы вы могли защитить систему без лишних усилий.
Что такое vm2 и почему она популярна
Библиотека vm2 - это инструмент для Node.js, который создает изолированную среду для запуска ненадежного JavaScript-кода. Разработчики используют ее в плагинах, шаблонизаторах и системах анализа безопасности, чтобы код от пользователей не мог повредить основную систему. Sandbox в vm2 должна блокировать доступ к файловой системе, сетевым ресурсам и другим привилегиям хоста.
Однако в версиях до 3.10.2 обнаружен баг, который делает изоляцию бесполезной. Уязвимость получила оценку 9.8 по CVSS - максимум для критических угроз. Она эксплуатируется удаленно без аутентификации, что делает ее опасной для серверов с пользовательским вводом. На npm более 273 тысяч проектов зависят от уязвимых версий, включая популярные фреймворки.
Вот ключевые аспекты механизма vm2:
- Локальные Promise: Санитизируются в setup-sandbox.js для then и catch.
- Глобальные Promise: Не обрабатываются, что открывает лазейку через async-функции.
- Последствия: Доступ к Function.prototype и child_process для системных команд.
| Аспект | Описание | Риск |
|---|---|---|
| Sandbox цель | Изоляция JS-кода | Полный обход |
| Эксплуатация | Async + globalPromise | Удаленная, без привилегий |
| Затронутые | vm2 ≤ 3.10.1 | 273k+ проектов |
Как работает уязвимость CVE-2026-22709
Проблема кроется в неполной санитизации колбэков Promise. Vm2 очищает localPromise.prototype.then и catch, но пропускает globalPromise - те, что возвращают async-функции. Злоумышленник вставляет вредоносный код в песочницу, который использует эту разницу для выхода за пределы.
Далее идет цепочка: перехват Function.prototype.call, доступ к прототипу Error, манипуляция с ним и запуск кода на хосте. Это напоминает старую уязвимость CVE-2021-23555, но с новым вектором через Promise. Разработчики vm2 выпустили фикс в 3.10.2, усилив защиту, а в 3.10.3 добавили дополнительные меры.
Этапы эксплуатации:
- Вставка async-функции в sandbox-код.
- Обход санитизации через globalPromise.then.
- Получение доступа к хост-объектам и выполнение child_process.exec.
Важный нюанс: Уязвимость тривиальна - не нужны права или взаимодействие с пользователем. Таблица ниже показывает вектор атаки.
| Шаг | Техника | Результат |
|---|---|---|
| 1 | Async return globalPromise | Обход local санитизации |
| 2 | Then/catch callback | Доступ к прототипу |
| 3 | Error constructor | RCE на хосте |
| 4 | Child_process | Системные команды |
Затронутые версии и статистика
Все версии vm2 ниже 3.10.2 уязвимы, включая 3.10.0 и 3.10.1, где фикс был частичным. GitHub Security Advisory подтверждает: обновление до 3.10.2 обязательно. Более широкие оценки говорят о риске для всех релизов до этой версии, даже если некоторые источники указывают ≤3.10.0.
На практике это значит проверку package.json в проектах. Библиотека входит в цепочки зависимостей многих инструментов: от серверов до браузерных песочниц. Разработчик опубликовал PoC-код, демонстрирующий выполнение команд вроде ‘ls’ или ‘whoami’ прямо из sandbox.
Ключевые факты:
- CVSS вектор: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.
- Дата раскрытия: Январь 2026, фикс в коммите 4b009c2.
- Рекомендация: Обновить до 3.10.3 для полной защиты.
| Версия | Статус | Действие |
|---|---|---|
| ≤3.10.1 | Уязвима | Немедленно обновить |
| 3.10.2 | Фикс | Минимально безопасна |
| 3.10.3+ | Полная защита | Использовать |
Меры защиты и миграция
Сначала обновите vm2 через npm update vm2@latest. Просканируйте зависимости инструментами вроде npm audit или Snyk. Если проект критический, временно отключите обработку пользовательского JS или добавьте дополнительный слой изоляции, например, Docker-контейнеры.
Дальше протестируйте на PoC: запустите демо-код в вашей среде, чтобы убедиться в отсутствии уязвимости. Для новых проектов рассмотрите альтернативы вроде isolated-vm или ses - они тоже для sandbox в Node.js, но с другими плюсами.
Шаги по защите:
- Аудит: npm ls vm2.
- Обновление: npm i vm2@3.10.3.
- Мониторинг: Настройте alerts на GitHub Advisories.
- Альтернативы: Переход на isolated-vm для строгой изоляции.
Не забывайте: Регулярные обновления - ключ к безопасности в экосистеме Node.js.
Глубже в экосистему Node.js
Эта уязвимость подчеркивает риски популярных библиотек: vm2 казалась надежной, но баг в Promise сломал все. Остается открытым вопрос, сколько цепных атак уже произошло незаметно. Стоит присмотреться к другим sandbox-решениям и усилить валидацию ввода.
В будущем фокус на полную санитизацию глобальных объектов поможет избежать подобных дыр. Если вы разрабатываете серверы, подумайте о комбинации vm2 с другими инструментами для многоуровневой защиты.

















суперинтеллект может переосмыслить ‘вред’ в своих целях.

