Уязвимости в проекта 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 на фронтендите и бекендите, например, когато фронтендът използва заглавието 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", проксито веднага я предава на бекенда, без да изчаква отговор с код 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. Конфигурацията на Pingora в мрежата за доставка на съдържание Cloudflare не позволява експлоатиране на уязвимостите, тъй като Pingora в CDN не изпълнява ролята на ingress-прокси, предава само с HTTP/1.1, блокира заявки с неправилни стойности на Content-Length, предава само едно значение на заглавката "Transfer-Encoding: chunked" и добавя допълнителна заглавка "Connection: close" в заявките с заглавка "Upgrade:", което не позволява предаване на допълнителни заявки в същата връзка.

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

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

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