Критическая уязвимость CVE-2026-22709 в vm2: sandbox побег и риски Node.js
-
В vm2 обнаружена критическая уязвимость CVE-2026-22709, которая позволяет обходить sandbox и выполнять произвольный код. Это затрагивает версии до 3.10.1 и создает серьезные риски для приложений Node.js, где запускается ненадежный код.
Понимание этой проблемы поможет разработчикам timely обновить зависимости и защитить серверы от атак. Мы разберем механизм уязвимости, примеры эксплуатации и пути минимизации рисков. Это позволит избежать компрометации систем в экосистеме Node.js.
Что такое vm2 и почему sandbox важен
vm2 - популярная библиотека для Node.js, которая создает изолированную среду для выполнения ненадежного JavaScript-кода. Она перехватывает доступ к глобальным объектам, проксируя их, чтобы предотвратить утечку данных или выполнение вредоносных действий на хосте. Без такой песочницы плагины, пользовательский код или скрипты могли бы напрямую взаимодействовать с файловой системой, процессами или сетью сервера.
Уязвимость CVE-2026-22709 (CVSS 9.8-10.0) выявлена в версии 3.10.0 и позволяет полностью обходить эти ограничения. Атакующий внутри sandbox может перехватить вызовы Promise и получить доступ к конструктору Error хоста, что приводит к выполнению любого кода вне изоляции. Это не первая такая проблема - vm2 уже страдала от похожих escape’ов, как CVE-2021-23555 или CVE-2023-37466, но эта особенно опасна из-за простоты эксплуатации.
Проблема кроется в неполной санитизации колбэков Promise.prototype.then и Promise.prototype.catch. Async-функции возвращают globalPromise, чьи обработчики не проходят полную проверку, в отличие от localPromise. Это открывает дверь для инъекции через переопределение Function.prototype.call.
Вот ключевые шаги эксплуатации:
- Создать async-функцию, возвращающую globalPromise с ошибкой.
- Прикрепить .catch() и перехватить вызов через прототип Function.
- Обойти ensureThis() для доступа к несанитизированному Error.
- Выполнить код, например, запуск child_process.execSync.
Механизм уязвимости в деталях
В lib/setup-sandbox.js санитизируется localPromise.prototype.then, но globalPromise остается уязвимым. Атакующий создает ошибку с Symbol() в name, генерирует async-функцию и ловит ошибку в .catch(). Перехват call позволяет пропустить проверки и добраться до Function конструктора хоста.
Это приводит к RCE - arbitrary code execution. Пример PoC показывает, как echo ‘HELLO WORLD’ выполняется вне sandbox через child_process. CVSS вектор AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H подчеркивает сетевую доступность без аутентификации и полное нарушение конфиденциальности, целостности и доступности.
Уязвимость опубликована 26 января 2026 в GitHub Security Advisory. Фикс в коммите 4b009c2d4b1131c01810c1205e641d614c322a29 вышел в 3.10.2, но рекомендуется 3.10.3 для дополнительных патчей.
Основные векторы атаки:
- Запуск пользовательского кода в sandbox (run() метод).
- Нюанс: требуется доступ к sandbox, но это типично для eval-подобных сценариев.
- Переопределение прототипов для байпаса санитизации.
- Доступ к process.mainModule для системных вызовов.
Версия vm2 Статус CVSS Фикс ≤3.10.1 Уязвима 9.8-10 - 3.10.2 Исправлена - Коммит 4b009c2 3.10.3 Рекомендуется - Доп. патчи Риски для Node.js экосистемы
vm2 используется в тысячах проектов для безопасного eval, плагинов или серверлесс-выполнения. Уязвимость угрожает backend-серверам, где sandbox защищает от инъекций в динамическом контенте. Атака не требует привилегий - достаточно отправить вредоносный скрипт.
В экосистеме Node.js это усиливает цепочку атак: от клиентского кода к серверному RCE. Прошлые уязвимости vm2 показывают паттерн - разработчики полагались на библиотеку, но повторные escape’ы подрывают доверие. Затронуты npm-пакеты, GitLab CI, облачные платформы с Node.js.
Масштаб велик: EPSS 0.00059 указывает на низкую вероятность, но критичность делает ее приоритетной. Организации с dependency scanning (GitLab, Endor Labs) уже фиксируют ее.
Последствия эксплуатации:
- Полный контроль над сервером.
- Особенность: утечка ключей, данных через Error.stack.
- Масштабные компрометации в цепочках поставок.
- Необходимость аудита всех sandbox-использований.
Как защититься и альтернативы
Обновление до 3.10.3 - основной шаг. Проверьте package.json на vm2 ≤3.10.1 с npm audit или Snyk. Если sandbox критичен, рассмотрите миграцию на альтернативы вроде isolated-vm или ses (Secure EcmaScript).
Изолируйте vm2 в контейнере или используйте worker_threads с ограничениями. Регулярный dependency scanning предотвратит будущие инциденты. Тестируйте свой код на PoC - убедитесь, что escape невозможен.
Альтернатива Преимущества Недостатки isolated-vm V8 изоляция Сложнее настройка ses Стандартный JS Меньше фич worker_threads Встроенный Не полный sandbox Уязвимости на подходе
CVE-2026-22709 напоминает о хрупкости sandbox в JS. Фиксы помогают, но история vm2 полна дыр - от 2021 до 2026. Разработчики Node.js должны пересмотреть подходы к изоляции, особенно с ростом AI-генерируемого кода.
Остается открытым вопрос надежности популярных библиотек. Следите за обновлениями в NVD и GitHub Advisories - новые паттерны escape могут появиться в похожих инструментах.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.