<?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: sandbox побег и риски Node.js]]></title><description><![CDATA[<p dir="auto">В vm2 обнаружена критическая уязвимость CVE-2026-22709, которая позволяет обходить sandbox и выполнять произвольный код. Это затрагивает версии до 3.10.1 и создает серьезные риски для приложений Node.js, где запускается ненадежный код.</p>
<p dir="auto">Понимание этой проблемы поможет разработчикам timely обновить зависимости и защитить серверы от атак. Мы разберем механизм уязвимости, примеры эксплуатации и пути минимизации рисков. Это позволит избежать компрометации систем в экосистеме Node.js.</p>
<h2>Что такое vm2 и почему sandbox важен</h2>
<p dir="auto">vm2 - популярная библиотека для Node.js, которая создает изолированную среду для выполнения ненадежного JavaScript-кода. Она перехватывает доступ к глобальным объектам, проксируя их, чтобы предотвратить утечку данных или выполнение вредоносных действий на хосте. Без такой песочницы плагины, пользовательский код или скрипты могли бы напрямую взаимодействовать с файловой системой, процессами или сетью сервера.</p>
<p dir="auto">Уязвимость CVE-2026-22709 (CVSS 9.8-10.0) выявлена в версии 3.10.0 и позволяет полностью обходить эти ограничения. Атакующий внутри sandbox может перехватить вызовы Promise и получить доступ к конструктору Error хоста, что приводит к выполнению любого кода вне изоляции. Это не первая такая проблема - vm2 уже страдала от похожих escape’ов, как CVE-2021-23555 или CVE-2023-37466, но эта особенно опасна из-за простоты эксплуатации.</p>
<p dir="auto">Проблема кроется в неполной санитизации колбэков Promise.prototype.then и Promise.prototype.catch. Async-функции возвращают globalPromise, чьи обработчики не проходят полную проверку, в отличие от localPromise. Это открывает дверь для инъекции через переопределение Function.prototype.call.</p>
<p dir="auto">Вот ключевые шаги эксплуатации:</p>
<ul>
<li>Создать async-функцию, возвращающую globalPromise с ошибкой.</li>
<li>Прикрепить .catch() и перехватить вызов через прототип Function.</li>
<li>Обойти ensureThis() для доступа к несанитизированному Error.</li>
<li>Выполнить код, например, запуск child_process.execSync.</li>
</ul>
<h2>Механизм уязвимости в деталях</h2>
<p dir="auto">В lib/setup-sandbox.js санитизируется localPromise.prototype.then, но globalPromise остается уязвимым. Атакующий создает ошибку с Symbol() в name, генерирует async-функцию и ловит ошибку в .catch(). Перехват call позволяет пропустить проверки и добраться до Function конструктора хоста.</p>
<p dir="auto">Это приводит к 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 подчеркивает сетевую доступность без аутентификации и полное нарушение конфиденциальности, целостности и доступности.</p>
<p dir="auto">Уязвимость опубликована 26 января 2026 в GitHub Security Advisory. Фикс в коммите 4b009c2d4b1131c01810c1205e641d614c322a29 вышел в 3.10.2, но рекомендуется 3.10.3 для дополнительных патчей.</p>
<p dir="auto"><strong>Основные векторы атаки:</strong></p>
<ul>
<li>Запуск пользовательского кода в sandbox (run() метод).</li>
<li><em>Нюанс: требуется доступ к sandbox, но это типично для eval-подобных сценариев.</em></li>
<li>Переопределение прототипов для байпаса санитизации.</li>
<li>Доступ к process.mainModule для системных вызовов.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Версия vm2</th>
<th>Статус</th>
<th>CVSS</th>
<th>Фикс</th>
</tr>
</thead>
<tbody>
<tr>
<td>≤3.10.1</td>
<td>Уязвима</td>
<td>9.8-10</td>
<td>-</td>
</tr>
<tr>
<td>3.10.2</td>
<td>Исправлена</td>
<td>-</td>
<td>Коммит 4b009c2</td>
</tr>
<tr>
<td>3.10.3</td>
<td>Рекомендуется</td>
<td>-</td>
<td>Доп. патчи</td>
</tr>
</tbody>
</table>
<h2>Риски для Node.js экосистемы</h2>
<p dir="auto">vm2 используется в тысячах проектов для безопасного eval, плагинов или серверлесс-выполнения. Уязвимость угрожает backend-серверам, где sandbox защищает от инъекций в динамическом контенте. Атака не требует привилегий - достаточно отправить вредоносный скрипт.</p>
<p dir="auto">В экосистеме Node.js это усиливает цепочку атак: от клиентского кода к серверному RCE. Прошлые уязвимости vm2 показывают паттерн - разработчики полагались на библиотеку, но повторные escape’ы подрывают доверие. Затронуты npm-пакеты, GitLab CI, облачные платформы с Node.js.</p>
<p dir="auto">Масштаб велик: EPSS 0.00059 указывает на низкую вероятность, но критичность делает ее приоритетной. Организации с dependency scanning (GitLab, Endor Labs) уже фиксируют ее.</p>
<p dir="auto"><strong>Последствия эксплуатации:</strong></p>
<ul>
<li>Полный контроль над сервером.</li>
<li><em>Особенность: утечка ключей, данных через Error.stack.</em></li>
<li>Масштабные компрометации в цепочках поставок.</li>
<li>Необходимость аудита всех sandbox-использований.</li>
</ul>
<h2>Как защититься и альтернативы</h2>
<p dir="auto">Обновление до 3.10.3 - основной шаг. Проверьте package.json на vm2 ≤3.10.1 с npm audit или Snyk. Если sandbox критичен, рассмотрите миграцию на альтернативы вроде isolated-vm или ses (Secure EcmaScript).</p>
<p dir="auto">Изолируйте vm2 в контейнере или используйте worker_threads с ограничениями. Регулярный dependency scanning предотвратит будущие инциденты. Тестируйте свой код на PoC - убедитесь, что escape невозможен.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Альтернатива</th>
<th>Преимущества</th>
<th>Недостатки</th>
</tr>
</thead>
<tbody>
<tr>
<td>isolated-vm</td>
<td>V8 изоляция</td>
<td>Сложнее настройка</td>
</tr>
<tr>
<td>ses</td>
<td>Стандартный JS</td>
<td>Меньше фич</td>
</tr>
<tr>
<td>worker_threads</td>
<td>Встроенный</td>
<td>Не полный sandbox</td>
</tr>
</tbody>
</table>
<h2>Уязвимости на подходе</h2>
<p dir="auto">CVE-2026-22709 напоминает о хрупкости sandbox в JS. Фиксы помогают, но история vm2 полна дыр - от 2021 до 2026. Разработчики Node.js должны пересмотреть подходы к изоляции, особенно с ростом AI-генерируемого кода.</p>
<p dir="auto">Остается открытым вопрос надежности популярных библиотек. Следите за обновлениями в NVD и GitHub Advisories - новые паттерны escape могут появиться в похожих инструментах.</p>
]]></description><link>https://forum.exlends.ru/topic/1105/kriticheskaya-uyazvimost-cve-2026-22709-v-vm2-sandbox-pobeg-i-riski-node.js</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 04:12:56 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1105.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2026 05:03:10 GMT</pubDate><ttl>60</ttl></channel></rss>