<?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[Уязвимость Node.js: архитектурная проблема угрожает миллионам сайтов]]></title><description><![CDATA[<p dir="auto">Node.js снова оказался в центре внимания безопасности, но на этот раз ситуация серьёзнее, чем обычно. Команда разработчиков Node.js официально признала критическую уязвимость не багом, а особенностью архитектуры. Это означает, что проблема останется навсегда - разработчики просто отказались её исправлять.</p>
<p dir="auto">Почему это важно? Потому что от Node.js зависят миллионы веб-приложений, API и инструментов сборки по всему миру. Когда основное средство разработки содержит архитектурный порок, от этого страдают все, кто его использует. Давайте разберёмся, что произошло и почему никто не может просто взять и всё исправить.</p>
<h2>Что именно произошло с Node.js</h2>
<p dir="auto">В экосистеме Node.js обнаружили уязвимость, связанную с базовой логикой HTTP-клиента. Проблема заключается в механизме, который открывает возможность внедрения заголовков и формирования второго запроса в рамках одного соединения. Звучит сложно, но суть простая: злоумышленник может выдать себя за другого пользователя, перехватить данные или полностью изменить смысл запроса.</p>
<p dir="auto">Эта уязвимость уходит корнями в 2018 год. Тогда разработчики уже боролись с похожей проблемой (CVE-2018-12116), которая позволяла внедрять управляющие символы через особенности кодировки latin1. Они добавили проверку пути запроса, запретив символы вне диапазона \u0021—\u00ff. Казалось, что защита сработала. Но оказалось, что защита срабатывала только в момент создания объекта ClientRequest, а после этого свойство path оставалось обычным изменяемым полем без дополнительной валидации.</p>
<p dir="auto">Это типичная ошибка архитектуры: когда критичные параметры можно менять после инициализации, без переповтора проверок безопасности.</p>
<h2>Почему Node.js отказался всё исправлять</h2>
<p dir="auto">Исследователь Мартино Спаньоло под ником r3verii опубликовал детальный разбор уязвимости и отправил отчёт в Node.js через программу HackerOne. Ответ был неожиданным: команда Node.js заявила, что поведение соответствует текущей логике работы и не считается уязвимостью. По их позиции, ответственность лежит на библиотеках, которые позволяют менять path после создания запроса.</p>
<p dir="auto">Основной аргумент Node.js - это не наша ошибка, это проблема в коде ваших библиотек. Но исследователь не согласился и указал на масштаб экосистемы: он проверил популярные библиотеки и выявил семь проектов с незащищённым промежутком TOCTOU (Time-of-Check-Time-of-Use). Среди уязвимых проектов оказались node-http-proxy, http-proxy-middleware и другие широко используемые инструменты.</p>
<p dir="auto">Сложность в том, что такое архитектурное решение невозможно быстро переделать. Это потребовало бы массированных изменений во всём коде Node.js и несовместимости с миллионами приложений, которые на него полагаются.</p>
<h2>Какие именно атаки становятся возможными</h2>
<p dir="auto">Последствия эксплуатации этой уязвимости зависят от того, как её применить. Давайте разберём от простого к сложному:</p>
<p dir="auto"><strong>Внедрение заголовков.</strong> В самом простом варианте злоумышленник внедряет дополнительные HTTP-заголовки. Например, меняет Host или Authorization. Приложение получит запрос с ненужными или поддельными заголовками и может неправильно обработать данные. Это позволяет перехватить сессию или выдать себя за другого пользователя.</p>
<p dir="auto"><strong>Изменение семантики запроса.</strong> Более серьёзный сценарий позволяет закрыть заголовки и добавить тело запроса, полностью изменив смысл исходного обращения. Если приложение отправляет на сервер форму с защитой от CSRF, злоумышленник может переписать параметры и выполнить неавторизованное действие.</p>
<p dir="auto"><strong>Полное разделение запроса.</strong> Самый опасный вариант приводит к тому, что сервер получает два самостоятельных HTTP-обращения вместо одного. Это называется HTTP Request Smuggling - одна из самых коварных уязвимостей, потому что приложение видит один запрос, а сервер обрабатывает два.</p>
<p dir="auto">Рассмотрим конкретный пример. Допустим, приложение отправляет запрос для перевода денег со счёта пользователя на счёт благотворительной организации. Злоумышленник может внедрить дополнительный запрос, который переводит деньги на его собственный счёт, и всё это произойдёт за спиной приложения.</p>
<h2>Другие критические уязвимости Node.js в 2026 году</h2>
<p dir="auto">Это не единственная проблема, с которой столкнулась экосистема Node.js в последние месяцы. Есть и другие серьёзные уязвимости:</p>
<p dir="auto"><strong>CVE-2026-21636.</strong> Уязвимость, связанная с обходом модели разрешений через непроверенные подключения Unix Domain Socket (UDS). Получила максимальную оценку по шкале CVSS 3.1 - 10.0. Суть проблемы в недостатках контроля доступа в механизме безопасности Node.js. Модель разрешений, призванная ограничивать возможности приложений, может быть обойдена через специально сконфигурированные подключения к Unix-сокетам. В результате злоумышленник получает возможность выйти за пределы песочницы и выполнить произвольные команды с высокими привилегиями.</p>
<p dir="auto"><strong>CVE-2026-22709 в библиотеке vm2.</strong> Критическая уязвимость в библиотеке vm2, которую часто используют для запуска недоверенного JavaScript-кода в Node.js. Проблема получила оценку 9.8 по CVSS. Успешная эксплуатация позволяет выполнить произвольный код на хост-системе. Все версии vm2 ниже 3.10.2 уязвимы к атаке. Ошибка кроется в механизме обработки Promise - асинхронных операций JavaScript. Библиотека корректно фильтрует обратные вызовы для собственных объектов localPromise, но не делает этого для глобальных Promise, которые возвращают асинхронные функции. Это позволяет злоумышленнику заставить код выполнить команды за пределами песочницы. Разработчик опубликовал демонстрационный код эксплуатации, так что проблему легко воспроизвести.</p>
<p dir="auto"><strong>CVE-2025-59466.</strong> Уязвимость, которая привлекла внимание благодаря своему потенциалу позволить атаки Denial-of-Service (DoS). Последствия различаются в зависимости от передаваемых данных. В простейшем варианте медленнеет приложение, в худшем - оно полностью падает.</p>
<p dir="auto"><strong>CVE-2025-27209.</strong> Классифицируется как HashDoS - возможность вызвать отказ приложения через создание множественных коллизий хешей. Это означает, что специально подготовленные данные могут заставить сервер тратить все ресурсы на обработку.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Уязвимость</th>
<th>CVSS</th>
<th>Тип атаки</th>
<th>Риск</th>
</tr>
</thead>
<tbody>
<tr>
<td>CVE-2026-21636</td>
<td>10.0</td>
<td>Обход модели разрешений</td>
<td>Выполнение команд с привилегиями</td>
</tr>
<tr>
<td>CVE-2026-22709</td>
<td>9.8</td>
<td>Побег из sandbox</td>
<td>Произвольный код на хосте</td>
</tr>
<tr>
<td>CVE-2025-59466</td>
<td>Высокий</td>
<td>DoS</td>
<td>Отказ в обслуживании</td>
</tr>
<tr>
<td>CVE-2025-27209</td>
<td>Средний</td>
<td>HashDoS</td>
<td>Истощение ресурсов</td>
</tr>
</tbody>
</table>
<h2>Кто в опасности и что нужно делать</h2>
<p dir="auto">Потенциальный масштаб воздействия оценивается как очень высокий. Node.js повсеместно используется для создания серверных приложений, REST API и инструментов сборки. Если вы разработчик, используете Node.js или работаете с приложениями на его основе - вы в зоне риска.</p>
<p dir="auto">Для тех, кто серьёзно относится к безопасности, есть несколько рекомендаций:</p>
<ul>
<li><strong>Обновляться немедленно.</strong> Используйте исправленные версии Node.js: 20.20.0, 22.22.0, 24.13.0 и 25.3.0, которые включают ключевые исправления против выявленных уязвимостей.</li>
<li><strong>Проверьте зависимости.</strong> Если вы используете vm2, обновитесь минимум до версии 3.10.3, где исправлена CVE-2026-22709. Простота эксплуатации этой уязвимости делает обновление критичным.</li>
<li><strong>Пересмотрите валидацию.</strong> Если вы создаёте HTTP-клиента или используете библиотеки, которые позволяют менять параметры запроса после создания, добавьте переповтор валидации перед отправкой.</li>
<li><strong>Мониторьте трафик.</strong> Атаки типа HTTP Request Smuggling сложно обнаружить автоматически, но можно настроить логирование всех изменений параметров запроса.</li>
<li><strong>Оценивайте риски.</strong> Не всем приложениям нужна максимальная безопасность. Если ваше приложение критично для бизнеса, нужна более тщательная защита. Если это демо-проект - можно дождаться стабильной версии исправления.</li>
</ul>
<h2>Архитектура как судьба</h2>
<p dir="auto">Самая важная деталь - это то, что Node.js отказался исправлять уязвимость на уровне архитектуры. Команда разработчиков не видит это как <em>их</em> проблему. Это не ошибка, это особенность, и менять её не собираются.</p>
<p dir="auto">Это поднимает большой вопрос о том, как должна работать безопасность в крупных фреймворках и платформах. Если основной инструмент позволяет делать опасные вещи, кто несёт ответственность - создатель инструмента или разработчик, который его использует? Текущая позиция Node.js - разработчик сам за это ответственен. Но когда проблема затрагивает миллионы приложений, ответственность размывается.</p>
<p dir="auto">Это не означает, что Node.js внезапно стал небезопасным. Это означает, что нужно быть внимательнее при использовании, чаще обновляться и тщательнее проверять собственный код. Архитектурные проблемы невозможно решить единоразово - их приходится обходить постоянно.</p>
]]></description><link>https://forum.exlends.ru/topic/1450/uyazvimost-node.js-arhitekturnaya-problema-ugrozhaet-millionam-sajtov</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 04:20:41 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1450.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Mar 2026 07:25:06 GMT</pubDate><ttl>60</ttl></channel></rss>