Kerentanan dina OpenSMTPD anu ngamungkinkeun palaksanaan kode jauh kalayan hak husus root

Dina server mail dikembangkeun ku proyék OpenBSD OpenSMTPD dicirikeun kerentanan kritis (CVE-2020-7247), nu ngidinan Anjeun pikeun jarak jauh ngaéksekusi paréntah cangkang dina server kalawan hak pamaké root. Kerentanan ieu diidentifikasi nalika audit ulang anu dilakukeun ku Qualys Security (audit OpenSMTPD sateuacana. dilaksanakeun dina 2015, sareng kerentanan anyar parantos aya ti saprak Méi 2018). Masalah ngaleungitkeun dina OpenSMTPD 6.6.2 release. Sadaya pangguna disarankeun pikeun langsung masang apdet (pikeun OpenBSD, patch tiasa dipasang via syspatch).

Dua pilihan serangan diusulkeun. Pilihan kahiji tiasa dianggo dina konfigurasi OpenSMTPD standar (ngan ukur nampi pamundut ti localhost) sareng ngamungkinkeun anjeun ngamangpaatkeun masalah sacara lokal, nalika panyerang tiasa ngaksés antarmuka jaringan lokal (loopback) dina server (contona, dina sistem hosting). . Pilihan kadua lumangsung nalika OpenSMTPD geus ngonpigurasi pikeun nampa requests jaringan éksternal (pangladén mail nu narima mail pihak katilu). Panaliti parantos nyiapkeun prototipe eksploitasi anu suksés sareng vérsi OpenSMTPD kalebet dina OpenBSD 6.6 sareng versi portabel pikeun sistem operasi sanés (dilaksanakeun dina Debian Testing).

Masalahna disababkeun ku kasalahan dina fungsi smtp_mailaddr (), anu disebut pikeun mariksa kabeneran nilai-nilai dina widang "MAIL FROM" sareng "RCPT TO" anu netepkeun pangirim / panarima sareng disalurkeun salami sambungan. kalawan server mail. Pikeun pariksa bagian tina alamat surélék nu datang saméméh simbol "@", fungsi smtp_mailaddr() disebut.
valid_localpart(), nu narima (MAILADDR_ALLOWED) karakter "!#$%&'*/?^`{|}~+-=_", sakumaha dibutuhkeun ku RFC 5322.

Dina hal ieu, escaping langsung tina string dipigawé dina fungsi mda_expand_token (), nu ngagantikeun ngan karakter "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Salajengna, jalur anu disiapkeun dina mda_expand_token () dianggo nalika nyauran agén pangiriman (MDA) nganggo paréntah 'execle ("/bin/sh", "/bin/sh", "-c", mda_command,...' . Dina hal nempatkeun hurup kana mbox via /bin/sh, baris "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" diluncurkeun, dimana nilaina "% {mbox.from}” kalebet data anu lolos tina parameter "MAIL FROM".

Hakekat kerentanan nyaeta smtp_mailaddr() boga kasalahan logis, alatan nu, lamun domain kosong dikirim ka email, fungsi mulih kode verifikasi suksés, sanajan bagian alamat saméméh "@" ngandung karakter sah. . Salajengna, nalika Nyiapkeun string a, fungsi mda_expand_token () teu luput kabeh mungkin cangkang karakter husus, tapi ngan karakter husus diwenangkeun dina alamat surélék. Janten, pikeun ngajalankeun paréntah anjeun, cekap nganggo simbol ";" dina bagian lokal email. jeung spasi, nu teu kaasup dina MAILADDR_ESCAPE set na teu lolos. Salaku conto:

$nc 127.0.0.1 25

HELO profesor.falken
SURAT TI:<;saré 66;>
RCPT TO:
DATA
.
NGECAT

Sanggeus sési ieu, OpenSMTPD, nalika dikirimkeun ka mbox, bakal ngajalankeun paréntah ngaliwatan cangkang

/usr/libexec/mail.local -f ;saré 66; akar

Dina waktos anu sami, kamungkinan serangan diwatesan ku kanyataan yén bagian lokal alamat henteu tiasa langkung ti 64 karakter, sareng karakter khusus '$' sareng '|' diganti ku ":" nalika kabur. Pikeun bypass watesan ieu, kami nganggo kanyataan yén awak surat dikirimkeun sanggeus ngajalankeun /usr/libexec/mail.local ngaliwatan aliran input, i.e. Ku manipulasi alamatna, anjeun ngan ukur tiasa ngaluncurkeun juru paréntah sh sareng nganggo awak surat salaku set paréntah. Kusabab headers SMTP jasa dituduhkeun dina awal surat, disarankeun pikeun nganggo paréntah baca dina loop pikeun ngaluncurkeunana. Eksploitasi kerja sigana sapertos kieu:

$nc 192.168.56.143 25

HELO profesor.falken
SURAT TI:<;pikeun kuring dina 0 1 2 3 4 5 6 7 8 9 abcd;baca r;réngsé;sh;kaluar 0;>
RCPT TO:[email dijaga]>
DATA
#0
#1
...
#d
pikeun i di WOPR; ngalakukeun
echo -n "($i) " && id || putus
rengse > /root/x."`id -u`.""$$"
.
NGECAT

sumber: opennet.ru

Tambahkeun komentar