<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Уязвимость CVE-2026-22709 в vm2: побег из Node.js sandbox и защита приложений]]></title><description><![CDATA[<p dir="auto">Уязвимость CVE-2026-22709 в библиотеке vm2 позволяет вырваться из песочницы Node.js и запустить произвольный код на хосте. Это критическая проблема для всех, кто использует vm2 для изоляции ненадежного кода. В статье разберем, как она работает, и как защитить свои приложения.</p>
<p dir="auto">Если вы разрабатываете серверы или плагины, где пользователи загружают скрипты, такая дыра может привести к компрометации сервера. Мы пройдемся по технике атаки, затронутым версиям и шагам по фиксу. Это поможет избежать потерь и быстро обновить код.</p>
<h2>Что такое vm2 и почему она популярна</h2>
<p dir="auto">vm2 - это библиотека для Node.js, которая создает песочницу для выполнения ненадежного JavaScript-кода. Она перехватывает доступ к глобальным объектам, модулям и прототипам, чтобы код не мог выбраться наружу. Миллионы проектов используют ее для плагинов, онлайн-редакторов или серверлесс-вычислений.</p>
<p dir="auto">Проблема в том, что vm2 уже не раз подводила: были CVE-2022-36067, CVE-2023-29017 и другие. Новая уязвимость CVE-2026-22709 с CVSS 9.8 - это побег через Promise. Атакующий обходит санитизацию колбэков в Promise.prototype.then и .catch, используя несанитизированный globalPromise от асинхронных функций.</p>
<p dir="auto">Это приводит к RCE - remote code execution на хосте. Представьте: пользовательский скрипт крадет данные или запускает reverse shell. Разработчики vm2 исправили в 3.10.1 частично, а в 3.10.2 - полностью, но риски остаются.</p>
<p dir="auto">Вот ключевые аспекты уязвимости:</p>
<ul>
<li><strong>Байпас санитизации</strong>: Колбэк localPromise проверяется, но globalPromise - нет.</li>
<li><strong>Proxy-ловушка</strong>: Атакующий создает вредоносный Proxy, перехватывающий Function.prototype.call.</li>
<li><strong>Асинхронный триггер</strong>: Promise.reject с payload вызывает утечку через V8-логику.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Версия vm2</th>
<th>Статус</th>
<th>Рекомендация</th>
</tr>
</thead>
<tbody>
<tr>
<td>&lt;=3.10.0</td>
<td>Уязвима</td>
<td>Обновить срочно</td>
</tr>
<tr>
<td>3.10.1</td>
<td>Частично фикс</td>
<td>Обновить до 3.10.2+</td>
</tr>
<tr>
<td>3.10.2+</td>
<td>Защищена</td>
<td>Мониторить обновления</td>
</tr>
</tbody>
</table>
<h2>Как работает эксплойт CVE-2026-22709</h2>
<p dir="auto">Эксплойт строится на архитектуре vm2: она оборачивает объекты в Proxy для изоляции. Но в версии 3.10.0 есть щель в lib/setup-sandbox.js. Асинхронная функция возвращает globalPromise, чьи .then/.catch не санитизированы полностью. Атакующий переопределяет call() и выходит за пределы.</p>
<p dir="auto">Пример: вредоносный код создает async-функцию, кидает Promise.reject с Proxy. Это активирует стек-трейс V8, где хост-объекты сливаются. Дальше - доступ к Function.constructor и process.mainModule.require(‘child_process’). В реальных атаках это exfiltrate файлов или запуск команд.</p>
<p dir="auto">Тестировщики показывают payload: он крадет /etc/shadow или выводит uid=root. vm2 maintainer Patrik Simek подтвердил: это тривиально эксплуатировать. Прошлые CVE тоже шли через Promise или Proxy, так что библиотека системно уязвима.</p>
<p dir="auto">Шаги эксплойта в упрощенном виде:</p>
<ol>
<li>Создать malicious Proxy внутри sandbox.</li>
<li>Вызвать async error с Promise.reject(proxy).</li>
<li>Перехватить call() для доступа к хост-Function.</li>
<li>Выполнить x(‘return process.mainModule.require(“child_process”).execSync(“id”)’)().</li>
</ol>
<p dir="auto"><em>Нюанс: в Node.js 24+ V8 усиливает утечки через async stack.</em></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Предыдущие CVE в vm2</th>
<th>Тип</th>
<th>Фикс</th>
</tr>
</thead>
<tbody>
<tr>
<td>CVE-2022-36067</td>
<td>Sandbox escape</td>
<td>3.9.10+</td>
</tr>
<tr>
<td>CVE-2023-29017</td>
<td>Promise bypass</td>
<td>3.9.15+</td>
</tr>
<tr>
<td>CVE-2023-30547</td>
<td>Proxy leak</td>
<td>3.9.16+</td>
</tr>
</tbody>
</table>
<h2>Способы защиты от побега из sandbox</h2>
<p dir="auto">Защита начинается с обновления: перейдите на vm2 3.10.3 или новее. Это закроет CVE-2026-22709 и свежие фиксы. Но vm2 хрупкая - лучше комбинировать с другими мерами. Используйте Docker-контейнеры или isolated-vm для настоящей изоляции.</p>
<p dir="auto">Если обновление невозможно, добавьте белый список доступных API. Мониторьте зависимости через npm audit или Snyk. В продакшене запускайте sandbox в отдельных процессах с ограниченными правами - это минимизирует ущерб от RCE.</p>
<p dir="auto">Эффективные стратегии:</p>
<ul>
<li><strong>Обновить vm2</strong>: npm i vm2@latest - сразу и просто.</li>
<li><strong>Альтернативы</strong>: isolated-vm (быстрее, безопаснее) или ses (для браузера).</li>
<li><strong>Дополнительная изоляция</strong>: Docker, Firecracker или AWS Lambda.</li>
<li><strong>Аудит кода</strong>: Сканируйте на Promise-обходы вручную.</li>
</ul>
<p dir="auto"><strong>Важно</strong>: даже фикс 3.10.2 не железобетонный - maintainer предупреждает о будущих байпасах.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Решение</th>
<th>Плюсы</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td>vm2 3.10.3</td>
<td>Легко мигрировать</td>
<td>История уязвимостей</td>
</tr>
<tr>
<td>isolated-vm</td>
<td>Лучшая изоляция</td>
<td>Требует Node 14+</td>
</tr>
<tr>
<td>Docker</td>
<td>Полная виртуализация</td>
<td>Оверхед ресурсов</td>
</tr>
</tbody>
</table>
<h2>Когда sandbox не спасет - реальные риски</h2>
<p dir="auto">CVE-2026-22709 напоминает: ни одна песочница не вечна. vm2 ломалась 7+ раз за годы, и это не конец. Подумайте о сценариях, где ненадежный код - норма: онлайн-IDE, чат-боты с eval или плагины.</p>
<p dir="auto">Риски выходят за RCE: утечка ключей, DDoS или цепная атака. Тестируйте на pentest-инструментах вроде node-security. Если проект критический, мигрируйте на альтернативы заранее - это сэкономит нервы позже.</p>
]]></description><link>https://forum.exlends.ru/topic/1178/uyazvimost-cve-2026-22709-v-vm2-pobeg-iz-node.js-sandbox-i-zashita-prilozhenij</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:59:41 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1178.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2026 17:13:16 GMT</pubDate><ttl>60</ttl></channel></rss>