Axios 1.20.0 закрывает двенадцать уязвимостей, включая обход прокси через HTTP/2

axios

Библиотека Axios, через которую серверные приложения на Node.js отправляют исходящие HTTP-запросы, получила исправления для двенадцати уязвимостей. Основная угроза связана с поддержкой HTTP/2: этот режим игнорирует настройки прокси и собственные обработчики DNS, поэтому приложение может напрямую соединиться с внутренним сервисом или со службой метаданных облачного провайдера. Несколько проблем приводят к аварийному завершению процесса, подмене заголовков и подмене HTTP-метода. Исправленные сборки - 1.20.0, а для старой линии 0.x - 0.34.0.

Детали уязвимостей

Корень главной проблемы лежит в устройстве HTTP/2-адаптера. Он открывает сессию, передавая ей лишь собственный набор низкоуровневых параметров. Верхнеуровневые настройки запроса при этом теряются: разрешение имён через пользовательский обработчик, агенты соединений и маршрутизация через прокси не применяются. В итоге запрос, который разработчик рассчитывал направить через прокси или заблокировать на уровне обработчика DNS, уходит напрямую.

Сценарий атаки прост. Приложение принимает от пользователя адрес, включает поддержку HTTP/2 и полагается на прокси или собственный обработчик DNS как на защиту от SSRF (подделки запросов со стороны сервера). Злоумышленник подставляет адрес внутреннего узла, частного IP-адреса или службы метаданных. Проверка не срабатывает, и соединение устанавливается напрямую.

Такая уязвимость затрагивает серверные развёртывания, где Axios работает клиентом для исходящих запросов, а сетевые ограничения заданы в его конфигурации. Успешная эксплуатация открывает ответы внутренних интерфейсов, метаданные облачного экземпляра, учётные данные и административные панели. Тем же путём можно отправить изменяющие состояние запросы к сервисам, которые обязаны оставаться недоступными. Разработчики оценили опасность как высокую, уязвимость получила идентификатор CVE-2026-101898 и затрагивает ветку начиная с версии 1.13.0.

Вторая проблема того же HTTP/2-пути связана с обработкой ошибок. Когда сессия сообщает об ошибке, а библиотека её не перехватывает, Node.js завершает процесс аварийно, вместо того чтобы отклонить запрос обычным способом. Хватает недоступного адреса или сервера без поддержки HTTP/2, чтобы приложение упало. Степень опасности высокая. Стандартный режим HTTP/1.1 и браузерные адаптеры не затронуты.

Отдельный пласт проблем вырос вокруг переменных окружения для прокси. Axios не распознаёт записи вида 10.0.0.0/8 или 169.254.169.254/32 в переменной NO_PROXY, где перечислены адреса и подсети, не требующие прокси. Трафик к петлевым, частным и кластерным адресам уходит на прокси-сервер, хотя политика требует обратного. Для открытых HTTP-адресов прокси видит и может менять адрес, заголовки и тело запроса. Степень опасности средняя.

Ещё две уязвимости вызывают отказ в обслуживании через перегрузку регулярных выражений. Первая срабатывает при нормализации имени узла: сервер-злоумышленник отвечает перенаправлением на адрес из тысяч точек. Синхронная обработка надолго блокирует цикл событий Node.js, и приложение перестаёт отвечать на другие запросы. Вторая прячется в разборе ссылок со схемой data:. Строка из множества косых черт без запятой заставляет тратить процессорное время до того, как сработает таймаут запроса. Обе оценили как высокие по степени опасности.

Адаптер fetch, который всё чаще выбирается в серверных средах, не учитывает параметр maxRedirects со значением 0. Многие приложения используют его как защиту от перенаправлений в борьбе с SSRF. Проверка не работает, поэтому сервер-злоумышленник отвечает перенаправлением, и запрос уходит на внутренний адрес, доступный только из окружения приложения. Опасность высокая.

Заметная часть найденных проблем относится к классу "загрязнение прототипа" (prototype pollution). Здесь другая уязвимость в том же процессе дописывает свойства в общий для всех объектов JavaScript прототип. После этого Axios читает чужие значения как свои. Через унаследованные заголовки адаптер fetch может подменить или отбросить заголовки запроса, включая данные авторизации.

Другой вариант - подмена HTTP-метода. Если в запросе к экземпляру по умолчанию метод не задан явно, вместо GET уходит DELETE, POST или PUT. Внутренний сервис выполняет нежелательное изменение. В Node HTTP-адаптере загрязнение прототипа доходит до уровня сокета: соединение устанавливается с чужим узлом, хотя адрес в конфигурации и в проверках приложения остаётся легитимным. Такой сценарий позволяет забрать заголовки авторизации, файлы cookie и ключи API (CVE-2026-101905, высокая степень опасности).

Сериализация форм тоже чувствительна к загрязнению прототипа. Подменённые значения искажают имена полей и структуру данных, а иногда приводят к ошибке на вложенных формах, то есть к отказу в обслуживании.

В группе риска - серверные приложения на Node.js, которые загружают адреса, заданные пользователем, обрабатывают вебхуки (уведомления от внешних сервисов), отрисовывают удалённый контент или обращаются к облачным службам. Цепочки с загрязнением прототипа срабатывают только при наличии отдельной уязвимости, создающей первопричину, однако на практике такие связки встречаются.

Обновиться стоит до 1.20.0; для линии 0.x выпустили 0.34.0. Пока патч не установлен, помогают обходные меры. Для запросов, зависящих от прокси или DNS-политик, разумно перейти на HTTP/1.1. В адаптере fetch параметр maxRedirects перестаёт быть защитой, поэтому там задают ручной режим перенаправлений. От ссылок со схемой data: лучше отказаться на входе и ограничить длину принимаемых адресов. В NO_PROXY надёжнее перечислять точные адреса и имена узлов, а не диапазоны. Перехватчики запросов должны возвращать конфигурацию с явно прописанными заголовками.

Настройки безопасности работают только тогда, когда применяются одинаково во всех путях исполнения: в разных адаптерах, при перенаправлениях, при разборе имён и при любых формах записи адреса. Любой путь, обходящий проверку, обесценивает её целиком.

Ссылки

Комментарии: 0