Vulnerabilities in the Pingora project allow for injection into third-party requests

Firma Cloudflare ogłosiła o usunięciu trzech podatności w frameworku Pingora, z których dwie otrzymały krytyczny poziom zagrożenia (9,3 na 10). Framework Pingora jest napisany w języku Rust i przeznaczony do tworzenia zabezpieczonych, wysokowydajnych usług sieciowych. Zbudowany przy pomocy Pingora proxy jest używane w sieci dostarczania treści Cloudflare i przetwarza ponad 40 mln zapytań na sekundę. Podatności zostały usunięte w wersji Pingora 0.8.0.

Dwie najbardziej niebezpieczne podatności umożliwiają przeprowadzanie ataków typu 'HTTP Request Smuggling', które pozwalają na omijanie systemów ograniczenia dostępu i wkraczanie w zawartość zapytań innych użytkowników, przetwarzanych w tym samym strumieniu między frontendem a backendem (na przykład, aby wstrzykiwać złośliwy kod JavaScript w sesję innego użytkownika na stronie). Problemy zostały wykryte przez uczestnika programu Bug Bounty, który przewiduje wypłatę nagród za odnajdywanie podatności.

W schemacie z odwołaniem do backendu przez odwrotne proxy, zapytania klientów są przyjmowane przez dodatkowy węzeł, który ustanawia długoterminowe połączenie TCP z backendem, który dokonuje bezpośredniej obsługi zapytań. Poprzez to wspólne połączenie zazwyczaj przesyłane są zapytania różnych użytkowników, które podążają łańcuchowo jedno za drugim z rozdzieleniem środkami protokołu HTTP. Ataki typu HTTP Request Smuggling powstają z powodu różnej interpretacji nagłówków HTTP i specyfikacji protokołu HTTP na frontendach i backendach, na przykład, gdy frontend używa nagłówka HTTP „Content-Length” do ustalenia rozmiaru zapytania, a backend „Transfer-Encoding: chunked”.

Pierwsza podatność CVE-2026-2835 występuje w kodzie analizy zapytań HTTP/1.0 i jest spowodowana niewłaściwym przetwarzaniem nagłówka „Transfer-Encoding” z wieloma wartościami oraz używaniem zamknięcia połączenia jako oznaki końca ciała zapytania (close-delimited). Pingora sprawdzał tylko wariant „Transfer-Encoding: chunked” i ignorował ten nagłówek, jeśli zawierał wiele wartości. W tej sytuacji Pingora nie brał pod uwagę rozmiaru w nagłówku „Content-Length”, a uznawał za ciało zapytania wszystkie dane otrzymane do zamknięcia połączenia.

O wskazanie kilku wartości w nagłówku „Transfer-Encoding” atakujący mógł stworzyć warunki, w których na backend kierowano żądanie, którego faktyczny rozmiar nie odpowiadał rozmiarowi łańcucha chunked, obliczonemu na podstawie nagłówka „Transfer-Encoding”. Pingora przesyłał wszystkie otrzymane dane jako jedno żądanie, a backend, na przykład Node.js, obliczał żądanie na podstawie „Transfer-Encoding: chunked” i pozostały ogon przetwarzał jako początek innego żądania. GET / HTTP/1.0 Host: example.com Connection: keep-alive Transfer-Encoding: identity, chunked Content-Length: 29 0 GET /admin HTTP/1.1 X:

Vulnerabilities in the Pingora project allow for injection into third-party requests

Druga podatność CVE-2026-2833 wynika z nieprawidłowego przetwarzania nagłówka HTTP „Upgrade” w żądaniach HTTP/1.1. W obecności nagłówka „Upgrade” w żądaniu, proxy natychmiast przekazywało do backendu resztę danych żądania, które następowały po nagłówku „Upgrade”, nie czekając na odpowiedź od backendu z kodem 101 (Switching Protocols). W wyniku tego synchronizacja strumieni między proxy a backendem była zaburzona, a backend postrzegał dane wysyłane po nagłówku „Upgrade” jako oddzielne żądanie i wysyłał wynik wykonania tego żądania w odpowiedzi na nadchodzące później żądanie innego użytkownika. GET / HTTP/1.1 Host: example.com Upgrade: foo GET /admin HTTP/1.1 Host: example.com

Vulnerabilities in the Pingora project allow for injection into third-party requests
Vulnerabilities in the Pingora project allow for injection into third-party requests

Problemy manifestują się podczas korzystania z Pingora w formie odwróconego proxy (ingress proxy), które przekazuje żądania użytkowników do backendów przy użyciu protokołów HTTP/1.0 lub HTTP/1.1. Stosowana w sieci dostarczania treści Cloudflare konfiguracja Pingora nie pozwalała na wykorzystanie podatności, gdyż Pingora w CDN nie jest używane jako ingress-proxy, kieruje żądania tylko przy użyciu protokołu HTTP/1.1, blokuje żądania z nieprawidłowymi wartościami Content-Length, przekazuje tylko jedną wartość nagłówka „Transfer-Encoding: chunked” oraz dodaje w żądaniach z nagłówkiem „Upgrade:” dodatkowy nagłówek „Connection: close”, co uniemożliwia przekazywanie dodatkowych żądań w tym samym połączeniu.

Trzecia podatność CVE-2026-2836 (poziom zagrożenia 8.4 w skali 10) prowadzi do zafałszowania pamięci podręcznej (cache poisoning) z powodu generowania klucza lokalizacji danych w pamięci podręcznej (CacheKey) wyłącznie na podstawie ścieżki URI, ignorując zawartość nagłówka „Host”. Taki błąd prowadzi do tworzenia identycznych kluczy pamięci podręcznej dla takich samych ścieżek HTTP dla różnych hostów. Podatność może być wykorzystana do podmiany zawartości pamięci podręcznej przy korzystaniu z trybu pamięci podręcznej dla wielu hostów. W Pingora pamięć podręczna jest funkcją eksperymentalną, niezalecaną do wdrożeń produkcyjnych.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster