Podatność typu race condition w serwerze WSGI Waitress pozwala zdalnemu klientowi na przetworzenie drugiego żądania HTTP (pipelining) nawet po tym, gdy połączenie powinno zostać zamknięte z powodu błędu parsowania. Jest to groźne, ponieważ umożliwia nieautoryzowane przetwarzanie żądań przez wątek roboczy serwera w kontekście błędnego stanu połączenia.
▸ Pokaż oryginał (EN)
Waitress is a Web Server Gateway Interface server for Python 2 and 3. A remote client may send a request that is exactly recv_bytes (defaults to 8192) long, followed by a secondary request using HTTP pipelining. When request lookahead is disabled (default) we won't read any more requests, and when the first request fails due to a parsing error, we simply close the connection. However when request lookahead is enabled, it is possible to process and receive the first request, start sending the error message back to the client while we read the next request and queue it. This will allow the secondary request to be serviced by the worker thread while the connection should be closed. Waitress 3.0.1 fixes the race condition. As a workaround, disable channel_request_lookahead, this is set to 0 by default disabling this feature.
Atakujący wysyła żądanie o długości dokładnie równej wartości recv_bytes (domyślnie 8192 bajtów), po którym natychmiast przesyła drugie żądanie z wykorzystaniem HTTP pipelining. Gdy włączona jest opcja request lookahead (channel_request_lookahead > 0), serwer może zacząć wysyłać odpowiedź błędu na pierwsze żądanie, jednocześnie odczytując i kolejkując drugie żądanie. Na skutek wyścigu (race condition) drugie żądanie zostaje obsłużone przez wątek roboczy, mimo że połączenie powinno już być zamknięte. Podatność wynika z nieprawidłowej kolejności sprawdzania stanu połączenia względem przetwarzania kolejnych żądań (CWE-367) oraz niespójnej interpretacji sekwencji żądań HTTP (CWE-444).
Atakujący może spowodować, że serwer przetworzy i wykona drugie, potencjalnie złośliwe żądanie HTTP w kontekście połączenia, które powinno zostać odrzucone, co może prowadzić do nieautoryzowanego dostępu do zasobów lub naruszenia integralności przetwarzanych danych.
Należy zaktualizować Waitress do wersji 3.0.1. Jako obejście (workaround) należy wyłączyć opcję channel_request_lookahead, ustawiając jej wartość na 0 (jest to ustawienie domyślne — instalacje niemodyfikujące tej opcji nie są narażone).
Agendaless Waitress — wersje z włączoną opcją channel_request_lookahead (wartość większa niż 0); podatność naprawiona w wersji 3.0.1
Podatność dotyczy wyłącznie konfiguracji z niedomyślnie włączonym channel_request_lookahead. Domyślna konfiguracja Waitress (channel_request_lookahead=0) nie jest podatna.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:NAgendaless Waitress
APPAgendaless2.0.0 – 3.0.1 (bez)
Powiązane podatności
Waitress is a Web Server Gateway Interface server for Python 2 and 3. When a remote client closes the connecti...
Waitress is a Web Server Gateway Interface server for Python 2 and 3. When using Waitress versions 2.1.0 and p...
Waitress through version 1.3.1 allows request smuggling by sending the Content-Length header twice. Waitress w...
In Waitress through version 1.4.0, if a proxy server is used in front of waitress, an invalid request may be s...
Waitress through version 1.3.1 implemented a "MAY" part of the RFC7230 which states: "Although the line termin...