Безопасность

Cloudflare устранила три уязвимости в фреймворке Pingora, включая две критические

Cloudflare устранила три уязвимости в фреймворке Pingora, включая две критические
Все права принадлежат AInDev.ru

Компания Cloudflare сообщила об устранении трёх серьёзных уязвимостей во фреймворке Pingora, двум из которых присвоен критический уровень опасности (9.3 из 10). Фреймворк Pingora написан на языке Rust и предназначен для создания защищённых высокопроизводительных сетевых сервисов. Прокси, построенный с использованием Pingora, используется в сети доставки контента Cloudflare и обрабатывает более 40 миллионов запросов в секунду.

Две наиболее опасные уязвимости позволяют проводить атаки класса "HTTP Request Smuggling", которые могут обходить системы ограничения доступа и вклиниваться в содержимое запросов других пользователей, обрабатываемых в том же потоке между фронтэндом и бэкендом. Например, это может использоваться для подстановки вредоносного JavaScript-кода в сеанс другого пользователя.

Проблемы были выявлены участником программы Bug Bounty, которая предусматривает выплату вознаграждения за обнаружение уязвимостей. В схеме с обращением к бэкенду через обратный прокси запросы клиентов принимает дополнительный узел, который устанавливает длительно действующее TCP-соединение с бэкендом. Через это общее соединение обычно передаются запросы разных пользователей.

Атаки класса HTTP Request Smuggling возникают из-за разной трактовки HTTP-заголовков и спецификаций протокола HTTP на фронтэндах и бэкендах. Например, когда фронтэнд использует заголовок "Content-Length" для определения размера запроса, а бэкенд — "Transfer-Encoding: chunked".

Первая уязвимость CVE-2026-2835 присутствует в коде разбора запросов HTTP/1.0 и вызвана некорректной обработкой заголовка "Transfer-Encoding" с несколькими значениями, а также использованием закрытия соединения как признака конца тела запроса (close-delimited). Pingora проверял только вариант "Transfer-Encoding: chunked" и игнорировал данный заголовок, если в нём указывалось несколько значений. В этой ситуации Pingora не учитывал размер в заголовке "Content-Length", а считал телом запроса все данные, полученные до закрытия соединения.

Через указание нескольких значений в заголовке "Transfer-Encoding" атакующий мог создать условия, при которых на бэкенд перенаправлялся запрос, фактический размер которого не соответствовал размеру chunked-цепочки, вычисленному на основе заголовка "Transfer-Encoding". Pingora перенаправлял все полученные данные как один запрос, а бэкенд, например, Node.js, вычислял запрос на основе "Transfer-Encoding: chunked" и оставшийся хвост обрабатывал как начало другого запроса.

Вторая уязвимость CVE-2026-2833 вызвана некорректной обработкой HTTP-заголовка "Upgrade" в запросах HTTP/1.1. При наличии в запросе заголовка "Upgrade" прокси сразу пробрасывал к бэкенду и остальные данные запроса, следующие за заголовком "Upgrade", не дожидаясь от бэкенда ответа с кодом 101 (Switching Protocols). Из-за этого синхронизация потока между прокси и бэкендом нарушалась, и бэкенд воспринимал отправленные после заголовка "Upgrade" данные как отдельный запрос.

Третья уязвимость CVE-2026-2836 (степень опасности 8.4 из 10) приводит к отравлению кэша (cache poisoning) из-за генерации ключа размещения данных в кэше (CacheKey) только на основе пути из URI, игнорируя содержимое заголовка "Host". Это приводит к формированию одинаковых ключей кэширования для одинаковых HTTP-путей к разным хостам. Уязвимость может использоваться для подмены содержимого кэша при использовании режима кэширования для нескольких хостов.

Проблемы проявляются при использовании Pingora в качестве обратного прокси (ingress proxy), транслирующего запросы пользователей к бэкендам с использованием протоколов HTTP/1.0 или HTTP/1.1. Конфигурация Pingora, применяемая в сети доставки контента Cloudflare, не позволяет эксплуатировать уязвимости, так как она блокирует запросы с некорректными значениями Content-Length, перенаправляет только одно значение заголовка "Transfer-Encoding: chunked" и подставляет в запросы с заголовком "Upgrade:" дополнительный заголовок "Connection: close".

Все уязвимости были устранены в выпуске Pingora 0.8.0.