Разработчики Traefik закрыли пять уязвимостей в обратном прокси и балансировщике нагрузки. Три из них ведут к раскрытию чужих данных или к обходу правил доступа. Исправления вошли в выпуски v2.11.57 и v3.7.13. Опасности подвержены все версии ветки v3.x младше v3.7.13 и релизы v2.x младше v2.11.57. Идентификаторы CVE этим уязвимостям пока не присвоены. Данных об эксплуатации в реальных атаках на момент публикации бюллетеней нет.
Детали уязвимостей
Самая тяжёлая уязвимость затрагивает обработку HTTP/3. Traefik не заводит отдельный пул соединений с внутренним сервером для каждого клиента. Поэтому прокси переиспользует соединение, которое уже прошло проверку подлинности. Речь идёт о схемах NTLM и Negotiate, где подлинность привязана к конкретному соединению, а не к каждому отдельному запросу. Если HTTP/3 включён на точке входа, а сервер поддерживает постоянные соединения, сторонний клиент получает уже авторизованное соединение. После этого он читает данные, доступные жертве, и выполняет действия от её имени. Учётные данные ему не нужны. Разработчики относят эту уязвимость к критическому уровню. Для эксплуатации нужны три условия: HTTP/3 на точке входа, внутренний сервер с привязкой подлинности к соединению и режим keep-alive. Установки с обычной проверкой подлинности на каждый запрос под угрозу не попадают.
Вторая уязвимость обходит маршрутизацию целиком. Traefik принимает запрос HTTP/1.x с целью в так называемой корневой форме, когда путь в адресе отсутствует. Разбор такого запроса даёт пустой путь, который нормализуется в корень. В итоге прокси оценивает маршруты, правила очистки пути, промежуточное ПО (middleware, связующее звено обработки запросов) и запись в журнал по корню. Сам запрос при этом уходит на внутренний сервер побайтово в исходном виде. Поэтому злоумышленник обходит ограничения по пути, обходит проверку прав для отдельных адресов и не оставляет следа в журнале доступа. Атака не требует учётных данных и работает на настройках по умолчанию.
Третья уязвимость относится к несогласованной интерпретации запросов, известной также как контрабанда запросов. Traefik поддерживает незашифрованный HTTP/2 с предварительным знанием и передаёт на внутренний сервер заголовки с запросом перехода на этот протокол. Если сервер соглашается, прокси переходит в режим прямой передачи байтов. Такой режим идёт мимо маршрутизатора и всего промежуточного ПО: проверка подлинности, списки разрешённых адресов и ограничение скорости перестают действовать. Разработчики отмечают, что для эксплуатации нужен сервер, который соглашается на переход без должной проверки. Распространённые готовые серверы в ходе тестирования оказались невосприимчивы.
Четвёртая уязвимость связана с трейлерами, то есть завершающими заголовками, которые передаются после тела сообщения. Traefik очищает заголовки с информацией о клиенте только в основной части запроса, но не в трейлерах. Следовательно, сторонний клиент проносит подставные имена заголовков через трейлер, и защита их не отсекает. Если промежуточное ПО буферизует тело запроса, трейлер уходит на внутренний сервер со значением, выбранным злоумышленником. Сервер, который объединяет трейлеры с обычными заголовками, затем доверяет подставленному имени. Ветка v2 этой уязвимости не подвержена, поскольку опирается на стандартный обратный прокси из состава языка Go.
Пятая уязвимость менее значима и касается проверки паролей в базовой аутентификации. Начиная с версии v3.6.11 Traefik объединяет одновременные проверки учётных данных, чтобы не считать один и тот же хеш многократно. Ключ объединения зависел от сохранённого секрета, а не только от присланных данных. При большом числе параллельных запросов злоумышленник определяет по времени ответа, существует ли пользователь с таким именем. Проявляется это только при одновременных обращениях. Раскрытие пароля или обход входа невозможны. Ветку v2 проблема не затрагивает.
Общая картина неудобна для тех, кто откладывает обновления. Ветки v3.0 - v3.6 объявлены устаревшими, и исправлений для них не будет. Пользователям этих версий придётся перейти сразу на v3.7.13. Часть уязвимостей действует и на ветке v2.x вплоть до v2.11.56 включительно, поэтому обновление до v2.11.57 обязательно и там. Обе крайние версии закрывают все пять проблем.
После обновления стоит проверить, включён ли HTTP/3 на точках входа. Если внутренние сервисы не используют привязку подлинности к соединению, риск от этой уязвимости падает сразу. Полезно также просмотреть журналы доступа на предмет запросов, записанных как обращения к корню при работе с нестандартными адресами. Такие записи могут указывать на попытки обхода маршрутизации. Отдельного внимания заслуживает конфигурация внутренних серверов: там, где возможно, лучше перейти на проверку подлинности для каждого запроса.
Traefik стоит на периметре и обрабатывает внешний трафик, поэтому ошибки в разборе запросов здесь оборачиваются обходом всей защиты сразу. Расхождения между прокси и внутренним сервером в трактовке HTTP/3 и HTTP/2 остаются направлением, где злоумышленник получает лишние возможности без единого валидного учётного данных. Разработчики закрыли именно расхождения, а не отдельные ошибки в коде, и это делает обновление обязательным для всех, кто держит Traefik на внешнем контуре.
Ссылки
- https://github.com/traefik/traefik/security/advisories/GHSA-w4v4-9rw7-5326
- https://github.com/traefik/traefik/security/advisories/GHSA-v67p-phpq-fc8x
- https://github.com/traefik/traefik/security/advisories/GHSA-qqjf-53cj-pwvv
- https://github.com/traefik/traefik/security/advisories/GHSA-f52w-8j3h-j724
- https://github.com/traefik/traefik/security/advisories/GHSA-8fcf-v89g-xpg6