Luki w zabezpieczeniach smtpd, ldapd i Radid umożliwiające eskalację uprawnień i obejście uwierzytelniania OpenBSD

Firma Qualis ujawnił cztery luki w zabezpieczeniach w OpenBSD, z czego jeden pozwala na zdalne łączenie się bez uwierzytelniania z niektórymi usługami sieciowymi, a pozostałe trzy zwiększają Twoje uprawnienia w systemie. Raport Qualys odnotował szybką reakcję twórców OpenBSD – wszystkie problemy zostały rozwiązane wyłączony в OpenBSD 6.5 и OpenBSD 6.6 w ciągu 40 godzin od prywatnego powiadomienia.

Luka możliwa do wykorzystania zdalnie jest spowodowana błędem w wywoływaniu procedury uwierzytelniania w bibliotece libc, która wywołuje
program /usr/libexec/auth/login_style przekazuje argumenty w wierszu poleceń. Również podczas wywoływania login_style przy użyciu opcjonalnego parametru „-s service” możliwe jest przesłanie nazwy protokołu. Jeśli użyjesz znaku „-” na początku nazwy użytkownika, nazwa ta będzie traktowana jako opcja podczas uruchamiania login_style. Odpowiednio, jeśli podczas uwierzytelniania podasz „-schallenge” lub „-schallenge:passwd” jako nazwę użytkownika, login_style potraktuje żądanie jako żądanie użycia procedury obsługi Klawisz S.

Problem polega na tym, że protokół S/Key w stylu_logowania jest obsługiwany tylko formalnie, ale w rzeczywistości jest ignorowany wraz ze znakiem pomyślnego uwierzytelnienia. W ten sposób osoba atakująca może podszywając się pod użytkownika „-challenge” ominąć uwierzytelnianie i uzyskać dostęp bez podawania hasła lub kluczy. Problem może potencjalnie dotyczyć wszystkich usług sieciowych korzystających ze standardowych wywołań biblioteki libc do uwierzytelniania. Na przykład możliwość ominięcia uwierzytelniania jest obsługiwana w smtpd (AUTH PLAIN), ldapd i Radiad.

Luka nie występuje w sshd, gdyż posiada ona dodatkowe zabezpieczenie sprawdzające obecność użytkownika w systemie. Jednakże sshd można wykorzystać do przetestowania podatności systemu - podczas uzyskiwania dostępu do nazwy użytkownika „-sresponse:passwd” połączenie zawiesza się, ponieważ sshd czeka, aż login_passwd zwróci parametry wyzwania, a login_passwd czeka na brakujące parametry zostać przesłane (nazwa „- odpowiedź” traktowana jest jako opcja). Lokalny atakujący mógłby potencjalnie spróbować ominąć uwierzytelnianie w narzędziu su, ale przekazanie nazwy „-sresponse” powoduje awarię procesu poprzez zwrócenie wskaźnika zerowego podczas wykonywania funkcji getpwnam_r("-schallenge", ...).

Inne luki:

  • CVE-2019-19520 Lokalna eskalacja uprawnień poprzez manipulację narzędziem xlock dostarczonym z flagą sgid zmieniającą grupę na „auth”. W kodzie xlock redefiniowanie ścieżek do bibliotek jest zabronione tylko w przypadku zmiany identyfikatora użytkownika (setuid), co umożliwia atakującemu zmianę zmiennej środowiskowej „LIBGL_DRIVERS_PATH” i zorganizowanie ładowania jego biblioteki współdzielonej, której kod zostanie wykonany po podniesieniu uprawnień do grupy „auth”.
  • CVE-2019-19522 — umożliwia użytkownikowi lokalnemu będącemu członkiem grupy „auth” uruchamianie kodu jako root, gdy w systemie włączone jest uwierzytelnianie S/Key lub YubiKey (domyślnie nieaktywne). Dołączenie do grupy „auth”, do której można uzyskać dostęp wykorzystując wspomnianą wyżej lukę w xlocku, pozwala na zapisywanie plików do katalogów /etc/skey i /var/db/yubikey. Na przykład osoba atakująca może dodać nowy plik /etc/skey/root w celu wygenerowania jednorazowych kluczy do uwierzytelnienia jako użytkownik root za pośrednictwem S/Key.
  • CVE-2019-19519 – możliwość zwiększenia limitów zasobów poprzez manipulację narzędziem su. W przypadku podania opcji -L, która powoduje cykliczne powtarzanie prób uwierzytelnienia w przypadku niepowodzenia, klasa użytkownika jest ustawiana tylko raz i nie jest resetowana przy kolejnych próbach. Osoba atakująca może wykonać polecenie „su -l -L” przy pierwszej próbie wprowadzenia cudzego loginu przy użyciu innej klasy konta, ale przy drugiej próbie może pomyślnie uwierzytelnić się jako on sam. W tej sytuacji na użytkownika zostaną nałożone ograniczenia oparte na klasie użytkownika określonej przy pierwszej próbie (na przykład maksymalnej liczbie procesów lub rozmiarze pamięci procesu). Metoda działa tylko w przypadku pożyczania limitów od nieuprzywilejowanych użytkowników, ponieważ użytkownik root musi należeć do grupy kołowej).

Dodatkowo można to zauważyć realizacja w OpenBSD nowa metoda sprawdzania ważności wywołań systemowych, co dodatkowo komplikuje wykorzystanie luk. Metoda umożliwia wykonywanie wywołań systemowych tylko wtedy, gdy dostęp do nich odbywa się z wcześniej zarejestrowanych obszarów pamięci. Aby oznaczyć obszary pamięci proponowane nowe wywołanie systemowe msyscall().

Źródło: opennet.ru