В библиотеке vm2, предназначенной для запуска недоверенного JavaScript-кода в изолированной среде, обнаружены четыре уязвимости. Каждая из них позволяет выбраться из песочницы и выполнить на сервере произвольный код. Все четыре получили максимальную оценку 10 из 10 по трём версиям CVSS. Эксплойты уже опубликованы в открытом доступе. Под угрозой проекты на Node.js, которые прямо или косвенно подключают vm2.
Детали уязвимостей
Библиотека решает конкретную задачу. Она выполняет чужой скрипт так, чтобы тот не добрался до файловой системы, сетевых соединений и внутренних модулей Node.js. На такой схеме держатся плагинные платформы, сервисы автоматизации, конструкторы отчётов, средствa обработки пользовательских формул и онлайн-песочницы для обучения. Клиент присылает код, сервер его исполняет и возвращает результат. Пока изоляция держится, риски минимальны. Как только она ломается, чужой скрипт получает права процесса Node.js.
Две уязвимости связаны с неверным управлением генерацией кода, ещё две - с нарушением механизма защиты данных. По сути это два способа сделать одно и то же: обойти проверки, которые отделяют исполняемый код от остальной среды. Первый описан как внедрение кода, второй - как несанкционированный сбор информации. В обоих случаях итог одинаковый: удалённый злоумышленник выполняет произвольные команды. Одна из уязвимостей затрагивает версию 3.11.6, остальные три - все выпуски вплоть до 3.12.0 включительно.
Вектор атаки сетевой, сложность низкая. Учётная запись в системе не нужна, права администратора тоже. Не требуется и участие пользователя: достаточно, чтобы код злоумышленника попал на обработку в песочницу. Такое возможно, если сервис принимает скрипты, формулы, шаблоны или плагины от клиентов. Вектор меняется через сеть, поэтому атака не обязательно идёт из внешнего периметра. Достаточно точки, где недоверенный код принимается к исполнению.
Последствия зависят от того, какие права у процесса Node.js. В типовой конфигурации он читает файлы приложения, а значит, получает доступ к конфигурации, ключам и токенам. Через уже открытые соединения злоумышленник может обратиться к базе данных и забрать содержимое таблиц. Он способен изменить результаты работы сервиса, подменить данные в ответах или оставить в системе код для повторного запуска. На общих платформах, где один процесс обслуживает нескольких клиентов, из песочницы одного пользователя открывается путь к данным остальных.
Отдельная сложность в том, как распространяется библиотека. Она поставляется через пакетный менеджер NPM, и во многих проектах присутствует не как прямая зависимость, а как зависимость зависимости. Разработчики могут не знать, что vm2 вообще установлена. Поэтому проверку стоит начинать с дерева зависимостей: команда npm ls vm2 покажет, есть ли библиотека в проекте и кто её подтянул. Такой же аудит имеет смысл провести в сборочных образах и в коде, который разворачивается в контейнерах.
Уязвимости подтверждены производителем. Все четыре проблемы уже устранены, рекомендации опубликованы в репозитории проекта на GitHub. Нужно обновить библиотеку до версии, указанной в рекомендациях, и пересобрать зависимые образы. Если обновление невозможно, разумно ограничить круг источников, чей код попадает в песочницу, и урезать права процесса Node.js до минимально необходимых. Ограничение прав не закрывает уязвимость, но снижает ущерб от её использования.
Публичные эксплойты меняют картину. Раньше между раскрытием уязвимости и попытками её применить проходили недели, сейчас этот разрыв сокращается до дней. Для vm2 ситуация усложняется тем, что похожие проблемы в библиотеке находили и прежде. Причина в самой природе песочниц на JavaScript: язык динамический, объекты и контексты исполнения связаны между собой, и любая неаккуратная проверка открывает обходной путь.
Опора только на изоляцию внутри одного процесса остаётся рискованной. Надёжнее выносить исполнение чужого кода в отдельный процесс или контейнер с ограниченным доступом к файлам и сети. Тогда даже успешный обход песочницы не даёт злоумышленнику ничего сверх того, что разрешено изолированной среде.
Ссылки
- https://bdu.fstec.ru/vul/2026-14923
- https://bdu.fstec.ru/vul/2026-14924
- https://bdu.fstec.ru/vul/2026-14925
- https://bdu.fstec.ru/vul/2026-14926
- https://www.cve.org/CVERecord?id=CVE-2026-92937
- https://www.cve.org/CVERecord?id=CVE-2026-93605
- https://www.cve.org/CVERecord?id=CVE-2026-93606
- https://www.cve.org/CVERecord?id=CVE-2026-93603
- https://github.com/patriksimek/vm2/security/advisories/GHSA-647f-g98j-qq25
- https://github.com/patriksimek/vm2/security/advisories/GHSA-pq68-rvw4-xp4r
- https://github.com/patriksimek/vm2/security/advisories/GHSA-6454-5x88-m6jw
- https://github.com/patriksimek/vm2/security/advisories/GHSA-j89j-5m6r-cr2q