Zdalna luka w stosie OpenBSD IPv6

W tle procesu slaacd, który odpowiada za autokonfigurację adresów IPv6 (IPv6 Stateless Address Autoconfiguration, RFC 4862) w OpenBSD, zidentyfikowano lukę, która powoduje przepełnienie bufora po odebraniu specjalnie zaprojektowanego ogłoszenia routera IPv6 (RA, Router Advertisement) .

Początkowo funkcjonalność autokonfiguracji adresów IPv6 była implementowana na poziomie jądra, ale począwszy od OpenBSD 6.2 została przeniesiona do osobnego, nieuprzywilejowanego procesu slaacd. Proces ten odpowiada za wysyłanie komunikatów RS (Router Solicitation) i analizowanie odpowiedzi RA (Router Anvertisement) z informacjami o routerze i parametrach połączenia sieciowego.

W lutym slaacd naprawił błąd, który powodował awarię, jeśli na liście RDNSS (Recursive DNS Servers) zostało określonych 7 serwerów. To przeoczenie przyciągnęło uwagę niezależnych badaczy, którzy próbowali zbadać kod slaacd pod kątem innych błędów występujących podczas analizowania pól w komunikatach RA. Analiza wykazała, że ​​w kodzie występuje kolejny problem, który objawia się przetwarzaniem pola DNSSL (DNS Search List), które zawiera listy nazw domen i szablonów hostów dla DNS.

Każda nazwa na liście DNSSL jest kodowana przy użyciu separatora wartości null i znajdujących się pomiędzy nią jednobajtowych znaczników, które określają rozmiar następujących po niej danych. Podatność wynika z faktu, że w kodzie analizującym listę pole o określonym rozmiarze jest kopiowane do zmiennej o typie całkowitym ze znakiem („len = data[pos]”). Odpowiednio, jeśli w polu z ustawionym najbardziej znaczącym bitem zostanie podana wartość, wartość ta zostanie odebrana w operatorze warunkowym jako liczba ujemna i zostanie sprawdzona maksymalna dopuszczalna wielkość („if (len > 63 || len + pos + 1 > datalen) {“) nie zadziała, co doprowadzi do wywołania memcpy z parametrem, którego rozmiar kopiowanych danych przekracza rozmiar bufora.

Zdalna luka w stosie OpenBSD IPv6
Zdalna luka w stosie OpenBSD IPv6


Źródło: opennet.ru

Dodaj komentarz