Дыра есть, исправлять не будем. В Node.js нашли способ взломать почти всё, но разработчики называют это «особенностью архитектуры»

Масштаб грядущих неприятностей пока трудно даже вообразить.


0pfon74nnf9n5cbpjmymsboipu0dltn4.jpg

В экосистеме Node.js обнаружили уязвимость, связанную с базовой логикой HTTP-клиента, которая позволяет обойти прежнюю защиту от разделения запросов. Мартино Спаньоло под ником r3verii опубликовал разбор после того, как команда Node.js отказалась считать проблему нарушением своей модели угроз. Речь идёт о механизме, который открывает возможность внедрения заголовков и формирования второго запроса в рамках одного соединения.

Проблема уходит корнями в 2018 год, когда уязвимость CVE-2018-12116 позволяла внедрять управляющие символы через особенности кодировки latin1. Тогда разработчики добавили проверку пути запроса в http.request, запретив символы вне диапазона \u0021—\u00ff. Защита срабатывала только в момент создания объекта ClientRequest. После этого свойство path оставалось обычным изменяемым полем без дополнительной валидации.

Исследование показало, что если изменить clientRequest.path после создания запроса, проверка больше не выполняется. При формировании HTTP-строки метод _implicitHeader использует текущее значение path без повторной фильтрации. В результате управляющие последовательности \r\n могут попасть напрямую в TCP-поток.

В зависимости от передаваемых данных последствия различаются. В простейшем варианте злоумышленник внедряет дополнительные HTTP-заголовки и подменяет Host или Authorization. Более серьёзный сценарий позволяет закрыть заголовки и добавить тело запроса, изменив семантику исходного обращения. Самый опасный вариант приводит к полноценному разделению запроса, когда сервер получает два самостоятельных HTTP-обращения вместо одного.