Zelalbûna di OpenSMTPD de ku destûrê dide darvekirina kodê ji dûr ve bi îmtiyazên root

Di servera nameyê de ku ji hêla projeya OpenBSD ve hatî pêşve xistin OpenSMTPD nas kirin lawazbûna krîtîk (CVE-2020-7247), ku destûrê dide te ku hûn ji dûr ve fermanên şêlê li ser serverê bi mafên bikarhênerê root re bicîh bikin. Zelalbûn di dema vekolînek ku ji hêla Qualys Security ve hatî kirin de hate nas kirin (kontrola berê ya OpenSMTPD pêk hat di 2015-an de, û qelsiya nû ji Gulana 2018-an vir ve heye). Pirsegirêk tasfiye kirin di serbestberdana OpenSMTPD 6.6.2 de. Ji hemî bikarhêneran re tê pêşniyar kirin ku tavilê nûvekirinê saz bikin (ji bo OpenBSD, patch dikare bi syspatch ve were saz kirin).

Du vebijarkên êrîşê têne pêşniyar kirin. Vebijarka yekem di veavakirina OpenSMTPD-ya xwerû de dixebite (tenê daxwaznameyên ji localhost qebûl dike) û dihêle hûn pirsgirêkê herêmî bi kar bînin, dema ku êrîşkar karibe xwe bigihîne navgîniya torê ya herêmî (loopback) li ser serverê (mînak, li ser pergalên mêvandariyê) . Vebijarka duyemîn diqewime dema ku OpenSMTPD ji bo wergirtina daxwazên torê yên derveyî tête mîheng kirin (pêşkêşkerek e-nameyê ku nameya sêyemîn qebûl dike). Lekolînwanan prototîpek îstismarek amade kirine ku hem bi guhertoya OpenSMTPD-ya ku di OpenBSD 6.6-ê de tê de heye hem jî bi guhertoyek portable ji bo pergalên xebitandinê yên din (di Testkirina Debian de hatî kirin) bi serfirazî dixebite.

Pirsgirêk ji ber xeletiyek di fonksiyona smtp_mailaddr() de ye, ku tê gotin ku rastbûna nirxên di qadên "MAIL JI" û "RCPT TO" yên ku şander / wergir diyar dikin û di dema pêwendiyê de derbas dibin kontrol bikin. bi servera nameyê. Ji bo kontrolkirina beşa navnîşana e-nameyê ya ku berî sembola "@" tê, fonksiyona smtp_mailaddr() tê gotin.
valid_localpart(), ku (MAILADDR_ALLOWED) tîpên "!#$%&'*/?^`{|}~+-=_", wekî ku ji hêla RFC 5322 ve tê xwestin qebûl dike.

Di vê rewşê de, revîna rasterast a rêzikê di fonksiyona mda_expand_token() de tê kirin, ku tenê tîpên "!#$%&'*?`{|}~" (MAILADDR_ESCAPE) diguherîne. Dûv re, rêza ku di mda_expand_token() de hatî amadekirin, dema ku gazî nûnerê radestkirinê (MDA) dike bi fermana 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . Di rewşa danîna tîpên mbox bi rêya /bin/sh de, rêza "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" tê destpêkirin, li wir nirxa "% {mbox.from}” daneyên reviyayî yên ji parametreya "MAIL FROM" vedihewîne.

Esasê lawaziyê ev e ku smtp_mailaddr() xwedan xeletiyek mentiqî ye, ji ber vê yekê, ger domainek vala ji e-nameyê re were şandin, fonksiyon kodek verastkirinê ya serketî vedigerîne, tewra heke beşa navnîşana berî "@" karakterên nederbasdar hebe. . Zêdetir, dema ku rêzek amade dike, fonksiyona mda_expand_token() ji hemî karakterên taybetî yên şêlê ya mimkun dernakeve, lê tenê karakterên taybetî yên ku di navnîşana e-nameyê de têne destûr kirin. Bi vî rengî, ji bo ku emrê xwe bimeşînin, bes e ku hûn di beşa herêmî ya e-nameyê de nîşana ";" bikar bînin. û cîh, ku di nav set MAILADDR_ESCAPE de ne û jê nerevin. Bo nimûne:

$nc 127.0.0.1 25

HELO profesor.falken
POSTE JI:<;xew 66;>
RCPT JI BO:
JIMARE
.
DEVJÊBERDAN

Piştî vê danişînê, OpenSMTPD, gava ku ji mbox re were radest kirin, dê fermanê bi şêlê bide destpêkirin

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

Di heman demê de, îmkanên êrîşê ji ber vê yekê sînorkirî ne ku beşa herêmî ya navnîşanê ji 64 tîpan derbas nabe, û karakterên taybetî '$' û '|' Dema ku direvin bi ":" têne guhertin. Ji bo ku em vê sînordariyê derbas bikin, em vê rastiyê bikar tînin ku laşê nameyê piştî ku /usr/libexec/mail.local bi rêka têketinê ve tê veguheztin, yanî. Bi manîpulekirina navnîşanê, hûn dikarin tenê wergêra fermana sh bidin destpêkirin û laşê nameyê wekî komek rêwerzan bikar bînin. Ji ber ku sernavên SMTP-ê yên karûbar di destpêka nameyê de têne destnîşan kirin, tê pêşniyar kirin ku emrê xwendinê di xelekekê de bikar bînin da ku wan derbas bikin. Karûbarek xebitandinê tiştek bi vî rengî xuya dike:

$nc 192.168.56.143 25

HELO profesor.falken
POSTE JI:<;ji bo ez di 0 1 2 3 4 5 6 7 8 9 abcd;bixwînin r;kirin;sh;derketin 0;>
RCPT JI BO:[email parastî]>
JIMARE
#0
#1
...
#d
ji bo ez di WOPR de; bikin
echo -n "($i) " && id || rawesta
kirin > /root/x."`id -u`.""$$"
.
DEVJÊBERDAN

Source: opennet.ru

Add a comment