Две уязвимости в библиотеке vm2 для среды Node.js позволяют удалённо выполнить произвольный код. Проблемы связаны с компонентом require.external и обработчиком событий EventEmitter.prototype.emit. Производитель подтвердил обе, а базовые оценки по CVSS 3.1 и CVSS 4.0 достигают 10 из 10. Эксплойт уже опубликован в открытом доступе.
Детали уязвимостей
vm2 - это библиотека, которая создаёт песочницу (изолированную среду) для запуска чужого кода на сервере. Она распространяется через пакетный менеджер NPM. По замыслу программа внутри песочницы не должна получать доступ к файлам, сети и памяти процесса, который её запустил. Однако контроль за динамически управляемыми ресурсами в двух местах оказался недостаточным. Разработчики отнесли ошибки к типу CWE-913, то есть к слабому контролю ресурсов кода с динамическим управлением. Такой класс ошибок возникает, когда программа сама решает, какой объект или ссылку передать дальше, и не проверяет, остаётся ли этот объект в разрешённых границах. Проще говоря, библиотека проверяет не все структуры, которые получает исполняемый код. Поэтому ограничения обходятся, и чужая программа выходит за пределы песочницы, получая доступ к файловой системе и запуску процессов.
Для атаки злоумышленнику не нужны учётная запись, доступ к серверу или действия пользователя. Достаточно, чтобы приложение принимало код из внешнего источника и запускало его внутри vm2. Через один компонент атакующий обходит запрет на подключение внешних модулей. Через обработчик событий он получает управление в момент передачи системных уведомлений. Результат в обоих случаях одинаков: код исполняется с правами процесса. Значит, в распоряжении злоумышленника оказываются файлы, сетевые подключения и секреты, к которым имеет доступ приложение.
Подобные схемы типичны для платформ плагинов, сервисов проверки кода, инструментов сборки и обучающих сред, где нужно безопасно запускать программы сторонних авторов. При этом многие проекты получают vm2 не напрямую. Библиотека приходит как транзитивная зависимость, то есть попадает в сборку вместе с другим пакетом. Поэтому искать её следует не только по прямому указанию в конфигурации, но и по всему дереву зависимостей. Отдельная трудность в том, что обновить нужно и саму библиотеку, и родительский пакет, который её подтягивает. Владельцы сервиса при этом нередко не знают, что именно vm2 отвечает за изоляцию пользовательских программ.
Последствия успешной эксплуатации зависят от того, что делает сервис. Если он принимает и выполняет код клиентов, злоумышленник получает те же права, что и само приложение. На практике это означает доступ к базам данных, токенам и внутренней сети компании. Кроме того, захваченный узел можно использовать как точку входа для перемещения между другими системами инфраструктуры.
Обе уязвимости выявили 25 августа 2026 года, им присвоены идентификаторы CVE-2026-92946 и CVE-2026-92955. Записи внесены в Банк данных угроз безопасности информации под номерами BDU:2026-14937 и BDU:2026-14946. Максимальная оценка по всем версиям системы CVSS встречается нечасто. Она означает, что при успешной эксплуатации злоумышленник получает полный контроль над уязвимым компонентом, включая чтение и изменение данных и нарушение работы сервиса. Обе ошибки действуют удалённо и не требуют взаимодействия с пользователем: жертва не должна открывать файл или переходить по ссылке. Публичный эксплойт заметно упрощает подготовку атаки. Искать ошибку самостоятельно не нужно, поэтому промежуток между публикацией и первыми попытками использования обычно короткий.
Производитель закрыл обе проблемы, способ устранения - обновление программного обеспечения. Версии до 3.11.6 включительно уязвимы в части компонента require.external, версии до 3.11.7 включительно - в части обработчика событий. Значит, обновления до версии новее 3.11.7 достаточно, чтобы закрыть обе ветки. Рекомендации опубликованы в консультационных бюллетенях проекта. Если обновление невозможно, разумно отказаться от запуска недоверенного кода в том же процессе. Такой код лучше вынести в отдельную среду с ограниченными правами и без доступа к внутренней сети, а также проверить журналы на предмет обращений к внешним модулям.
Библиотеки, которые обещают безопасный запуск чужого кода, остаются обычными программами со своими ошибками. Чем больше сервисов строят на них изоляцию плагинов, тем выше цена одной неудачной проверки. Обновление занимает минуты, а разбор последствий выполнения чужого кода растягивается на недели. Приходится менять ключи и пароли, проверять целостность данных и искать следы закрепления в системе.
Ссылки
- https://bdu.fstec.ru/vul/2026-14937
- https://bdu.fstec.ru/vul/2026-14946
- https://www.cve.org/CVERecord?id=CVE-2026-92946
- https://www.cve.org/CVERecord?id=CVE-2026-92955
- https://github.com/patriksimek/vm2/security/advisories/GHSA-j3hm-6rg5-mchv
- https://github.com/patriksimek/vm2/security/advisories/GHSA-88hf-g992-jg85