Уязвимость CVE-2026-22709 в vm2: побег из Node.js sandbox и защита приложений
-
Уязвимость CVE-2026-22709 в библиотеке vm2 позволяет вырваться из песочницы Node.js и запустить произвольный код на хосте. Это критическая проблема для всех, кто использует vm2 для изоляции ненадежного кода. В статье разберем, как она работает, и как защитить свои приложения.
Если вы разрабатываете серверы или плагины, где пользователи загружают скрипты, такая дыра может привести к компрометации сервера. Мы пройдемся по технике атаки, затронутым версиям и шагам по фиксу. Это поможет избежать потерь и быстро обновить код.
Что такое vm2 и почему она популярна
vm2 - это библиотека для Node.js, которая создает песочницу для выполнения ненадежного JavaScript-кода. Она перехватывает доступ к глобальным объектам, модулям и прототипам, чтобы код не мог выбраться наружу. Миллионы проектов используют ее для плагинов, онлайн-редакторов или серверлесс-вычислений.
Проблема в том, что vm2 уже не раз подводила: были CVE-2022-36067, CVE-2023-29017 и другие. Новая уязвимость CVE-2026-22709 с CVSS 9.8 - это побег через Promise. Атакующий обходит санитизацию колбэков в Promise.prototype.then и .catch, используя несанитизированный globalPromise от асинхронных функций.
Это приводит к RCE - remote code execution на хосте. Представьте: пользовательский скрипт крадет данные или запускает reverse shell. Разработчики vm2 исправили в 3.10.1 частично, а в 3.10.2 - полностью, но риски остаются.
Вот ключевые аспекты уязвимости:
- Байпас санитизации: Колбэк localPromise проверяется, но globalPromise - нет.
- Proxy-ловушка: Атакующий создает вредоносный Proxy, перехватывающий Function.prototype.call.
- Асинхронный триггер: Promise.reject с payload вызывает утечку через V8-логику.
Версия vm2 Статус Рекомендация <=3.10.0 Уязвима Обновить срочно 3.10.1 Частично фикс Обновить до 3.10.2+ 3.10.2+ Защищена Мониторить обновления Как работает эксплойт CVE-2026-22709
Эксплойт строится на архитектуре vm2: она оборачивает объекты в Proxy для изоляции. Но в версии 3.10.0 есть щель в lib/setup-sandbox.js. Асинхронная функция возвращает globalPromise, чьи .then/.catch не санитизированы полностью. Атакующий переопределяет call() и выходит за пределы.
Пример: вредоносный код создает async-функцию, кидает Promise.reject с Proxy. Это активирует стек-трейс V8, где хост-объекты сливаются. Дальше - доступ к Function.constructor и process.mainModule.require(‘child_process’). В реальных атаках это exfiltrate файлов или запуск команд.
Тестировщики показывают payload: он крадет /etc/shadow или выводит uid=root. vm2 maintainer Patrik Simek подтвердил: это тривиально эксплуатировать. Прошлые CVE тоже шли через Promise или Proxy, так что библиотека системно уязвима.
Шаги эксплойта в упрощенном виде:
- Создать malicious Proxy внутри sandbox.
- Вызвать async error с Promise.reject(proxy).
- Перехватить call() для доступа к хост-Function.
- Выполнить x(‘return process.mainModule.require(“child_process”).execSync(“id”)’)().
Нюанс: в Node.js 24+ V8 усиливает утечки через async stack.
Предыдущие CVE в vm2 Тип Фикс CVE-2022-36067 Sandbox escape 3.9.10+ CVE-2023-29017 Promise bypass 3.9.15+ CVE-2023-30547 Proxy leak 3.9.16+ Способы защиты от побега из sandbox
Защита начинается с обновления: перейдите на vm2 3.10.3 или новее. Это закроет CVE-2026-22709 и свежие фиксы. Но vm2 хрупкая - лучше комбинировать с другими мерами. Используйте Docker-контейнеры или isolated-vm для настоящей изоляции.
Если обновление невозможно, добавьте белый список доступных API. Мониторьте зависимости через npm audit или Snyk. В продакшене запускайте sandbox в отдельных процессах с ограниченными правами - это минимизирует ущерб от RCE.
Эффективные стратегии:
- Обновить vm2: npm i vm2@latest - сразу и просто.
- Альтернативы: isolated-vm (быстрее, безопаснее) или ses (для браузера).
- Дополнительная изоляция: Docker, Firecracker или AWS Lambda.
- Аудит кода: Сканируйте на Promise-обходы вручную.
Важно: даже фикс 3.10.2 не железобетонный - maintainer предупреждает о будущих байпасах.
Решение Плюсы Минусы vm2 3.10.3 Легко мигрировать История уязвимостей isolated-vm Лучшая изоляция Требует Node 14+ Docker Полная виртуализация Оверхед ресурсов Когда sandbox не спасет - реальные риски
CVE-2026-22709 напоминает: ни одна песочница не вечна. vm2 ломалась 7+ раз за годы, и это не конец. Подумайте о сценариях, где ненадежный код - норма: онлайн-IDE, чат-боты с eval или плагины.
Риски выходят за RCE: утечка ключей, DDoS или цепная атака. Тестируйте на pentest-инструментах вроде node-security. Если проект критический, мигрируйте на альтернативы заранее - это сэкономит нервы позже.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.