Sårbarhet i OpenSMTPD som tillåter fjärrkörning av kod med root-privilegier

I e-postservern utvecklad av OpenBSD-projektet Öppna SMTPD identifieras kritisk sårbarhet (CVE-2020-7247), som låter dig utföra skalkommandon på servern med root-användarrättigheter. Sårbarheten identifierades under en ny granskning utförd av Qualys Security (föregående OpenSMTPD-revision hölls 2015, och den nya sårbarheten har funnits sedan maj 2018). Problem utslagen i OpenSMTPD 6.6.2-versionen. Alla användare rekommenderas att omedelbart installera uppdateringen (för OpenBSD kan patchen installeras via syspatch).

Två attackalternativ föreslås. Det första alternativet fungerar i standardkonfigurationen för OpenSMTPD (accepterar endast förfrågningar från localhost) och låter dig utnyttja problemet lokalt, när angriparen kan komma åt det lokala nätverksgränssnittet (loopback) på servern (till exempel på värdsystem) . Det andra alternativet uppstår när OpenSMTPD är konfigurerad för att ta emot externa nätverksbegäranden (en e-postserver som accepterar e-post från tredje part). Forskare har förberett en prototyp av en exploatering som fungerar framgångsrikt både med OpenSMTPD-versionen som ingår i OpenBSD 6.6 och med en bärbar version för andra operativsystem (som genomförs i Debian Testing).

Problemet orsakas av ett fel i smtp_mailaddr()-funktionen, som anropas för att kontrollera korrektheten av värdena i fälten "MAIL FROM" och "RCPT TO" som definierar avsändaren/mottagaren och skickas under anslutningen med e-postservern. För att kontrollera den del av e-postadressen som kommer före "@"-symbolen, anropas smtp_mailaddr()-funktionen
valid_localpart(), som accepterar (MAILADDR_ALLOWED) tecknen "!#$%&'*/?^`{|}~+-=_", som krävs av RFC 5322.

I det här fallet utförs direkt escape av strängen i funktionen mda_expand_token() som endast ersätter tecknen "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Därefter används raden förberedd i mda_expand_token() när leveransagenten (MDA) anropas med kommandot 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . Om bokstäver ska placeras till mbox via /bin/sh, startas raden "/usr/libexec/mail.local -f %%{mbox.from} %%{användar.användarnamn}", där värdet "% {mbox.from}” inkluderar escaped data från parametern "MAIL FROM".

Kärnan i sårbarheten är att smtp_mailaddr() har ett logiskt fel, på grund av vilket, om en tom domän skickas till e-post, returnerar funktionen en framgångsrik verifieringskod, även om delen av adressen före "@" innehåller ogiltiga tecken . Vidare, när du förbereder en sträng, undviker funktionen mda_expand_token() inte alla möjliga skalspecialtecken, utan endast specialtecken tillåtna i e-postadressen. För att köra ditt kommando räcker det alltså att använda symbolen ";" i den lokala delen av e-postmeddelandet. och utrymme, som inte ingår i MAILADDR_ESCAPE-uppsättningen och inte är escaped. Till exempel:

$nc 127.0.0.1 25

HELO professor.falken
POST FRÅN:<;sömn 66;>
RCPT TILL:
DATA
.
SLUTA

Efter denna session kommer OpenSMTPD, när den levereras till mbox, att starta kommandot genom skalet

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

Samtidigt begränsas attackmöjligheterna av att den lokala delen av adressen inte kan överstiga 64 tecken, och specialtecknen '$' och '|' ersätts med ":" vid escape. För att kringgå denna begränsning använder vi det faktum att brevets brödtext sänds efter att /usr/libexec/mail.local körts genom inmatningsströmmen, dvs. Genom att manipulera adressen kan du bara starta kommandotolken sh och använda brevets brödtext som en uppsättning instruktioner. Eftersom tjänst SMTP-rubriker anges i början av bokstaven, föreslås det att du använder läskommandot i en loop för att hoppa över dem. En fungerande exploit ser ut ungefär så här:

$nc 192.168.56.143 25

HELO professor.falken
MAIL FRÅN:<;för i in 0 1 2 3 4 5 6 7 8 9 abcd;läs ​​r;done;sh;exit 0;>
RCPT TILL:[e-postskyddad]>
DATA
#0
#1
.
#d
för i i WOPR; do
echo -n "($i) " && id || ha sönder
klar > /root/x."`id -u`.""$$"
.
SLUTA

Källa: opennet.ru

Lägg en kommentar