OpenSMTPD-da ildiz huquqlari bilan masofadan kodni bajarishga imkon beruvchi zaiflik

OpenBSD loyihasi tomonidan ishlab chiqilgan pochta serverida OpenSMTPD aniqlangan tanqidiy zaiflik (CVE-2020-7247), bu ildiz foydalanuvchi huquqlariga ega serverda qobiq buyruqlarini masofadan turib bajarish imkonini beradi. Zaiflik Qualys Security (oldingi OpenSMTPD auditi) tomonidan o'tkazilgan qayta audit davomida aniqlangan. amalga oshirildi 2015 yilda va yangi zaiflik 2018 yil may oyidan beri mavjud). Muammo bartaraf etildi OpenSMTPD 6.6.2 versiyasida. Barcha foydalanuvchilarga yangilanishni darhol o'rnatish tavsiya etiladi (OpenBSD uchun yamoq syspatch orqali o'rnatilishi mumkin).

Ikkita hujum varianti taklif etiladi. Birinchi variant standart OpenSMTPD konfiguratsiyasida ishlaydi (faqat localhost-dan so'rovlarni qabul qiladi) va tajovuzkor serverdagi (masalan, hosting tizimlarida) mahalliy tarmoq interfeysiga (qayta tiklash) kirish imkoniga ega bo'lganda muammoni mahalliy sifatida ishlatishga imkon beradi. . Ikkinchi variant OpenSMTPD tashqi tarmoq so'rovlarini (uchinchi tomon xatlarini qabul qiluvchi pochta serveri) qabul qilish uchun sozlanganda paydo bo'ladi. Tadqiqotchilar OpenBSD 6.6 ga kiritilgan OpenSMTPD versiyasi va boshqa operatsion tizimlar uchun portativ versiya (Debian testida o‘tkazilgan) bilan muvaffaqiyatli ishlaydigan ekspluatatsiya prototipini tayyorladilar.

Muammo smtp_mailaddr() funksiyasidagi xatolik tufayli yuzaga keladi, u “MAIL FROM” va “RCPT TO” maydonlaridagi qiymatlarning toʻgʻriligini tekshirish uchun chaqiriladi va joʻnatuvchi/oluvchini belgilaydi va ulanish vaqtida uzatiladi. pochta serveri bilan. Elektron pochta manzilining “@” belgisidan oldin kelgan qismini tekshirish uchun smtp_mailaddr() funksiyasi chaqiriladi.
valid_localpart(), u RFC 5322 talabiga binoan "!#$%&'*/?^`{|}~+-=_" belgilarini (MAILADDR_ALLOWED) qabul qiladi.

Bunday holda, satrdan to'g'ridan-to'g'ri qochish mda_expand_token() funksiyasida amalga oshiriladi, u faqat “!#$%&'*?`{|}~” (MAILADDR_ESCAPE) belgilarini almashtiradi. Keyinchalik, mda_expand_token() da tayyorlangan qator 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' buyrug'i yordamida yetkazib berish agentiga (MDA) qo'ng'iroq qilishda ishlatiladi. Mbox-ga harflar /bin/sh orqali kiritilganda, “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” qatori ishga tushiriladi, bu yerda “%” qiymati {mbox.from}” “MAIL FROM” parametridan oʻchirilgan maʼlumotlarni oʻz ichiga oladi.

Zaiflikning mohiyati shundan iboratki, smtp_mailaddr() mantiqiy xatolikka ega, buning natijasida agar bo'sh domen elektron pochtaga yuborilsa, manzilning "@" dan oldingi qismida noto'g'ri belgilar bo'lsa ham funktsiya muvaffaqiyatli tasdiqlash kodini qaytaradi. . Bundan tashqari, satrni tayyorlashda mda_expand_token() funksiyasi barcha mumkin bo'lgan qobiq maxsus belgilaridan qochib qutula olmaydi, lekin faqat elektron pochta manzilida ruxsat etilgan maxsus belgilar. Shunday qilib, buyruqni bajarish uchun elektron pochtaning mahalliy qismida ";" belgisini ishlatish kifoya. va bo'sh joy, ular MAILADDR_ESCAPE to'plamiga kiritilmagan va tashqariga chiqmagan. Masalan:

$nc 127.0.0.1 25

SALOM professor.falken
PATTA:<;sleep 66;>
RCPT TO:
DATA
.
QUIT

Ushbu seansdan so'ng, OpenSMTPD, mbox-ga yetkazilganda, qobiq orqali buyruqni ishga tushiradi

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

Shu bilan birga, hujum imkoniyatlari manzilning mahalliy qismi 64 belgidan oshmasligi va maxsus belgilar "$" va "|" bilan cheklangan. qochganda ":" bilan almashtiriladi. Ushbu cheklovni chetlab o'tish uchun biz /usr/libexec/mail.local ni kirish oqimi orqali ishga tushirgandan so'ng, harfning tanasi uzatilishidan foydalanamiz, ya'ni. Manzilni manipulyatsiya qilish orqali siz faqat sh buyrug'i tarjimonini ishga tushirishingiz va harfning tanasini ko'rsatmalar to'plami sifatida ishlatishingiz mumkin. Xizmatning SMTP sarlavhalari xat boshida ko'rsatilganligi sababli, ularni o'tkazib yuborish uchun tsiklda o'qish buyrug'idan foydalanish tavsiya etiladi. Ishlaydigan ekspluatatsiya quyidagicha ko'rinadi:

$nc 192.168.56.143 25

SALOM professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;o'qing r;done;sh;chiqish 0;>
RCPT TO:[elektron pochta bilan himoyalangan]>
DATA
#0
#1
...
#d
WOPRda men uchun; qilmoq
echo -n "($i) " && id || tanaffus
bajarildi > /root/x."`id -u`.""$$"
.
QUIT

Manba: opennet.ru

a Izoh qo'shish