FreeRDP w wersjach do 3.27.1 zawiera heap-based buffer overflow w funkcji crypto_rsa_common(), który może zostać wywołany przez nieuwierzytelnionego atakującego sieciowego. Podatność umożliwia przepełnienie bufora sterty o nawet ~224 bajtów kontrolowanych przez atakującego, co prowadzi do odmowy usługi (DoS).
▸ Pokaż oryginał (EN)
FreeRDP before 3.28.0 (affected <=3.27.1) contains a heap-based buffer overflow in crypto_rsa_common() (libfreerdp/crypto/crypto.c). The function writes the modular-exponentiation result into the caller's output buffer via BN_bn2bin() and only afterward checks output_length > out_length, so out-of-bounds bytes are written before the bounds check. On the server side, when a client selects RDP Standard Security, the encrypted client random is decrypted into a fixed 32-byte buffer. Because the server publishes its RSA public key, an unauthenticated attacker can forge a ciphertext whose decrypted value is up to the full modulus length (e.g. 256 bytes for RSA-2048), overflowing the 32-byte heap buffer by up to ~224 attacker-controlled bytes pre-authentication, resulting in denial of service.
Funkcja crypto_rsa_common() zapisuje wynik modularnego potęgowania (operacji RSA) do bufora wyjściowego wywołującego za pomocą BN_bn2bin(), a dopiero po tym zapisie sprawdza, czy długość wyniku nie przekracza rozmiaru bufora (output_length > out_length). Sprawdzenie granic następuje zatem po faktycznym zapisie poza bufor, a nie przed nim. Po stronie serwera, gdy klient wybierze RDP Standard Security, zaszyfrowany losowy ciąg klienta jest deszyfrowany do stałego bufora o rozmiarze 32 bajtów. Ponieważ serwer publikuje swój klucz publiczny RSA, nieuwierzytelniony atakujący może spreparować szyfrogram, którego odszyfrowana wartość ma długość równą całkowitej długości modułu RSA (np. 256 bajtów dla RSA-2048), powodując przepełnienie 32-bajtowego bufora sterty o nawet ~224 bajtów kontrolowanych przez atakującego.
Nieuwierzytelniony atakujący może wywołać odmowę usługi (DoS) na serwerze FreeRDP obsługującym połączenia RDP Standard Security. Przepełnienie bufora sterty o atakującym kontrolowanej zawartości może potencjalnie prowadzić do dalszej eksploatacji w zależności od środowiska uruchomieniowego.
Należy zaktualizować FreeRDP do wersji 3.28.0 lub nowszej, w której wprowadzono poprawkę (commit 1f7a716d39b5605bb8a83b0c3c97a6ce386609ef). Jako obejście tymczasowe należy rozważyć wyłączenie obsługi RDP Standard Security lub ograniczenie dostępu sieciowego do serwerów FreeRDP wyłącznie do zaufanych hostów.
FreeRDP we wszystkich wersjach do 3.27.1 włącznie (affected <= 3.27.1)
Podatność dotyczy wyłącznie scenariusza, w którym klient negocjuje RDP Standard Security. Opis wskazuje, że atak jest możliwy pre-authentication, co znacznie zwiększa powierzchnię ataku — nie jest wymagane żadne uwierzytelnienie ani interakcja użytkownika.
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:XFreerdp
APPFreerdp< 3.28.0
Powiązane podatności
Double-free w FreeRDP przy parsowaniu pola selectedmonitors pliku .rdp
FreeRDP: heap buffer overflow w obsłudze NSCodec (gdi_surface_bits)
FreeRDP: out-of-bounds read w klientach przed wersją 3.5.1
FreeRDP: out-of-bounds read przy zerowych wymiarach obrazu (RDP)
FreeRDP: integer overflow i out-of-bounds write w obsłudze GFX