OpenSMTPD-ийн эмзэг байдал нь root эрхээр алсаас код гүйцэтгэх боломжийг олгодог

OpenBSD төслөөс боловсруулсан шуудангийн серверт OpenSMTPD тодорхойлсон чухал эмзэг байдал (CVE-2020-7247) нь үндсэн хэрэглэгчийн эрх бүхий сервер дээр бүрхүүлийн командуудыг алсаас гүйцэтгэх боломжийг олгодог. Энэ эмзэг байдлыг Qualys Security (өмнөх OpenSMTPD аудит)-аас хийсэн дахин аудитын үеэр илрүүлсэн. явуулсан 2015 онд гарсан бөгөөд шинэ эмзэг байдал 2018 оны XNUMX-р сараас хойш бий болсон). Асуудал хасагдсан OpenSMTPD 6.6.2 хувилбар дээр. Бүх хэрэглэгчдэд шинэчлэлтийг нэн даруй суулгахыг зөвлөж байна (OpenBSD-ийн хувьд нөхөөсийг syspatch-ээр суулгаж болно).

Довтолгооны хоёр хувилбарыг санал болгож байна. Эхний сонголт нь OpenSMTPD-ийн өгөгдмөл тохиргоонд ажилладаг (зөвхөн localhost-ын хүсэлтийг хүлээн авдаг) бөгөөд халдагч сервер дээрх дотоод сүлжээний интерфэйс (жишээ нь, хостинг систем дээр) хандах боломжтой үед асуудлыг дотооддоо ашиглах боломжийг олгодог. . Хоёрдахь сонголт нь OpenSMTPD-г гадаад сүлжээний хүсэлтийг (гуравдагч этгээдийн имэйлийг хүлээн авдаг шуудангийн сервер) хүлээн авахаар тохируулсан үед тохиолддог. Судлаачид OpenBSD 6.6-д багтсан OpenSMTPD хувилбар болон бусад үйлдлийн системд зориулсан зөөврийн хувилбартай (Debian-ийн туршилтаар явуулсан) хоёуланд нь амжилттай ажилладаг мөлжлөгийн прототипийг бэлтгэсэн байна.

Асуудал нь илгээгч/хүлээн авагчийг тодорхойлсон "MAIL FROM" ба "RCPT TO" талбар дахь утгуудын зөв эсэхийг шалгахын тулд дуудагдсан smtp_mailaddr() функцийн алдаанаас үүдэлтэй бөгөөд холболтын явцад дамжуулагдсан. шуудангийн сервертэй. Имэйл хаягийн "@" тэмдгийн өмнө байгаа хэсгийг шалгахын тулд smtp_mailaddr() функцийг дуудна.
valid_localpart() нь RFC 5322-ын шаардлагын дагуу "!#$%&'*/?^`{|}~+-=_" тэмдэгтүүдийг (MAILADDR_ALLOWED) хүлээн авдаг.

Энэ тохиолдолд мөрнөөс шууд зугтахыг mda_expand_token() функцэд гүйцэтгэдэг бөгөөд энэ нь зөвхөн “!#$%&’*?`{|}~” (MAILADDR_ESCAPE) тэмдэгтүүдийг орлуулдаг. Дараа нь mda_expand_token()-д бэлтгэсэн мөрийг 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' командыг ашиглан хүргэх агент (MDA) руу залгахад ашиглагддаг. . /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

HELO профессор.falken
ШУУД:
RCPT TO:
МЭДЭЭЛЛИЙН
.
татахаа больсон

Энэ сессийн дараа OpenSMTPD нь mbox-д хүргэх үед бүрхүүлээр дамжуулан тушаалыг ажиллуулна

/usr/libexec/mail.local -f ;sleep 66; үндэс

Үүний зэрэгцээ, хаягийн дотоод хэсэг нь 64 тэмдэгтээс хэтрэхгүй, зугтах үед '$' болон '|' тусгай тэмдэгтүүдийг ":" -ээр сольсон тул халдлагын боломж хязгаарлагдмал. Энэ хязгаарлалтыг тойрч гарахын тулд бид /usr/libexec/mail.local-ыг оролтын урсгалаар ажиллуулсны дараа үсгийн биеийг дамжуулдаг болохыг ашигладаг, өөрөөр хэлбэл. Хаягийг өөрчилснөөр та зөвхөн sh командын орчуулагчийг ажиллуулж, үсгийн хэсгийг зааврын багц болгон ашиглаж болно. Үйлчилгээний SMTP толгойг үсгийн эхэнд зааж өгсөн тул тэдгээрийг алгасахдаа унших командыг давталтаар ашиглахыг зөвлөж байна. Ажиллаж буй мөлжлөг нь дараах байдалтай харагдана.

$nc 192.168.56.143 25

HELO профессор.falken
MIL FROM:
RCPT TO:<[имэйлээр хамгаалагдсан]>
МЭДЭЭЛЛИЙН
#0
#1
...
#d
for i in W O P R; хийх
echo -n "($i) " && id || завсарлага
хийсэн > /root/x."`id -u`.""$$"
.
татахаа больсон

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх