CVE-2026-90678: контрабанда HTTP-запросов в HAProxy через HTTP/3
В HAProxy 3.3.0–3.4.4 и ветках 3.5-dev обнаружена уязвимость высокого риска (CVSS 7.5), позволяющая проводить контрабанду HTTP-запросов (request smuggling) на переиспользуемых backend-соединениях. Эксплуатация возможна только при наличии HTTP/3-фронтенда с поддержкой QUIC. Атака позволяет обходить правила фильтрации и приводить к утечке или потере запросов других клиентов.
Подробности
Уязвимость затрагивает HAProxy версий 3.3.0–3.4.4, а также промежуточные сборки 3.5-dev1–3.5-dev5. Механизм, лежащий в основе проблемы, был привнесён ещё в 3.3-dev10; ветки 3.2.x и более ранние не подвержены ей. Для эксплуатации требуется стечение нескольких условий: HAProxy должен быть собран с поддержкой QUIC и настроен на прослушивание HTTP/3 (QUIC bind listener); трафик должен попадать на backend по HTTP/1.1 с использованием chunked transfer coding на уже переиспользуемом соединении. Если HTTP/3-запрос не содержит заголовка Content-Length, мультиплексор HTTP/3 учитывает длину, заявленную в заголовке DATA-фрейма, в оценке входных данных потока в момент декодирования заголовка — то есть до фактического получения полезной нагрузки. В дальнейшем эта заявленная длина дословно переносится в размер чанка HTTP/1.1. Удалённый неаутентифицированный клиент, объявивший больший объём данных, чем он фактически передаёт, и завершающий поток, заставляет HAProxy анонсировать чанк большего размера, чем реально записанные байты, и возвращает соединение в пул простаивающих в десинхронизированном состоянии. Это открывает возможность контрабанды HTTP-запросов на переиспользуемых backend-соединениях. Атакующий может протолкнуть запрос в обход фронтенд-правила (например, path-based `http-request deny`), который не будет проанализирован HTTP-движком HAProxy. Кроме того, запросы параллельных клиентов — включая их request line и заголовки Authorization — могут быть поглощены как тело запроса атакующего и потеряны. Эксплуатация не является детерминированной: она зависит от гонки при пулинге backend-соединений и в ходе тестирования срабатывала в большинстве, но не во всех попытках. При этом атаку можно повторять неограниченно.Что делать
Рекомендуется в первую очередь обновиться до версии HAProxy, в которой проблема устранена (проверьте актуальные релизы в официальном репозитории проекта). Если обновление невозможно, следует рассмотреть временные меры: - отключить HTTP/3-фронтенды или перевести их на HTTP/1.1/HTTP/2, если поддержка QUIC не является критичной; - ограничить переиспользование backend-соединений и сократить время их жизни; - ужесточить контроль за соблюдением правил фильтрации на уровне балансировщика и нижележащих сервисов; - вести мониторинг аномалий на переиспользуемых соединениях (рассогласование размеров чанков, «зависшие» соединения в пуле). Итог: CVE-2026-90678 — серьёзная уязвимость класса request smuggling, требующая достаточно специфичной конфигурации, но способная обходить защитные правила и влиять на других клиентов. Всем организациям, использующим HAProxy с HTTP/3, следует оперативно проверить свои версии и как можно скорее применить исправление.Источник: CVE Project (cvelistV5)
