Zimbra Mail Server LFI Açıklığı için Geçici Çözüm Önerisi

Zimbra mail server uygulamasının 2009, 2010, 2011, 2012 ve 2013 yıllarında yayımlanan sürümlerini etkileyen 0day (sıfırıncı gün) güvenlik zaafiyeti ve exploiti yayımlandı. Açıklığın yayınlanmasını takip eden iki gün içinde üretici firmadan herhangi bir güncelleme ve öneri dökümanı gelmemesi nedeniyle doğrudan açıklığın istismarını engelleyecek bir yapılandırma hazırlamaya çalıştık.



Açıklığın Etkisi

Zimbra’nın yonetim portu internete açıksa açıklık kullanılarak tam yetkili bir admin kullanıcısı oluşturulabilir, Zimbra mail server uygulamasının “Admin Console” isimli yönetim arabirimi sayfasından ilgili admin kullanıcısı ile giriş yapılarak tüm mail hesapları ele geçirilebilir. 
Admin portu internete açık olmasa da LFI zafiyeti kullanılarak işletim sistemindeki hassas bilgi barındıran dosyalar okunabilir.

Güncelleme: Zimbra tarafından güvenlik güncelleştirilmeleri yayımlanmış durumda. http://www.zimbra.com/forums/known-issues/67237-security-guidance-reported-0day-exploit.html adresinde açıklamaları okuyabilirsiniz.

Zafiyetin engellenebilmesi için, ilgili Zimbra mail server sisteminde aşağıdaki adımlar uygulanabilir.




# cd /opt/zimbra/conf/nginx/includes



“nginx.conf.web.https.default” isimli dosya metin editörü ile açılarak aşağıdaki satırlar ilgili kısıma eklenir.



# vi nginx.conf.web.https.default
# NOTE that this will only work in the cases where each mailhost
    # within the cluster has the same mailhostport (Limitation)
    #
    set $mailhostport 8080;   # replace this with *the* mailhost port
    set $relhost $host;
    if ($mailhostport != 80) {   # standard HTTP port, do not replace
        set $relhost $host:$mailhostport;
    }
# 402
    if ($request_uri ~ ../) {
           return 402;
    }

if ($arg_skin ~ [^A-Za-z]+ ) {
               return 402;
    }

if ($args ~ %) {
               return 402;
       }

    # End stray redirect hack
    # Proxy to Zimbra Upstream
            proxy_pass    http://zimbra;
Tablo 1



# pkill nginx



# /opt/zimbra/nginx/sbin/nginx -c /opt/zimbra/conf/nginx.conf

NOT: Konfigürasyon dosyasında yapılan bir değişiklik sonrasında değişikliğin aktif olması için ilgili servisin yeniden başlatılması gerekmektedir. Zimbra üzerinde çalışan nginx servisinin kontrol betiği olan zmnginxctl içindeki “configrewrite” özelliği öntanımlı aktif geldiğinden dolayı, konfigürasyon dosyasındaki yapılan herhangi bir değişikliği görmezden gelip, “/opt/zimbra/conf/nginx/includes/”  dizini altındaki dosyaları ve “/opt/zimbra/conf/nginx.conf” dosyasını kullanarak yapılan değişikliklere izin vermemektedir.  

“configrewrite” özelliğinin kapatılması için ilgili satırların başlarına “#“ konularak yorum satırı haline getirilir. (Tablo-2)

#  vi /opt/zimbra/bin/zmnginxctl
checkrunning
echo -n “Starting ${servicename}…”
if [ $running = 1 ]; then
  echo “${servicename} is already running.”
  exit 0
fi
# if [ “x$2” = “x” ]; then
#   ${zimbra_home}/libexec/configrewrite proxy > /dev/null 2>&1
# fi
if [ ! -f ${configfile} ]; then
  echo “failed.  ${configfile} is missing.”
  exit 1
fi
Tablo-2

Bu durumda aşağıdaki adımlar uygulanır.



# cd /opt/zimbra/conf/nginx/templates



“nginx.conf.web.https.default.template” isimli dosya metin editörü ile açılarak aşağıdaki satırlar ilgili kısıma eklenir. (Tablo-3) Bu arada templateden nginx konfigürasyonun üretilebilmesi için configrewrite özelliği tekrar aktif hale getirilmelidir. [Zimbra arayüzüne erişim http üzerinden de sağlanıyorsa “nginx.conf.web.http.default.template” dosyasını da Tablo-3’de gösterilen şekilde değiştirmek gerekir.]



# vi nginx.conf.web.https.default.template
    # NOTE that this will only work in the cases where each mailhost
    # within the cluster has the same mailhostport (Limitation)
    #
    set $mailhostport ${web.http.uport};   # replace this with *the* mailhost port
    set $relhost $host;
    # 402
    if ($request_uri ~ ../) {
           return 402;
    }

if ($arg_skin ~ [^A-Za-z]+ ) {
               return 402;
    }

if ($args ~ %) {
               return 402;
       }

    if ($mailhostport != 80) {   # standard HTTP port, do not replace
        set $relhost $host:$mailhostport;
    }
Tablo-3



# su – zimbra



zimbra$ zmnginxctl restart

Eğer ilgili ekran alınamayıp exploit hala çalışıyorsa, zimbra üzerindeki nginx in http ve https proxy olarak çalıştığından emin olunmalıdır. zimbra kullanıcısıyla zmnginxctl stop komutu verilir. Bilgisayarın dinlediği portlara bakılır. 80 ve 443 hala aktifse, nginx web proxy olarak çalışmıyordur. Aşağıdaki komutla https için proxy şeklinde çalışması sağlanır.



# su – zimbra



zimbra$ /opt/zimbra/libexec/./zmproxyconfig -m -w -e -x https -H `zmhostname`


Geçmişe Ait Logların Zafiyet İstismarını Belirleme Amaçlı İncelenmesi

Açıklık engellendikten sonra yapılması gereken zimbra nın proxy sunucusunda ve syslog serveri üzerinde bulunan /opt/zimbra/log klasöründe bulunan nginx.log ve nginx.access.log dosyaları taranmalıdır. Log dosyalarını tararken açıklığın ilk yayınlandığı 6 Aralıktan itibaren tarama yapılmasına özen göstermelidir.


#cd /opt/zimbra/log
#gunzip nginx.access.log-20131207.gz nginx.log-20131207.gz
#cat nginx.access.log-20131208 | grep “..”
#cat nginx.log-20131208 | grep “..”

Referanslar :

1 – ) http://wiki.zimbra.com/wiki/NGINX_Configuration_Structure

Mücahit YARDIM, Necati Ersen ŞiŞECİ