Luka w bibliotekach sieciowych języków Rust i Go, umożliwiająca obejście weryfikacji adresów IP

W standardowych bibliotekach języków Rust i Go zidentyfikowano luki bezpieczeństwa związane z nieprawidłowym przetwarzaniem adresów IP zawierających cyfry ósemkowe w funkcjach analizy adresów. Luki te umożliwiają obejście kontroli poprawności adresów w aplikacjach, na przykład w celu skierowania zapytań do adresów interfejsu loopback (127.x.x.x) lub intranetowych podsieci podczas ataków SSRF (Server-side request forgery). Luki te kontynuują cykl problemów wcześniej zidentyfikowanych 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) oraz Net::Netmask (Perl, CVE-2021-29424).

Zgodnie ze specyfikacją wartości ciągów adresów IP, zaczynające się od zera, powinny być interpretowane jako liczby ósemkowe, jednak wiele bibliotek nie uwzględnia tej cechy 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. Atakujący może zażądać zasobu, podając wartość „0177.0.0.1”, która w postaci dziesiętnej odpowiada „127.0.0.1”. W przypadku użycia problematycznej biblioteki, aplikacja nie rozpozna adresu 0177.0.0.1 w podsieci 127.0.0.1/8, ale faktycznie, wysyłając zapytanie, może zwrócić się do adresu „0177.0.0.1”, który funkcje sieciowe przetworzą jako 127.0.0.1. Podobnie można oszukać kontrolę dostępu do adresów intranetowych, podając wartości takie jak „012.0.0.1” (odpowiednik „10.0.0.1”).

W Rust problem dotyczy standardowej biblioteki „std::net” (CVE-2021-29922). Parser adresów IP tej biblioteki odrzucał zero przed wartościami w adresie, ale tylko w przypadku, gdy podano nie więcej niż trzy cyfry, na przykład „0177.0.0.1” zostanie uznane za wartość nieprawidłową, a w odpowiedzi na 010.8.8.8 i 127.0.026.1 zostanie zwrócony błędny wynik. Aplikacje wykorzystujące std::net::IpAddr podczas analizy adresów podanych przez użytkownika mogą być potencjalnie narażone na ataki SSRF (Server-side request forgery), RFI (Remote File Inclusion) i LFI (Local File Inclusion). Luka została usunięta w wersji Rust 1.53.0.

Luka w bibliotekach sieciowych języków Rust i Go, umożliwiająca obejście weryfikacji adresów IP

W języku Go na problem narażona jest standardowa biblioteka „net” (CVE-2021-29923). Wbudowana funkcja net.ParseCIDR pomija zera przed ósemkowymi liczbami, zamiast je przetwarzać. Na przykład, atakujący może przekazać wartość 00000177.0.0.1, która podczas sprawdzania w funkcji net.ParseCIDR(00000177.0.0.1/24) zostanie zinterpretowana jako 177.0.0.1/24, a nie 127.0.0.1/24. Problem objawia się również na platformie Kubernetes. Luka została usunięta w wersji Go 1.16.3 i wersji beta 1.17.

Luka w bibliotekach sieciowych języków Rust i Go, umożliwiająca obejście weryfikacji adresów IP
Odtwarzaj wideo


Źródło: opennet.ru
Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster