Библиотека 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 надёжнее перечислять точные адреса и имена узлов, а не диапазоны. Перехватчики запросов должны возвращать конфигурацию с явно прописанными заголовками.
Настройки безопасности работают только тогда, когда применяются одинаково во всех путях исполнения: в разных адаптерах, при перенаправлениях, при разборе имён и при любых формах записи адреса. Любой путь, обходящий проверку, обесценивает её целиком.
Ссылки
- https://github.com/axios/axios/security/advisories/GHSA-m8m8-qj5v-23w3
- https://github.com/axios/axios/security/advisories/GHSA-44g4-m2mj-wpvx
- https://github.com/axios/axios/security/advisories/GHSA-r4gj-5m52-g5wh
- https://github.com/axios/axios/security/advisories/GHSA-vh66-26gq-q6x8
- https://github.com/axios/axios/security/advisories/GHSA-9fr6-4gfg-395g
- https://github.com/axios/axios/security/advisories/GHSA-c29m-xwm3-cm6r
- https://github.com/axios/axios/security/advisories/GHSA-mghh-pgcx-3jjj
- https://github.com/axios/axios/security/advisories/GHSA-x97p-jq2g-jp4f
- https://github.com/axios/axios/security/advisories/GHSA-3pq3-5fj3-cg6v
- https://github.com/axios/axios/security/advisories/GHSA-542g-h47m-68v8
- https://github.com/axios/axios/security/advisories/GHSA-j8rh-479h-cp32
- https://github.com/axios/axios/security/advisories/GHSA-4hqw-qxg8-jxx2