<?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 время от времени сталкиваются с ситуацией, когда серьёзные проблемы безопасности просто объявляют архитектурными решениями и закрывают тикет. В этой статье разберёмся, что произошло с одной из таких уязвимостей в HTTP-клиенте и почему команда сказала «это не наша ответственность».</p>
<p dir="auto">Мы поговорим о том, почему разработчикам важно понимать границы между реальными уязвимостями и заявленными особенностями. Это поможет вам лучше защищать свои приложения и не полагаться слепо на гарантии безопасности.</p>
<h2>Как всё начиналось: история с 2018 года</h2>
<p dir="auto">Всё началось с уязвимости CVE-2018-12116, которая позволяла внедрять управляющие символы через особенности кодировки latin1. Разработчики тогда добавили проверку пути запроса в <code>http.request</code>, запретив символы вне диапазона \u0021—\u00ff. Звучало как надёжное решение — проверка срабатывала в момент создания объекта ClientRequest.</p>
<p dir="auto">Но была одна проблема: после создания запроса свойство <code>path</code> оставалось обычным изменяемым полем без дополнительной валидации. Это было логично с точки зрения архитектуры — зачем ограничивать возможности разработчика, если защита уже установлена при создании? Вот только это создало новую уязвимость, которая ждала, пока её обнаружат.</p>
<p dir="auto"><strong>Ключевые моменты того периода:</strong></p>
<ul>
<li>Проверка срабатывала только один раз при создании объекта</li>
<li>После этого разработчик мог свободно менять значение <code>path</code></li>
<li>Никакой валидации при изменении свойства не было</li>
</ul>
<h2>Что нашли исследователи в 2026 году</h2>
<p dir="auto">Мартино Спаньоло (ник r3verii) обнаружил способ обойти ту самую защиту. Исследователь выяснил, что можно изменить свойство <code>path</code> после создания объекта ClientRequest, тем самым провести атаку на HTTP-клиент базовой логикой уязвимости разделения запросов.</p>
<p dir="auto">Проблема в том, что механизм позволял не просто изменять путь — это открывало целый арсенал возможностей для атаки. В зависимости от того, что именно менять, последствия варьировались от несущественных до катастрофических.</p>
<p dir="auto"><strong>Три сценария эксплуатации:</strong></p>
<ul>
<li><strong>Лёгкий вариант</strong>: внедрение дополнительных HTTP-заголовков, подмена Host или Authorization</li>
<li><strong>Средний вариант</strong>: закрытие заголовков и добавление тела запроса, изменение семантики исходного обращения</li>
<li><strong>Опасный вариант</strong>: полноценное разделение запроса, когда сервер получает два самостоятельных HTTP-обращения вместо одного</li>
</ul>
<h2>Реакция команды Node.js и дебаты</h2>
<p dir="auto">Когда исследователь подал отчёт через программу HackerOne, команда Node.js дала неожиданный ответ: они заявили, что это поведение соответствует текущей логике работы и не считается уязвимостью. По их позиции, ответственность лежит на библиотеках, которые позволяют менять <code>path</code> после создания запроса.</p>
<p dir="auto">Мартино Спаньоло не согласился с такой оценкой. Он указал на несколько важных моментов: масштаб экосистемы Node.js, наличие рабочих примеров эксплуатации и том, что разработчики обычно не ожидают таких подводных камней. Если проверка работает при создании объекта, логично предположить, что изменение свойства не откроет новые уязвимости.</p>
<p dir="auto"><strong>Почему это стало проблемой:</strong></p>
<ul>
<li>Разработчики ожидают, что валидация останется актуальной на протяжении жизни объекта</li>
<li>Для многих библиотек изменение <code>path</code> — нормальная операция</li>
<li>Масштаб экосистемы означает, что уязвимость касается миллионов приложений</li>
<li>Рабочие примеры эксплуатации существуют и доступны</li>
</ul>
<h2>Другие критические уязвимости в Node.js: 2026 год</h2>
<p dir="auto">Это не единственная серьёзная проблема в экосистеме. В начале 2026 года команда Node.js выпустила серию обновлений, которые закрывали несколько критических уязвимостей. Разработчикам было рекомендовано обновиться на исправленные версии: 20.20.0, 22.22.0, 24.13.0 и 25.3.0.</p>
<p dir="auto">Особое внимание привлекла уязвимость CVE-2025-59466, которая позволяла проводить атаки типа Denial-of-Service (DoS). Эта проблема могла серьёзно повлиять на производительность и надёжность приложения, особенно во время пиков нагрузки.</p>
<p dir="auto"><strong>Свежие критические уязвимости:</strong></p>
<ul>
<li><strong>CVE-2026-21636</strong>: обход модели разрешений через непроверенные подключения Unix Domain Socket (UDS), CVSS 10.0</li>
<li><strong>CVE-2026-22709</strong>: в библиотеке vm2 найдена уязвимость с оценкой 9.8 CVSS, позволяющая обходить sandbox и выполнять код на хосте</li>
<li><strong>CVE-2025-59466</strong>: уязвимость DoS, которая может привести к замедлению отклика приложения до предела</li>
</ul>
<h2>Как это защитить и на что обратить внимание</h2>
<p dir="auto">Если вы работаете с Node.js, важно не полагаться только на встроенные механизмы безопасности. Команда разработчиков может считать что-то особенностью архитектуры, а не уязвимостью, и в этом случае вы остаётесь один на один с проблемой.</p>
<p dir="auto">Прежде всего, держите свои зависимости в актуальном состоянии. Регулярно запускайте <code>npm audit</code>, чтобы выявлять потенциальные проблемы на ранних стадиях разработки. Но это только часть решения — нужна комплексная стратегия.</p>
<p dir="auto"><strong>Практические шаги для защиты:</strong></p>
<ul>
<li>Регулярно обновляйте Node.js и все зависимости до последних исправленных версий</li>
<li>Используйте <code>npm audit</code> и <code>npm audit fix</code> для проверки известных уязвимостей</li>
<li>Внедрите CI/CD с автоматическими проверками безопасности на каждый коммит</li>
<li>Не изменяйте критические свойства объектов после их инициализации без необходимости</li>
<li>Проверяйте исходный код библиотек, если они работают с сетевыми запросами</li>
<li>Используйте инструменты статического анализа кода (SAST) для поиска потенциальных проблем</li>
</ul>
<h2>Вопрос о ответственности и коммьюнити</h2>
<p dir="auto">История с CVE-2018-12116 и её «переживание» в новом виде показывает важный момент: команда Node.js может принимать архитектурные решения, которые сегодня кажутся правильными, но завтра оказываются уязвимостями. Это не конец света, но это означает, что вам нужно быть более внимательным.</p>
<p dir="auto">Коммьюнити активно обсуждает эту ситуацию. Разработчики указывают на то, что если проверка интегрирована в ядро, она должна работать постоянно, а не только при создании объекта. Это логично и справедливо, но команда придерживается своей позиции.</p>
<p dir="auto"><strong>На что стоит обратить внимание:</strong></p>
<ul>
<li>Если валидация срабатывает только при создании объекта, это может быть уязвимостью</li>
<li>Разработчикам часто нужно менять параметры запросов, это нормальное использование API</li>
<li>Масштаб экосистемы Node.js означает, что даже небольшие проблемы имеют огромное влияние</li>
<li>Важно следить за дебатами в сообществе, а не только на официальные заявления</li>
</ul>
<h2>Что это значит для будущего</h2>
<p dir="auto">История с Node.js напоминает нам, что безопасность — это не только проблема разработчиков фреймворка, но и наша с вами ответственность. Когда команда говорит, что это особенность, а не баг, это не значит, что проблема исчезла. Это значит, что нам нужно защищаться самостоятельно.</p>
<p dir="auto">Основной вывод: <strong>не полагайтесь слепо на гарантии безопасности</strong>, даже если они исходят от авторитетных проектов. Проверяйте, думайте критически и держите свои приложения в актуальном состоянии. Уязвимости будут всегда, но уровень риска зависит от того, насколько серьёзно вы подходите к вопросу безопасности.</p>
]]></description><link>https://forum.exlends.ru/topic/1339/node.js-uyazvimost-kogda-bag-schitayut-osobennostyu</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:42:06 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1339.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Mar 2026 16:40:28 GMT</pubDate><ttl>60</ttl></channel></rss>