Luka w bibliotekach sieciowych języków Rust i Go, która pozwala ominąć weryfikację adresu IP

W standardowych bibliotekach języków Rust i Go zidentyfikowano luki związane z nieprawidłowym przetwarzaniem adresów IP zawierających cyfry ósemkowe w funkcjach analizowania adresów. Luki umożliwiają ominięcie kontroli poprawnych adresów w aplikacjach, na przykład w celu zorganizowania dostępu do adresów interfejsu pętli zwrotnej (127.xxx) lub podsieci intranetowych podczas przeprowadzania ataków SSRF (ang. Server-side request forgery). Luki kontynuują cykl problemów zidentyfikowanych wcześniej w bibliotekach node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validate::IP (Perl, CVE-2021-29662) i Net::Netmask (Perl, CVE-2021-29424).

Zgodnie ze specyfikacją wartości ciągów adresów IP rozpoczynające się od zera należy interpretować jako liczby ósemkowe, jednak wiele bibliotek nie bierze tego pod uwagę i po prostu odrzuca zero, traktując wartość jako liczbę dziesiętną. Na przykład liczba 0177 w systemie ósemkowym jest równa 127 w systemie dziesiętnym. Osoba atakująca może zażądać zasobu, podając wartość „0177.0.0.1”, która w zapisie dziesiętnym odpowiada „127.0.0.1”. W przypadku wykorzystania problematycznej biblioteki aplikacja nie wykryje, że adres 0177.0.0.1 znajduje się w podsieci 127.0.0.1/8, ale tak naprawdę wysyłając żądanie może uzyskać dostęp do adresu „0177.0.0.1”, który funkcje sieciowe będą przetwarzane jako 127.0.0.1. W podobny sposób można oszukać kontrolę dostępu do adresów intranetowych, podając wartości typu „012.0.0.1” (odpowiednik „10.0.0.1”).

W Rust problem dotyczył biblioteki standardowej „std::net” (CVE-2021-29922). Parser adresu IP tej biblioteki odrzucił zero przed wartościami w adresie, ale tylko wtedy, gdy podano nie więcej niż trzy cyfry, na przykład „0177.0.0.1” zostałoby odebrane jako nieprawidłowa wartość i nieprawidłowy wynik zostanie zwrócony w odpowiedzi na 010.8.8.8 i 127.0.026.1 . Aplikacje korzystające z std::net::IpAddr podczas analizowania adresów określonych przez użytkownika są potencjalnie podatne na ataki SSRF (fałszowanie żądań po stronie serwera), RFI (zdalne dołączanie plików) i LFI (dołączanie plików lokalnych). Luka została naprawiona w gałęzi Rust 1.53.0.

Luka w bibliotekach sieciowych języków Rust i Go, która pozwala ominąć weryfikację adresu IP

W Go dotyczy to standardowej biblioteki „net” (CVE-2021-29923). Wbudowana funkcja net.ParseCIDR pomija zera początkowe przed liczbami ósemkowymi, zamiast je przetwarzać. Na przykład osoba atakująca może przekazać wartość 00000177.0.0.1, która po zaznaczeniu w funkcji net.ParseCIDR(00000177.0.0.1/24) zostanie przeanalizowana jako 177.0.0.1/24, a nie 127.0.0.1/24. Problem objawia się także na platformie Kubernetes. Luka została naprawiona w wersjach Go 1.16.3 i beta 1.17.

Luka w bibliotekach sieciowych języków Rust i Go, która pozwala ominąć weryfikację adresu IP


Źródło: opennet.ru

Dodaj komentarz