Уязвимости в проекта Pingora, позволяващи вмешателство в странични заявки

Компания Cloudflare обяви за отстраняването на три уязвимости във фреймворка Pingora, на две от които е присвоен критичен ниво на опасност (9.3 от 10). Фреймворкът Pingora е написан на езика Rust и е предназначен за разработка на защитени високо производителни мрежови услуги. Изграден с помощта на Pingora, проксито се използва в мрежата за доставка на съдържание на Cloudflare и обработва над 40 млн. заявки в секунда. Уязвимостите са отстранени в версия Pingora 0.8.0.

Две от най-опасните уязвимости позволяват провеждането на атаки от клас „HTTP Request Smuggling“, които позволяват заобикаляне на системите за ограничаване на достъпа и интервенция в съдържанието на заявки на други потребители, обработвани в същия поток между фронт-енд и бек-енд (например, за инжектиране на злонамерен JavaScript код в сесията на друг потребител с сайта). Проблемите са установени от участник в програмата Bug Bounty, която предвижда изплащане на наградите за откритите уязвимости.

В схемата с обращение към бек-енда чрез обратен прокси, заявките на клиентите приемат допълнителен възел, който установява дълготрайна TCP връзка с бек-енда, осъществяващ непосредствената обработка на заявките. През това общо съединение обикновено се предават заявки на различни потребители, които следват по веригата една след друга, с разделяне чрез средствата на протокола HTTP. Атаките от клас 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“ и остатъка обработваше като начало на друга заявка. GET \/ HTTP\/1.0 Host: example.com Connection: keep-alive Transfer-Encoding: identity, chunked Content-Length: 29 0 GET \/admin HTTP\/1.1 X:

Уязвимости в проекта Pingora, позволяващи вмешателство в странични заявки

Втората уязвимост CVE-2026-2833 е причинена от некоректна обработка на HTTP-заглавието „Upgrade“ в HTTP\/1.1 заявки. При наличие на заглавие „Upgrade“ в заявката, проксито незабавно предаваше на бекенда и останалите данни от заявката, следващи след заглавието „Upgrade“, без да изчаква от бекенда отговор с код 101 (Switching Protocols). Заради това синхронизацията на потока между проксито и бекенда беше нарушена и бекендът възприемаше данните, изпратени след заглавието „Upgrade“, като отделна заявка, изпращайки резултата от изпълнението на тази заявка в отговор на следващата заявка от друг потребител. GET \/ HTTP\/1.1 Host: example.com Upgrade: foo GET \/admin HTTP\/1.1 Host: example.com

Уязвимости в проекта Pingora, позволяващи вмешателство в странични заявки
Уязвимости в проекта Pingora, позволяващи вмешателство в странични заявки

Проблемите се проявяват при използване на Pingora под формата на обратен прокси (ingress proxy), който трансферира заявките на потребителите към бекендите, използвайки протоколите HTTP\/1.0 или HTTP\/1.1. Приложената в мрежата за доставка на съдържание Cloudflare конфигурация на Pingora не позволяваше експлоатирането на уязвимостите, тъй като Pingora в CDN не се използва в ролята на ingress-прокси, пренасочва само заявления, използващи протокол HTTP\/1.1, блокира заявления с некоректни стойности на Content-Length, пренасочва само едно значение на заглавието „Transfer-Encoding: chunked“ и добавя в заявките с заглавие „Upgrade:“ допълнително заглавие „Connection: close“, което не позволява предаването на допълнителни заявки в същата връзка.

Третата уязвимост CVE-2026-2836 (степен на опасност 8.4 от 10) води до отравяне на кеша (cache poisoning) заради генериране на ключа за кеширане на данни (CacheKey) само на базата на пътя от URI, игнорирайки съдържанието на заглавката „Host“. Подобна недоработка води до формиране на еднакви кеширащи ключове за еднакви HTTP пътища към различни хостове. Уязвимостта може да се използва за подмяна на съдържанието на кеша при използване на режим на кеширане за няколко хостове. В Pingora кеширането е експериментална функция, която не се препоръчва за работни внедрения.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster