Устранена критическая уязвимость в vm2 — широко используемой библиотеке для среды выполнения Node.js JavaScript, которая позволяет выполнять недоверенный код внутри изолированной среды (песочницы) в том же процессе, что и доверенный код приложения. Эта недоработка позволяет осуществить «побег из песочницы» (sandbox escape), что является максимально серьёзной проблемой для компонента, чья основная задача — обеспечить границу безопасности между доверенным и недоверенным кодом.
Библиотека vm2, которая указана как зависимость почти в 900 других пакетах в NPM и многих проектах на GitHub, не новичок в уязвимостях типа «побег из песочницы». Фактически, в июле 2023 года её создатель решил прекратить поддержку проекта и вывести его из эксплуатации после обнаружения одной из таких уязвимостей.
Несмотря на то что проект остался без поддержки, в отсутствие хороших альтернатив пользователи продолжали его использовать, что приводило к миллионам загрузок ежемесячно. В октябре 2025 года первоначальный мейнтейнер принял решение возродить проект после исправления всех прошлых уязвимостей и анонсировал планы по его переписыванию на TypeScript.
Новая уязвимость, исправленная на этой неделе, отслеживается под кодом CVE-2026-22709 и затрагивает версии старше 3.10.2. Пользователям настоятельно рекомендуется как можно скорее обновиться до последней версии.
«В vm2 версии 3.10.0 можно обойти санитайзинг колбэков для Promise.prototype.then и Promise.prototype.catch», — говорится в официальном уведомлении. «Это позволяет злоумышленникам сбежать из песочницы и выполнить произвольный код».
Изоляция кода — игра в кошки-мышки
Песочницы, подобные vm2, необходимы веб-приложениям и другим приложениям на Node, функциональность которых позволяет пользователям или инструментам загружать и выполнять скрипты. Поскольку код, контролируемый пользователем, по своей природе недоверенный, его нельзя запускать в том же контексте, что и само приложение. Однако хостовое приложение должно отслеживать и видеть, что делает этот код.
Библиотека vm2 достигает этого с помощью сложной сети прокси-серверов, которые перехватывают и опосредуют взаимодействия между песочницей и хостовой средой. Но сложность JavaScript такова, что, вероятно, всегда найдется способ обмануть эту цепочку прокси.
Проект честно заявляет об этом в своем описании: «Объекты могут быть доступны через цепочки прототипов, конструкторы могут быть достигнуты через объекты ошибок, символы предоставляют хуки протокола, а асинхронное выполнение создает временные окна. Огромное количество способов перемещения от одного объекта к другому в JavaScript делает создание герметичной внутрипроцессной песочницы чрезвычайно сложной задачей».
Мейнтейнер прямо предупреждает, что в будущем, вероятно, будут обнаружены новые способы обхода, и хотя они будут исправлены, игра в кошки-мышки продолжится. В своем объявлении о возрождении проекта в октябре он выразил надежду, что выявление уязвимостей с помощью ИИ поможет обнаруживать больше подобных проблем в будущем.
Существуют и другие альтернативы для изоляции кода, которые предоставляют более строгие гарантии безопасности, такие как полная изоляция процессов (full process sandboxing), виртуальные машины, контейнеры и многое другое. Но они сопряжены с большими накладными расходами на производительность или добавляют иные сложности и препятствия. Не говоря уже о том, что эти подходы также не лишены уязвимостей.
Мейнтейнер советует использовать vm2 только в следующих случаях:
- Если вам нужна тесная интеграция с хостовыми объектами и быстрая синхронная связь
- Если недоверенный код поступает из относительно доверенного источника (например, внутренние инструменты, системы плагинов с проверенными авторами)
- Если вы комбинируете vm2 с другими уровнями безопасности (сетевая изоляция, ограничения файловой системы, лимиты ресурсов)
- Если вы принимаете риск и активно отслеживаете обновления безопасности
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Lucian Constantin




