Ang kahinaan sa OpenSMTPD na nagpapahintulot sa malayuang pagpapatupad ng code na may mga pribilehiyo sa ugat

Sa mail server na binuo ng proyekto ng OpenBSD OpenSMTPD nakilala kritikal na kahinaan (CVE-2020-7247), na nagbibigay-daan sa iyong malayuang magsagawa ng mga shell command sa server na may mga karapatan sa root user. Natukoy ang kahinaan sa panahon ng muling pag-audit na isinagawa ng Qualys Security (nakaraang pag-audit ng OpenSMTPD ay natupad noong 2015, at ang bagong kahinaan ay naroroon mula noong Mayo 2018). Problema inalis sa OpenSMTPD 6.6.2 release. Ang lahat ng mga gumagamit ay inirerekomenda na agad na i-install ang update (para sa OpenBSD, ang patch ay maaaring mai-install sa pamamagitan ng syspatch).

Dalawang pagpipilian sa pag-atake ang iminungkahi. Gumagana ang unang opsyon sa default na configuration ng OpenSMTPD (pagtanggap lamang ng mga kahilingan mula sa localhost) at pinapayagan kang gamitin ang problema nang lokal, kapag na-access ng attacker ang local network interface (loopback) sa server (halimbawa, sa mga hosting system) . Ang pangalawang opsyon ay nangyayari kapag ang OpenSMTPD ay na-configure upang makatanggap ng mga panlabas na kahilingan sa network (isang mail server na tumatanggap ng third-party na mail). Ang mga mananaliksik ay naghanda ng isang prototype ng isang pagsasamantala na matagumpay na gumagana sa bersyon ng OpenSMTPD na kasama sa OpenBSD 6.6 at sa isang portable na bersyon para sa iba pang mga operating system (isinasagawa sa Debian Testing).

Ang problema ay sanhi ng isang error sa smtp_mailaddr() function, na tinatawag upang suriin ang kawastuhan ng mga halaga sa "MAIL FROM" at "RCPT TO" na mga patlang na tumutukoy sa nagpadala/tatanggap at ipinapasa sa panahon ng koneksyon gamit ang mail server. Upang suriin ang bahagi ng email address na nauuna sa simbolo na "@", ang smtp_mailaddr() function ay tinatawag
valid_localpart(), na tumatanggap ng (MAILADDR_ALLOWED) ng mga character na "!#$%&'*/?^`{|}~+-=_", ayon sa kinakailangan ng RFC 5322.

Sa kasong ito, ang direktang pagtakas ng string ay ginagawa sa mda_expand_token() function, na pumapalit lang sa mga character na β€œ!#$%&’*?`{|}~” (MAILADDR_ESCAPE). Kasunod nito, ang linyang inihanda sa mda_expand_token() ay ginagamit kapag tumatawag sa delivery agent (MDA) gamit ang command na 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . Sa kaso ng paglalagay ng mga titik sa mbox sa pamamagitan ng /bin/sh, ang linyang β€œ/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” ay inilunsad, kung saan ang value na β€œ% Kasama sa {mbox.from}” ang na-escape na data mula sa parameter na "MAIL FROM."

Ang esensya ng kahinaan ay ang smtp_mailaddr() ay may lohikal na error, dahil kung saan, kung ang isang walang laman na domain ay ipinadala sa email, ang function ay nagbabalik ng matagumpay na verification code, kahit na ang bahagi ng address bago ang "@" ay naglalaman ng mga hindi wastong character . Dagdag pa, kapag naghahanda ng isang string, ang function na mda_expand_token() ay hindi makakatakas sa lahat ng posibleng mga espesyal na character ng shell, ngunit tanging mga espesyal na character ang pinapayagan sa email address. Kaya, upang patakbuhin ang iyong utos, sapat na gamitin ang simbolo na ";" sa lokal na bahagi ng email. at space, na hindi kasama sa MAILADDR_ESCAPE set at hindi na-escape. Halimbawa:

$nc 127.0.0.1 25

HELO propesor.falken
MAIL MULA kay:
RCPT TO:
DATA
.
Umalis

Pagkatapos ng session na ito, ang OpenSMTPD, kapag naihatid sa mbox, ay ilulunsad ang command sa pamamagitan ng shell

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

Kasabay nito, ang mga posibilidad ng pag-atake ay limitado sa katotohanan na ang lokal na bahagi ng address ay hindi maaaring lumampas sa 64 na mga character, at ang mga espesyal na character na '$' at '|' ay pinalitan ng ":" kapag tumakas. Upang lampasan ang limitasyong ito, ginagamit namin ang katotohanan na ang katawan ng liham ay ipinadala pagkatapos tumakbo /usr/libexec/mail.local sa pamamagitan ng input stream, i.e. Sa pamamagitan ng pagmamanipula sa address, maaari mo lamang ilunsad ang sh command interpreter at gamitin ang katawan ng liham bilang isang set ng mga tagubilin. Dahil ang mga service SMTP header ay nakasaad sa simula ng sulat, iminumungkahi na gamitin ang read command sa isang loop upang laktawan ang mga ito. Ang isang gumaganang pagsasamantala ay mukhang ganito:

$nc 192.168.56.143 25

HELO propesor.falken
MAIL MULA SA:
RCPT SA:[protektado ng email]>
DATA
#0
#1
...
#d
para sa i sa W O P R; gawin
echo -n "($i) " && id || pahinga
tapos na > /root/x."`id -u`.""$$"
.
Umalis

Pinagmulan: opennet.ru

Magdagdag ng komento