Traefik допускает обход и удалённый отказ в обслуживании

Traefik

Три уязвимости в Traefik позволяют злоумышленнику обойти политику безопасности и вызвать удалённый отказ в обслуживании. Проблемы затрагивают все версии до v2.11.56 включительно, а также выпуски линейки v3 до v3.7.12. Разработчики подготовили исправления в версиях v2.11.56 и v3.7.12. Traefik - популярный обратный прокси и маршрутизатор, который часто применяется в Kubernetes-средах, поэтому новость важна для широкого круга администраторов.

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

Первая уязвимость связана с обработкой запросов по протоколу HTTP/3. Настройки таймаутов, в частности ограничение времени на чтение всего запроса вместе с телом, не применяются к HTTP/3-соединениям. По умолчанию это ограничение установлено в 60 секунд, однако в HTTP/3 оно не действует. Из-за этого неаутентифицированный клиент может отправлять тело запроса медленно, удерживая соединение открытым неограниченно долго. Каждое такое соединение занимает одно подключение к бэкенду, что при ограниченном пуле соединений приводит к отказу в обслуживании. Проблема возникла в версии v2.8.2, когда изменение в библиотеке quic-go привело к потере таймаутов. Все последующие выпуски до v2.11.55 и v3.7.11 уязвимы.

Вторая уязвимость, в свою очередь, затрагивает провайдера Kubernetes ingress-nginx. Когда Ingress содержит аннотацию для аутентификации и одновременно редирект с www на основной домен, Traefik создаёт дополнительный маршрутизатор, который работает на основе имени хоста. Этот маршрутизатор содержит только промежуточное ПО для редиректа, но указывает на тот же защищённый бэкенд. Редирект не является конечным обработчиком: если запрос не соответствует его шаблону, он передаётся дальше. Шаблон редиректа принимает только числовой порт, а нормализация имени хоста в Traefik допускает произвольный порт. Запрос с нечисловым или пустым портом в заголовке Host выбирает дополнительный маршрутизатор, пропускает редирект и направляется на бэкенд без аутентификации и других промежуточных обработчиков, заданных аннотациями. Таким образом теряются не только проверки подлинности, но и, например, фильтрация по IP-адресу. Уязвимость появилась в версии v3.7.0, где была добавлена обработка этого типа редиректа.

Третья проблема, кроме того, связана с обработкой имён заголовков. Язык Go канонизирует имена заголовков только по символу дефиса, поэтому Traefik различает заголовки X-Auth-User, X_Auth_User и X.Auth.User. Некоторые бэкенды, например CGI, WSGI, PHP и NGINX, при получении заголовка преобразуют его имя в переменную, сводя все варианты к одному. Злоумышленник может отправить заголовок с точкой или подчёркиванием, который Traefik не считает управляемым. Такой заголовок попадёт на бэкенд и будет интерпретирован как значение, установленное самим Traefik. Например, если Traefik добавляет заголовок X-Authenticated-User после проверки через ForwardAuth, клиент может отправить X.Authenticated.User, и бэкенд прочитает подставленное значение. Это позволяет подменить личность пользователя, обойдя механизмы аутентификации. Уязвимость является неполным исправлением предыдущей проблемы, которая закрывала только вариант с подчёркиванием.

Все три уязвимости получили идентификаторы GHSA-7ghq-v6jf-g56c, GHSA-cjr6-pf59-jq29 и GHSA-rf44-j88r-hh8c. CVE-идентификаторы не присвоены. Эксплуатация в реальных атаках не зафиксирована, однако уязвимость в ingress-nginx оценена как высокорискованная, поскольку она позволяет обойти аутентификацию и получить доступ к защищённым ресурсам. Две другие проблемы имеют умеренный уровень риска. Тем не менее, уязвимость в HTTP/3 может быть использована для истощения ресурсов сервера, что особенно опасно для публичных сервисов.

Для устранения этих проблем необходимо обновить Traefik до версий v2.11.56 или v3.7.12 в зависимости от используемой ветки. Пользователям версий v2.8.2-v2.10.x и v3.0-v3.6, которые больше не поддерживаются, нужно перейти на актуальные выпуски. Для защиты от подмены заголовков только обновления недостаточно. Разработчики добавили новую опцию aliasHeadersStrategy, которая по умолчанию сохраняет прежнее поведение для совместимости. Чтобы закрыть эту уязвимость, необходимо явно установить опцию в значение delete или reject. Рекомендуется проверить конфигурацию и применить настройку до или после обновления.

Эти уязвимости показывают, насколько сложно поддерживать безопасность в продуктах, работающих на стыке разных протоколов и экосистем. Ошибка в HTTP/3 возникла из-за изменения API библиотеки quic-go, а проблема с заголовками связана с различиями в обработке имён между Go и другими языками. Пользователям Traefik стоит внимательно отнестись к обновлению и проверить настройки безопасности, особенно при использовании Kubernetes и внешней аутентификации.

Ссылки

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