OpenBSD layihəsində inkişaf etdirilən poçt serveri kəşf edilib (CVE-2020-7247), serverdə root istifadəçi hüquqları ilə shell komandalarının uzaqdan icrasına imkan verən bir zəiflik. Zəiflik, Qualys Security şirkəti tərəfindən aparılmış təkrar audit zamanı aşkar edilib (keçmiş audit OpenSMTPD OpenSMTPD 6.6.2 versiyasındadır. Bütün istifadəçilərə dərhal yamanın quraşdırılması tövsiyə edilir (OpenBSD üçün düzəlişi syspatch vasitəsilə quraşdırmaq olar). İki hücum variantı təklif edilmişdir. Birinci variant, OpenSMTPD-nin standart konfiqurasiyasında (yalnız localhost-dan sorğuları qəbul etməsi) işləyir və hücumçunun serverdəki lokal şəbəkə interfeysinə (loopback) müraciət etməsinə imkan tanıyır (məsələn, hosting sistemlərində). İkinci variant, OpenSMTPD xarici şəbəkə sorğularını qəbul etmək üçün konfiqurasiya edildikdə baş verir (üçüncü tərəf poçtunu qəbul edən poçt serveri). Tədqiqatçılar, OpenBSD 6.6-dakı OpenSMTPD versiyası ilə yanaşı, digər əməliyyat sistemləri üçün portativ versiya ilə də uğurlu işləyən bir exploit prototipi hazırlamışdır (Debian Testing-də həyata keçirilmişdir).
Problemin səbəbi smtp_mailaddr() funksiyasında olan bir səhvdir ki, bu da "MAIL FROM" və "RCPT TO" sahələrindəki dəyərlərin düzgünlüyünü yoxlamaq üçün çağırılır. Bu sahələr göndərən/alanı müəyyən edir və poçt serveri ilə əlaqə zamanı ötürülür. Poçt ünvanının "@" simvolundan əvvəlki hissəsinin yoxlanılması üçün smtp_mailaddr() funksiyasında
valid_localpart() funksiyası çağırılır, bu da RFC 5322 tələblərinə uyğun olaraq (MAILADDR_ALLOWED) "!#$%&’*\/?”^`{|}~-+=_" simvollarını qəbul edir.
Bu zaman, bilavasitə mətnin ekranda saxlanılması mda_expand_token() funksiyasında həyata keçirilir ki, bu da yalnız "!#$%&’*?`{|}~" (MAILADDR_ESCAPE) simvollarını dəyişir. Daha sonra, mda_expand_token() funksiyasında hazırlanan mətn kanan gətirilən agent vasitəsilə (MDA) ‘execle("\/bin\/sh", "\/bin\/sh", "-c", mda_command,…’ komutları ilə istifadə edilir. Məktubu mbox formatında saxlamaq məqsədilə, /bin/sh vasitəsilə "\/usr\/libexec\/mail.local -f %%{mbox.from} %%{user.username}" həcmdə yerinə yetirilir, burada "%%{mbox.from}" dəyəri "MAIL FROM" parametrindən alınmış ekranda saxlanılmış məlumatlarını əhatə edir.
При этом непосредственное экранирование строки производится в функции 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».
Həssaslıq, smtp_mailaddr() funksiyasının bozuca bir xətası olduğu ilə bağlıdır ki, bu da boş bir domen göndərildikdə, funksiyanın müvəffəqiyyətli yoxlama kodu qaytarır, hətta «@» simvolundan əvvəlki adres hissəsi qadağan olunmuş simvolları ehtiva edirsə. Sonradan mda_expand_token() funksiyası ilə string hazırlanarkən yalnız poçt adresində icazə verilən xüsusi simvolların qaçışını təmin edir, digər mümkün shell xüsusi simvolları isə istisna olunur. Beləliklə, yalnız «;» və boşluq simvollarını e-poçt adresinin yerində istifadə edərək komandanızı işə sala bilərsiniz, çünki bunlar MAILADDR_ESCAPE dəstinə daxil deyil və qaçış edilmir. Məsələn:
$ nc 127.0.0.1 25
HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT
Bu sessiyadan sonra OpenSMTPD, mbox-a çatdırılma zamanı shell komandası işə salacaq.
/usr/libexec/mail.local -f ;sleep 66; root
Bu halda, hücum imkanları, e-poçt adresinin yerli hissəsinin 64 simvoldan çox ola bilməməsi və ‘$’ və ‘|’ xüsusi simvollarının qaçış zamanı «:» ilə əvəz edilməsilə məhdudlaşır. Bu məhdudiyyəti aşmaq üçün istifadə olunan fakt, e-poçtun mətni /usr/libexec/mail.local işə salındıqdan sonra giriş axını vasitəsilə göndərildiyidir, yəni adreslə manipulyasiya edərək yalnız komanda icracısı sh-nı işə sala və e-poçt mətni ilə təlimat dəsti kimi istifadə edə bilərsiniz. E-poçt başında xidmət SMTP başlıqları qeyd olunduğundan, onları atlamaq üçün dövr içində read komandasını istifadə etmək təklif edilir. İşə yarayan exploiter təxminən aşağıdakı şəkildə görünür:
$ 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
Mənbə: opennet.ru
