Özet. WP Hide & Security Enhancer (100.000+ etkin kurulum) WordPress girişini bir iki faktörlü kimlik doğrulama (2FA) katmanıyla sarar. 2.9.3 sürümünde, eklentinin varsayılan yapılandırmasında 2FA doğrulama işleyicisi istemci denetimli bir "Sonra ayarla" sinyaline güvenir ve ikinci faktörü zaten yapılandırmış bir kullanıcının girişini tamamlar; hiçbir kod denetlenmez. Kök nedeni kimlik doğrulama durumu yönetimi üzerine bir güvenli kodlama vaka incelemesi olarak ele alıyor, site sahiplerine somut tespit ve sıkılaştırma adımları veriyoruz. Bulgu taze (0-gün) ve yazının yazıldığı an itibarıyla yamasız. Üretici koordineli ifşa kapsamında bilgilendirildi; tam operasyonel kavram kanıtı, yama çıkana dek yayımlanmıyor.
Anahtar kelimeler: WordPress güvenliği, iki faktörlü kimlik doğrulama atlatması, bozuk kimlik doğrulama, eksik kritik adım, CWE-287, CWE-304, güvenli kodlama.
1. 2FA atlatması neden önemli
İkinci faktör, asıl değerini birinci faktörün çoktan düştüğü anda gösterir. Saldırgan giriş formunun başına çalışan bir parolayla geldiğinde — oltalanmış, yeniden kullanılmış, sızmış ya da tahmin edilmiş — ayakta kalan tek denetim 2FA'dır. Aynı saldırgan bunu da atlayabiliyorsa, özellik koruma değil yalnızca içe sinme sunar.
WP Hide & Security Enhancer, 100.000'den fazla etkin kuruluma sahip, yaygın kullanılan bir WordPress sıkılaştırma eklentisidir. Özelliklerinden biri, girişi kullanıcı adı/parola adımından sonra yakalar ve herhangi bir kimlik doğrulama çerezi verilmeden önce bir ikinci faktör sorusu sunar: e-posta kodu, kimlik doğrulayıcı uygulama kodu ya da kurtarma kodu.
Bu bulguyu kayda değer kılan, hatanın ne kadar sıradan olması. Ortada kriptografik bir zayıflık ya da egzotik bir uç durum yok; bir güvenlik eklentisinin en güvenlik-kritik yolunda bir kimlik doğrulama durumu mantık hatası duruyor ve eklentinin varsayılan yapılandırmasında erişilebilir. Zorunlu bir adım sessizce atlanmışken kimlik doğrulama akışını tamamlamak, kimlik doğrulama kodundaki en yaygın ve en zararlı hatalardan biridir; örüntü bu tek eklentinin çok ötesine uzanır.
2. Etkilenen bileşen
| Eklenti | WP Hide & Security Enhancer — slug wp-hide-security-enhancer |
| Test edilen sürüm | 2.9.3 (test sırasındaki güncel/son sürüm) |
| Etkin kurulum | 100.000+ |
| Zafiyet türü | İki Faktörlü Kimlik Doğrulama Atlatması / Bozuk Kimlik Doğrulama |
| CWE | CWE-287 Hatalı Kimlik Doğrulama (CWE-304 Kimlik Doğrulamada Eksik Kritik Adım) |
| Gereken yetki | Kurbanın birincil kimlik bilgilerine (kullanıcı adı + parola) sahip, kimliği doğrulanmamış saldırgan. Kurbanın rolü için 2FA etkin ve varsayılan Enforce User to Configure 2FA = No olmalı. |
| Kullanıcı etkileşimi | Yok |
| CVSS 3.1 | 6.8 (Orta) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, kimlik bilgisi ön koşulu nedeniyle düşürülmüş (triaj uzmanı değiştirebilir) |
| Durum | Taze (0-gün), güncel sürümde izole bir laboratuvarda uçtan uca yeniden üretildi; yayında yama yok |
3. Kök neden analizi
Parola adımı geçtikten sonra eklenti kimlik doğrulama çerezini hemen vermez; kendi 2FA formunu gösterir ve girişi özel bir işleyiciye yönlendirir. Niyet doğru: ikinci faktör doğrulanmadan hiçbir wordpress_logged_in çerezi var olmamalı.
İşleyici, işi "Sonra ayarla" olanağını ele alırken bozar. Bu yol, gerçek ilk kez kurulum içindir; kendisinden yeni 2FA istenen ama henüz hiçbir seçenek yapılandırmamış kullanıcı, yönetici zorunlu yapılandırmayı dayatmamışsa kurulumu yaparken bir kez geçebilir. Ne var ki işleyici bu yolu kabul edip etmeyeceğine yanlış duruma bakarak karar verir.
İlgili dal, modules/components/login_2fa.php, login_form_validate_2fa() (v2.9.3):
$_2fa_require_setup = $this->wph->functions->get_module_item_setting('2fa_require_setup'); // default 'no'
$other_2fa_option_require_setup = $this->_2fa_get_first_option_require_setup( $user->ID );
if ( strtolower( $submit ) == 'setuplater' && $_2fa_require_setup !== 'yes' ) {
// Only redirects if SOME OTHER active option still needs first-time setup:
foreach ( $this->active_2fa_options as $active_2fa_option_id => $_2fa_option ) {
if ( $active_2fa_option_id === '2fa_recovery_codes' ) continue;
if ( $_2fa_option->user_2fa_require_setup()
&& ! $_2fa_option->user_2fa_option_setup_completed( $user->ID )
&& $_2fa_id != $active_2fa_option_id ) {
wp_safe_redirect( $this->login_url( ... ) ); exit();
}
}
// No option needs setup -> log the user in WITHOUT verifying any 2FA code:
$this->login_success( $args ); // -> wp_set_auth_cookie()
exit;
}Mantığın nerede koptuğu:
- Dal, mevcut kullanıcının hâlâ 2FA kurması gerekip gerekmediğini hiç sormaz. Yalnızca başka bir seçenek eksik kaldığında yeniden yönlendirir. Kendi etkin faktörü zaten çalışan biri, "Sonra ayarla"nın yazıldığı kullanıcı değildir; ama kod ikisini birbirinden ayıramaz.
- E-posta seçeneği
user_2fa_require_setup()içinFALSE(veuser_2fa_option_setup_completed()içinTRUE) bildirir; kimlik doğrulayıcı uygulama seçeneği ise kayıt tamamlanıncauser_2fa_option_setup_completed()içinTRUEbildirir. Yapılandırılmış veya birincil seçeneği olan bir kullanıcıda döngü gövdesi bu yüzden hiç doğru olmaz ve kontrol doğrucalogin_success()'a düşer. login_success()da hiçbir kod denetimi olmadanwp_set_auth_cookie()çağırır.- Ayrı bir koruma,
authenticatefiltresine bağlıauthenticate_block_cookies(), normalde 2FA geçene kadar kimlik doğrulama çerezini bastırır. Yalnızca o filtre çalışınca devreye girer; 2FA doğrulama istek yolu isewp_authenticate'i hiç çağırmaz. Son savunma hattı bu yüzden hiç tetiklenmez velogin_success()'ın ayarladığı çerez gerçekten teslim edilir. 2fa_require_setup'ın varsayılanı'no'dur (modules/components/login_2fa_defaults.php); zafiyetli dal kutudan çıktığı haliyle etkin kalır.
Özünde bu, ders kitabına girecek bir eksik kritik adımdır (CWE-304). Güven kararı "başka bir seçeneğin kurulması gerekiyor mu?" sorusunu yanıtlar; oysa güvenlik açısından önemli soru "bu kullanıcının ikinci faktörü doğrulandı mı, yoksa gerçekten hiç yapılandırılmamış mı?" sorusudur. İki soru yepyeni bir kullanıcıda örtüşür — yolun amaçlanan durumda çalışmasının nedeni tam da budur — ve 2FA'nın korumayı hedeflediği kullanıcılarda ayrışır; başarısız olmasının nedeni de budur.
4. Kusura nasıl ulaşılıyor (kavramsal)
Saldırganın tek ihtiyacı, 2FA'nın zaten düşman elinde var saydığı şeydir: kurbanın kullanıcı adı ve parolası. Bu bilgiyi yetersiz kılmak, ikinci faktörün bütün işidir.
Parola adımı normal işler. İlk faktörü doğrular ve eklenti etkin olduğu için kimlik doğrulama çerezini tutup ikinci faktör formunu döndürür. Hesap burada hâlâ korumalıdır: elde oturumsuz bir soru vardır, onu yanıtlayacak kod yoktur.
Kopuş bir adım sonra gelir. Soru işleyici "kodsuz girişi tamamlamak güvenli mi?" kararını verirken bu kullanıcının kendi faktörünün gerçekten doğrulanıp doğrulanmadığına değil, diğer 2FA seçeneklerinin kurulum durumuna bakar. Kurbanın etkin faktörü ilk kez kuruluma ihtiyaç duymuyorsa — her zaman yapılandırılmış sayılan e-posta ya da önceden kayıtlı bir kimlik doğrulayıcı uygulaması — bu ön koşul kalıcı olarak sağlanır. "Sonra ayarla" dalı da kurulacak bir şey kalmadığı sonucuna varır, girişi sonlandırır ve tek bir kod bile denetlenmeden çerezi verir.
Böylece ikinci faktör, tam da korumak için var olduğu kesim için işlevsiz bir adıma iner: onu zaten yapılandırmış kullanıcılar. Hiçbir kod tahmin edilmez, hiçbir jeton çalınmaz, hiçbir yarış kazanılmaz. İşleyici yalnızca, zaten yapılandırılmış bir hesaba asla açık olmaması gereken bir dal boyunca "onu içeri al" noktasına ulaşır. Eklenti yamalanmadığı sürece gerçek istek dizisini, parametre değerlerini ve yeniden üretim komutlarını bilerek yayımlamıyoruz.
5. Etki değerlendirmesi
Varsayılan haliyle, bir kullanıcının parolasına sahip olan herkes 2FA katmanının tamamını atlayabilir. Bu, 2FA'nın durdurmak için var olduğu tehdidin ta kendisidir — oltalama, yeniden kullanım ya da sızıntıyla kimlik bilgisi ele geçirme — yani denetim, satın alındığı tek senaryoda başarısız olur.
2FA etkin her hesap etkilenir, yöneticiler dahil. Başarılı bir atlatma hedef hesaba tam kimlik doğrulamalı erişim verir; bir yönetici söz konusuysa bu, pratikte sitenin tüm kontrolüdür. Hedef hesabın gizlilik, bütünlük ve erişilebilirlik etkisi bu yüzden yüksektir.
CVSS temel metrikleri; ağdan erişilebilir, düşük karmaşıklıklı, etkileşim gerektirmeyen ve C/I/A etkisi yüksek bir kusuru anlatır. Yayımlanan 6.8 (Orta) puanı, kimlik bilgisi ön koşulu için aşağı yönlü bir düzeltmeyi yansıtır: saldırgan zaten geçerli bir parolaya sahip olmalıdır. Bu ön koşul, bulgunun anlamlı olmasının da nedenidir; parola sahibi bir saldırgana karşı 2FA'yı etkisiz kılmak, özelliğin bütün amacıdır. Triaj uzmanı bunu farklı ağırlıklandırabilir.
6. Giderme
Güven kararını ilgisiz seçeneklerin kurulum durumuna değil, kimliği doğrulanan kullanıcının kendi ikinci faktör durumuna bağlayın:
// Treat the user's own configured/primary option as "must be verified".
// Only allow "Set up later" when the CURRENT user genuinely has NO usable,
// configured 2FA option — not merely when some OTHER option is incomplete.
$current_option = $this->active_2fa_options[ $_2fa_id ] ?? null;
$user_has_usable_factor =
$current_option
&& $current_option->user_2fa_option_setup_completed( $user->ID );
if ( strtolower( $submit ) == 'setuplater'
&& $_2fa_require_setup !== 'yes'
&& ! $user_has_usable_factor ) {
// genuine first-time enrolment only -> allowed to proceed
...
} else {
// a configured factor exists -> REQUIRE and verify its code before login_success()
...
}Geliştiriciler ve işletmeciler için:
setuplaterdalında atlamaya yalnızca kimliği doğrulanan kullanıcının gerçekten hiçbir kullanılabilir yapılandırılmış 2FA seçeneği yoksa izin verin.login_success()'tan önce kullanıcının kendi etkin/birincil seçeneğinin halihazırda tamamlanmış bir kurulumu olmadığını doğrulayın; yapılandırılmış bir e-posta veya uygulama seçeneğini "kurulum tamam" sayıp kodunu isteyin.- İstemciden gelen
submit=setuplateralanı, zaten çalışan bir ikinci faktörü olan kullanıcının girişini tamamlama yetkisi değildir. "Sonra ayarla" yalnızca gerçek ilk kez kayda aittir ve denetim sunucu tarafında yapılmalıdır. - 2FA geçene kadar giriş çerezini bastıran kimlik doğrulama çerezi korumasını 2FA doğrulama yolunda da uygulayın; böylece hiçbir işleyici çerezi bant dışı ayarlayamaz.
- Üretici yamalı bir sürüm yayımlar yayımlamaz ona güncelleyin. O zamana kadar aşağıdaki sıkılaştırma seçeneklerine bakın.
7. Site sahipleri için tespit ve sıkılaştırma
Bu, yük temelli bir saldırı değil bir kimlik doğrulama durumu mantık kusuru; dolayısıyla tespit, imzalara değil giriş akışındaki anormalliklere dayanır:
- 2FA yapılandırmasını zorunlu kılın. Zafiyetli dal, varsayılan
Enforce User to Configure 2FA = Noayarına bağlıdır. Bunu Yes yapmak "Sonra ayarla" yolunun davranışını değiştirir ve her hâlükârda yerinde bir sıkılaştırmadır; zorunlu kayıt kendi başına iyi bir uygulamadır. - İkinci faktör tüketmeyen girişleri izleyin. 2FA'nın etkin olduğu bir ortamda, öncesinde doğrulanmış bir e-posta/uygulama kodu olmayan başarılı bir kimlik doğrulamalı oturum anormaldir. 2FA sorusunun verilmesini 2FA başarı olaylarıyla ilişkilendirin; eşleşen doğrulaması olmadan kimlik doğrulamalı çerez üreten bir girişe bakmakta yarar var.
- Beklenmeyen yönetici oturumları için uyarı üretin. Olağan dışı konum, kullanıcı aracısı ya da saatlerde beliren yeni yönetici girişleri dikkatle incelenmeli, hele bu kusur yamasızken.
- Çalınan bir parolanın kazandırdığını küçültün. Hata yalnızca zaten geçerli bir parolaya sahip saldırgana yarar. Güçlü ve benzersiz parolalar zorunlu kılın; yeniden kullanıldığı ya da ifşa olduğu bilinen veya şüphelenilen kimlik bilgilerini sıfırlayın; yönetici yetkisi taşıyan hesap sayısını düşük tutun.
- Sanal yama / WAF. Bir web uygulaması güvenlik duvarı ya da istek filtreleme katmanı, prensipte, hesabın etkin yapılandırılmış bir faktörü varken "sonra ayarla" sinyaliyle girişi sonlandırmaya çalışan 2FA doğrulama uç noktası isteklerini işaretleyebilir veya engelleyebilir. Bunu kod düzeltmesinin yerini tutan değil, zaman kazandıran geçici bir önlem sayın.
- Eklentiyi güncel tutun. Üreticinin yamalı sürümü çıktığında hızla uygulayın ve eklentinin güvenlik duyurularına abone olun.
Bunların hiçbiri uydurulmuş ürün özelliği değildir; kusurun mekaniğinden ve standart WordPress işletim pratiğinden türetilmiştir.
8. Daha geniş ders
Bir kimlik doğrulama akışı nihai güven kararını, komşu ve ilgisiz bir adımın durumundan değil, uygulanan adımın durumundan vermelidir. "Kullanıcı, ikinci faktör olmadan girişi tamamlayabilir mi?", bu kullanıcının ikinci faktörüyle ilgili bir sorudur. Onu başka bir seçeneğin kurulması gerekip gerekmediğine bakarak yanıtlamak bir kategori hatasıdır: iyi niyetli durumda doğru, saldırgan durumunda yanlış.
Üç güvenli kodlama alışkanlığı bunu yakalardı:
- Önce reddet, sonra istisnaları dar aç. Kod varsayılan olarak "girişi tamamla" davranıyor ve yalnızca belirli bir koşulda yönlendiriyordu. Daha güvenli biçim, doğrulamayı gerektirip onu yalnızca dar kapsamlı, sunucu tarafında doğrulanmış bir ilk kez kayıt koşulunda atlar.
- İstemciden gelen bir alanın asla bir yetkilendirme kararının yerine geçmesine izin vermeyin.
submit=setuplatertarayıcıdan gelir. Onu girişi tamamlama izni saymak, güvenlik-kritik bir seçimi saldırganın eline bırakır. - Korumaları, noktaya ulaşabilen her yol boyunca koşulsuz kılın. Çerez bastıran son savunma hattı vardı ama önemli olan yolda çalışmadı. Noktaya giden rotaların yalnızca bazılarında uygulanan bir denetim, denetim değildir.
Kimlik doğrulama kodu, "testte çalışıyor" ile "güvenli"nin en kolay karıştırıldığı yerdir. Bir oturum çerezi verebilen her dalı güvenlik-kritik sayın ve uygulanan adımın kendisini tam o dalda doğrulayın.
9. Sorumlu ifşa
Bu bulgu koordineli ifşa kapsamında ele alınmaktadır. Üretici özel olarak ve iyi niyetle bilgilendirilmiştir; tam operasyonel kavram kanıtı — gerçek istek dizisi, parametre değerleri ve yeniden üretim komutları — bir yama çıkana kadar bu kamuya açık yazıdan çıkarılmıştır. Yazı, site sahiplerinin ve geliştiricilerin hata sınıfını anlamasına, önlemesine ve tespit etmesine yardımcı olmak içindir; istismarı mümkün kılmak için değil.
Tüm doğrulama, Noroxi LLC güvenlik araştırma ekibi tarafından izole, yerele bağlı bir test kurulumuna karşı yapılmıştır. Hiçbir üçüncü taraf ya da üretim sistemine erişilmemiş, kendi laboratuvarımız dışında hiçbir sistem sürece dahil olmamıştır. Daha fazla teknik ayrıntının zamanlamasını ve bir yamanın kamuya açık hale gelmesini üreticiyle koordine edeceğiz.
Kaynaklar
- CWE-287: Improper Authentication — https://cwe.mitre.org/data/definitions/287.html
- CWE-304: Missing Critical Step in Authentication — https://cwe.mitre.org/data/definitions/304.html
- OWASP Authentication Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html
- OWASP Multifactor Authentication Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Multifactor_Authentication_Cheat_Sheet.html
- WordPress Plugin Developer Handbook: Security — https://developer.wordpress.org/plugins/security/
- FIRST CVSS v3.1 Hesaplayıcı — https://www.first.org/cvss/calculator/3.1
Savunma ve eğitim amacıyla yayımlanmıştır. Noroxi LLC yalnızca yetkili güvenlik araştırması yürütür; operasyonel istismar ayrıntısı, bir yama çıkana kadar yayımlanmaz.
Bu hafta sömürülenler · her pazartesi
KEV'e girenler, yeni PoC'ler, WordPress triyajı ve bu hafta ne yapmalı. Hesap gerekmez.