OpenSMTPD'de kök ayrıcalıklarıyla uzaktan kod yürütülmesine izin veren güvenlik açığı

OpenBSD projesi tarafından geliştirilen posta sunucusunda AçıkSMTPD tanımlanmış kritik güvenlik açığı (CVE-2020-7247), kök kullanıcı haklarıyla sunucuda kabuk komutlarını uzaktan yürütmenize olanak tanır. Güvenlik açığı, Qualys Security tarafından gerçekleştirilen yeniden denetim sırasında tespit edildi (önceki OpenSMTPD denetimi) gerçekleştirildiği 2015 yılında ortaya çıkmıştır ve yeni güvenlik açığı Mayıs 2018'den bu yana mevcuttur). Sorun elendi OpenSMTPD 6.6.2 sürümünde. Tüm kullanıcıların güncellemeyi hemen yüklemeleri önerilir (OpenBSD için yama syspatch aracılığıyla yüklenebilir).

İki saldırı seçeneği önerilmektedir. İlk seçenek, varsayılan OpenSMTPD yapılandırmasında çalışır (yalnızca localhost'tan gelen istekleri kabul eder) ve saldırgan, sunucudaki (örneğin, barındırma sistemlerinde) yerel ağ arayüzüne (geridöngü) erişebildiğinde, sorundan yerel olarak yararlanmanıza olanak tanır. . İkinci seçenek, OpenSMTPD harici ağ isteklerini (üçüncü taraf postalarını kabul eden bir posta sunucusu) alacak şekilde yapılandırıldığında ortaya çıkar. Araştırmacılar, hem OpenBSD 6.6'da bulunan OpenSMTPD sürümüyle hem de diğer işletim sistemleri için taşınabilir bir sürümle (Debian Testinde gerçekleştirilen) başarılı bir şekilde çalışan bir istismarın prototipini hazırladılar.

Sorun, göndereni/alıcıyı tanımlayan ve bağlantı sırasında iletilen “MAIL FROM” ve “RCPT TO” alanlarındaki değerlerin doğruluğunu kontrol etmek için çağrılan smtp_mailaddr() fonksiyonundaki bir hatadan kaynaklanmaktadır. posta sunucusuyla. E-posta adresinin “@” sembolünden önceki kısmını kontrol etmek için smtp_mailaddr() fonksiyonu çağrılır.
RFC 5322'nin gerektirdiği şekilde "!#$%&'*/?^`{|}~+-=_" karakterlerini kabul eden (MAILADDR_ALLOWED) valid_localpart().

Bu durumda, dizenin doğrudan çıkışı mda_expand_token() işlevinde gerçekleştirilir ve bu yalnızca "!#$%&'*?`{|}~" (MAILADDR_ESCAPE) karakterlerinin yerini alır. Daha sonra, mda_expand_token()'da hazırlanan satır, 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' komutunu kullanarak dağıtım aracısını (MDA) çağırırken kullanılır. Mbox'a /bin/sh yoluyla harf yerleştirilmesi durumunda “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” satırı başlatılır, burada “% değeri bulunur. {mbox.from}”, "MAIL FROM" parametresinden kaçan verileri içerir.

Güvenlik açığının özü, smtp_mailaddr() işlevinin mantıksal bir hataya sahip olmasıdır; bu hata nedeniyle e-postaya boş bir alan adı gönderilirse, adresin "@" öncesindeki kısmı geçersiz karakterler içerse bile işlev başarılı bir doğrulama kodu döndürür. . Ayrıca, bir dize hazırlarken, mda_expand_token() işlevi tüm olası kabuk özel karakterlerinden kaçmaz, yalnızca e-posta adresinde izin verilen özel karakterlere izin verir. Bu nedenle komutunuzu çalıştırmak için e-postanın yerel kısmında “;” sembolünü kullanmanız yeterlidir. ve MAILADDR_ESCAPE kümesine dahil olmayan ve çıkış yapılmayan boşluk. Örneğin:

$nc 127.0.0.1 25

HELO profesörü.falken
POSTA KENDİ:
RCPT ALICI:
VERİ
.
ÇIK

Bu oturumdan sonra OpenSMTPD, mbox'a teslim edildiğinde komutu kabuk aracılığıyla başlatacaktır.

/usr/libexec/mail.local -f ;uyku 66; kök

Aynı zamanda adresin yerel kısmının 64 karakteri geçememesi ve '$' ve '|' özel karakterlerinin kaçış sırasında ":" ile değiştirilmesi nedeniyle saldırı olasılıkları sınırlıdır. Bu sınırlamayı aşmak için, mektubun gövdesinin giriş akışı yoluyla /usr/libexec/mail.local komutunu çalıştırdıktan sonra iletildiği gerçeğini kullanırız; Adresi değiştirerek yalnızca sh komut yorumlayıcısını başlatabilir ve mektubun gövdesini bir dizi talimat olarak kullanabilirsiniz. Servis SMTP başlıkları mektubun başında belirtildiğinden, bunları atlamak için okuma komutunun bir döngü içinde kullanılması önerilir. Çalışan bir istismar şuna benzer:

$nc 192.168.56.143 25

HELO profesörü.falken
GÖNDERİLEN POSTA:
RCPT'ye:[e-posta korumalı]>
VERİ
#0
#1
...
#d
WOPR'de i için; Yapmak
echo -n "($i) " && kimlik || kırmak
bitti > /root/x."`id -u`.""$$"
.
ÇIK

Kaynak: opennet.ru

Yorum ekle