I det udviklede OpenBSD mailserverprojekt opdaget (CVE-2020-7247), som gør det muligt at udføre shell-kommandoer på serveren med root-brugerrettigheder. Sårbarheden blev identificeret under en genaudit udført af Qualys Security (den tidligere audit af OpenSMTPD i 2015, og den nye sårbarhed har været til stede siden maj 2018). Problemet findes i OpenSMTPD version 6.6.2. Alle brugere anbefales straks at installere opdateringen (for OpenBSD kan rettelsen installeres via syspatch).
Der er foreslået to angrebsmetoder. Den første metode fungerer i standardkonfigurationen af OpenSMTPD (modtagelse af anmodninger kun fra localhost) og tillader udnyttelse af problemet lokalt, når en angriber har mulighed for at tilgå det lokale netværksinterface (loopback) på serveren (for eksempel på hosting-systemer). Den anden metode manifesterer sig, når OpenSMTPD er konfigureret til at modtage eksterne netværksanmodninger (en mailserver, der modtager ekstern mail). Forskerne har forberedt en prototype af et exploit, der fungerer både med OpenSMTPD-varianten fra OpenBSD 6.6 og med en portabel version til andre operativsystemer (testet i Debian Testing).
Problemet skyldes en fejl i funktionen smtp_mailaddr(), der kaldes for at validere værdierne i felterne "MAIL FROM" og "RCPT TO", som definerer afsender/modtager og sendes under forbindelsen til mailserveren. For at validere delen af mailadressen, der kommer før "@", kaldes funktionen valid_localpart() i smtp_mailaddr(), som anser symbolerne "!#$%&’*\/?.^`{|}~+-=_" for at være gyldige (MAILADDR_ALLOWED) i overensstemmelse med kravene i RFC 5322.
I denne proces sker undersøgelsen af strengen i funktionen mda_expand_token(), som kun erstatter symbolerne "!#$%&’*?`{|}~" (MAILADDR_ESCAPE). Den efterfølgende streng, der er forberedt i mda_expand_token(), bruges ved opkald til leveringsagenten (MDA) ved hjælp af kommandoen ‘execle("\/bin\/sh", "\/bin\/sh", "-c", mda_command,…’. I tilfælde af at placere en mail i mbox via \/bin\/sh køres strengen "\/usr\/libexec\/mail.local -f %%{mbox.from} %%{user.username}", hvor værdien "%{mbox.from}" inkluderer den escaperede data fra parameteren "MAIL FROM".
Herudover bliver den direkte escaping af strengen udført i funktionen mda_expand_token(), som kun erstatter tegnene '!#$%&’*?`{|}~' (MAILADDR_ESCAPE). Senere bruges den forberedte streng fra mda_expand_token() ved kald af delivery agent (MDA) gennem kommandoen 'execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. Når en mail placeres i mbox gennem /bin/sh, sættes strengen "'/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", hvor værdien '%{mbox.from}' inkluderer escaperede data fra parameteren 'MAIL FROM'.
Essensen af sårbarheden er, at smtp_mailaddr() har en logisk fejl, der gør, at når et tomt domæne sendes i e-mailen, returnerer funktionen en succesfuld valideringskode, selvom delen af adressen før "@" indeholder ugyldige tegn. Når strengen forberedes af funktionen mda_expand_token(), er det ikke alle mulige specielle shell-tegn, der bliver rømmet, men kun de specielle tegn, der er tilladt i e-mailadressen. Dermed er det tilstrækkeligt at bruge symbolet ";" og et mellemrum i lokaldelen af e-mailen, som ikke er en del af MAILADDR_ESCAPE og ikke bliver rømmet. For eksempel:
$ nc 127.0.0.1 25
HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT
Efter denne session vil OpenSMTPD ved levering til mbox køre kommandoen gennem shell
/usr/libexec/mail.local -f ;sleep 66; root
Her er angrebsmulighederne begrænset til, at lokaldelen af adressen ikke må overstige 64 tegn, og specielle tegn som ‘$’ og ‘|’ bliver erstattet med ":" ved rømning. For at omgå denne begrænsning er det udnyttet, at e-mailens krop sendes efter opstarten af \/usr\/libexec\/mail.local gennem inddataflowet, dvs. gennem manipulation med adressen kan man kun starte kommandotolkeren sh og bruge e-mailens krop som en række instruktioner. Da der i begyndelsen af e-mailen angives SMTP-header, foreslås det at bruge kommandoen read i en løkke for at springe dem over. Den fungerende exploit ser cirka sådan ud:
$ 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>
DATA
#0
#1
…
#d
for i in W O P R; do
echo -n «($i) » && id || break
done > \/root\/x.»`id -u`».»$$»
.
QUIT
Kilde: opennet.ru
