İçeriğe atla
Noroxi
Araştırma7 dk

Essential Blocks'ta Eksik Yetkilendirme: Katkıda Bulunan API anahtarını okuyor

Essential Blocks'ta eksik yetki denetimi, herhangi bir Katkıda Bulunan'ın yöneticinin Google Haritalar API anahtarını okumasına izin veriyor. Kök neden ve düzeltme.

Noroxi EkibiSızma testi ve güvenlik danışmanlığı

Özet. Essential Blocks for Gutenberg'de salt okunur bir AJAX işleyicisi, yöneticinin yapılandırdığı Google Haritalar API anahtarını herhangi bir Katkıda Bulunan kullanıcıya veriyor. Uç nokta bir nonce ile edit_posts yetkisini denetliyor; ama hiçbiri, çağıranın bir yönetici sırrını okumaya izinli olup olmadığını ortaya koymuyor. Ders kitaplık bir Eksik Yetkilendirme kusuru (CWE-862). Aşağıda kök nedeni, düşük yetkili bir hesabın çıktı noktasına neden ulaşabildiğini ve buradan çıkan önleme ile tespit adımlarını ele alıyoruz. Eklenti yazım anında yamasız; bu yüzden operasyonel kavram kanıtı, düzeltme çıkana dek eşgüdümlü açıklama kapsamında saklı.

Anahtar kelimeler: WordPress güvenliği, Eksik Yetkilendirme, CWE-862, bozuk erişim denetimi, yetki denetimleri, API anahtarı sızıntısı, güvenli kod.

1. Giriş

Essential Blocks for Gutenberg, blok kütüphanesini 200.000'den fazla siteye taşıyan bir eklenti. Bu ölçekte tek bir eksik denetim yerel bir hata olmaktan çıkar: eksik kalan tek satır, aynı kimlik bilgisini yüz binlerce kurulumda birden açığa çıkarabilir.

Kusur, WordPress ekosisteminin en yaygın sınıflarından biri: eksik yetkilendirme. Yöneticinin Google Haritalar API anahtarını, isteğin meşru olduğunu doğrulayan ama çağıranın onu okumaya yetkili olup olmadığını hiç sormayan bir uç nokta veriyor. Doğru istek, yanlış okuyucu — bu kalıp eklentiden eklentiye tekrar eder ve incelemede kolayca gözden kaçar. İncelemeye değer olmasının nedeni de bu.

2. Etkilenen bileşen

EklentiEssential Blocks for Gutenberg — slug essential-blocks
Test edilen sürüm6.4.6 (test sırasında güncel)
Aktif kurulum200.000+
Zafiyet türüEksik Yetkilendirme / Hassas Bilgi (API anahtarı) Sızıntısı
CWECWE-862 Missing Authorization / CWE-200
Gereken yetkiKatkıda Bulunan (edit_posts olan herhangi bir kullanıcı; manage_options yok)
CVSS 3.1~5.4 (Orta) AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
DurumTaze, kodda doğrulandı ve bir localhost laboratuvarında yeniden üretildi

3. Koddaki kök neden

google_map_api_key AJAX eylemi, site genelinde geçerli ve yöneticinin yapılandırdığı Google Haritalar API anahtarını eb_settings seçeneğinden okuyup geri döndürür. İstek ile bu sır arasında iki şey durur: bir nonce ve edit_posts yetkisi. manage_options değil.

php
// Blocks/GoogleMap.phppublic function google_map_api_key_callback(){    if ( ! wp_verify_nonce( sanitize_key( $_POST['admin_nonce'] ), 'admin-nonce' ) ) {        wp_send_json_error( __( 'Nonce verification failed!', 'essential-blocks' ) );    }    if ( ! current_user_can( 'edit_posts' ) ) {               // <-- YANLIŞ DENETİM: düşük yetki; manage_options olmalı        wp_send_json_error( __( 'You are not authorized!', 'essential-blocks' ) );    }    $settings = get_option( 'eb_settings' );    if ( is_array( $settings ) && isset( $settings['googleMapApi'] ) ) {        wp_send_json_success( $settings['googleMapApi'] );     // <-- yöneticinin API anahtarını döndürür    }    ...}

Her iki denetim de döndürülen veri için yanlış türde.

wp_verify_nonce() bir yetki denetimi değil. Yalnızca isteğin gerçek, oturum açmış bir oturumdan geldiğini ve üçüncü bir tarafça sahtelenmediğini doğrular; yani CSRF koruması, o kadar. Nonce kullanıcıya bağlanır, bir yetkiye değil. Dolayısıyla o kullanıcının ne yapmaya izinli olduğu konusunda tek kelime söylemez.

İkinci hata edit_posts denetimi. Hattan geçen değer bir yönetici ayarı; site genelindeki entegrasyon ayarlarını kimin okuyup değiştireceğini yöneten yetki ise manage_options. Yönetici sırrını her Katkıda Bulunan ve Yazar'da zaten bulunan edit_posts yetkisinin ardına koyarsanız, "yetkilendirme" kapısı tam da dışarıda tutması gereken kişileri içeri alır.

Aynı ayarın kardeş kaydetme işleyicisi doğru biçimde korunmuş. Kusuru klasik bir asimetriye çeviren de bu: yazma yolu korumalı, okuma yolu açık.

4. Kusura nasıl ulaşılır (kavramsal)

Katkıda Bulunan düşük güvenli bir rol. Taslak yazabilir ama yayımlayamaz, eklenti kuramaz, site ayarlarını göremez. Bu işleyiciye ulaşmak iki şey ister ve WordPress bir Katkıda Bulunan'a ikisini de sıradan biçimde verir:

  1. Eylem için geçerli bir nonce. Eklenti, admin-nonce değerini blok düzenleyici ekranında, o ekranı açabilen her kullanıcı için bir JavaScript nesnesine yerleştirir. Nonce'lar kullanıcı başına üretilir ve yetkiye göre sınırlanmaz; standart "yeni yazı" düzenleyicisini açan bir Katkıda Bulunan, bu eylem için çalışan bir nonce'ı sayfanın olağan bir parçası olarak alır. Elde etmek için hile gerekmez.
  2. Uç noktayı çağırabilmek. admin-ajax.php, kimliği doğrulanmış her kullanıcıya yanıt verir. İşleyici bu nonce ile çalıştığında geriye tek kapı kalır — edit_posts denetimi — ve Katkıda Bulunan onu geçer.

Yani uç noktanın yaptığı "yetkilendirme", saldırganın sıradan ayrıcalıklarıyla zaten karşılanmış oluyor. Nonce isteğin gerçek olduğunu kanıtlar; yetki denetimi yalnızca çağıranın yazı düzenleyebildiğini. Hiçbiri asıl önemli şeyi kanıtlamaz: çağıranın bir yönetici sırrını okumaya izinli olduğunu. Sonuçta yalnızca yöneticiye ait olması gereken Google Haritalar API anahtarı, onu hiç görmemesi gereken bir role açılır.

Eklenti yamasızken gerçek istek dizisini, parametre değerlerini ve çalıştırılabilir hiçbir komutu bilerek dışarıda bırakıyoruz.

5. Etki değerlendirmesi

Site genelindeki entegrasyon sırlarına yaklaşmaması gereken bir Katkıda Bulunan, yöneticinin yapılandırdığı Google Haritalar API anahtarını okuyabilir. Fatura site sahibinin Google hesabına çıkar:

  • Kota ve faturalandırma istismarı. Sızan bir Haritalar anahtarı zorlanarak sahibin kotasını, ardından faturalandırma bütçesini tüketebilir.
  • Yetkisiz alan adlarında kullanım. Anahtarın HTTP-referrer veya uygulama kısıtlamaları zayıfsa ya da yoksa, anahtar saldırganın denetimindeki sitelerden çalışır.

AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N vektörü bu tabloyu verir: ağdan erişilebilir, düşük karmaşıklık, düşük yetki, kullanıcı etkileşimi yok, yüksek gizlilik etkisi (sır tamamen açığa çıkar), bütünlük ve erişilebilirliğe doğrudan etki yok. Sonuç dürüst bir Orta (~5.4).

6. Giderme

Ayarı gerçekten yöneten yetki üzerinden yetkilendirin. google_map_api_key_callback() içindeki denetimi edit_posts'tan manage_options'a çevirin; okuma yolu kaydetme yoluyla eşleşsin:

php
if ( ! current_user_can( 'manage_options' ) ) {    wp_send_json_error( __( 'You are not authorized!', 'essential-blocks' ) );}

Resmî düzeltilmiş sürüm çıkana dek site sahipleri riski şöyle azaltabilir:

  • Katkıda Bulunan ve Yazar hesaplarını gözden geçirin; güvenilmeyen ya da atıl olanları kaldırın.
  • Google Haritalar API anahtarını kısıtlayın. Google Cloud konsolunda HTTP-referrer kısıtlamalarını kendi alan adlarınıza ayarlayın ve anahtarı yalnızca gerçekten çağırdığı API'lerle sınırlayın; böylece sızan bir anahtar site dışında çok daha az işe yarar.
  • Güvenilmeyen kullanıcılar düzenleyici erişimine sahip olduysa anahtarı döndürün (rotate edin) ve Google Cloud kullanımını anormallikler için izleyin.

7. Site sahipleri için tespit ve sağlamlaştırma

Hepsi doğrudan kusurun mekaniğinden çıkıyor:

  • Beklenmeyen çağrıları işaretleyin. admin-ajax.php üzerindeki google_map_api_key eylemine Katkıda Bulunan ya da Yazar oturumlarından gelen istekleri izleyin. Meşru hâlde bu okumayı yalnızca ayarı yapılandıran bir yönetici tetikler.
  • Haritalar anahtarını Google Cloud'da izleyin. Ani kullanım sıçramaları, tanıdık olmayan referrer veya bölgelerden gelen istekler, faturalandırma uyarıları — anahtarın sızdığının sinyalleri.
  • En az yetki ilkesini uygulayın. Katkıda Bulunan ve Yazar rollerini yalnızca gereken kullanıcılara verin; düşük yetkili hesabı olmayan bir sitede kusurun eyleyecek bir şeyi yoktur.
  • Sanal yama düşünün. Bu belirli AJAX eylemini yönetici olmayan oturumlar için engelleyen ya da doğrulatan bir WAF kuralı makul bir geçici çözüm — ama düzeltilmiş sürüme yükseltmenin yerini tutmaz.
  • Eklentileri güncel tutun ve üreticinin düzeltilmiş sürümünü çıkar çıkmaz uygulayın.

8. Daha geniş ders

İlke basit ve sürekli çiğneniyor: kimlik doğrulama ve CSRF koruması, yetkilendirme değildir. Nonce size isteğin gerçek olduğunu söyler; isteği yapanın veriye hak sahibi olup olmadığını söylemez. Ayrıcalıklı veri döndüren ya da değiştiren her uç nokta, o verinin hassasiyetine uygun açık bir yetki denetimi hak eder — elin altındaki geniş bir yetkiye değil.

İkinci ders simetri. Bir ayarın okuma ve yazma yolu varsa ikisi de aynı denetimi hak eder; çünkü saldırgan her zaman unutulan yolu yoklar. İnceleyiciler ve otomatik denetimler, bir yönetici seçeneği değerini o seçeneği yöneten yetkiden daha zayıf bir şeyin ardından döndüren her işleyiciyi işaretlemeli.

9. Sorumlu açıklama

Sorun, eklenti üreticisine özel olarak ve iyi niyetle, eşgüdümlü açıklama süreci kapsamında bildirildi. Kavram-kanıtı ayrıntısının tamamı — gerçek istek dizisi ve parametre değerleri — düzeltilmiş bir sürüm hazır olana ya da anlaşılan açıklama süresi dolana, hangisi önce gelirse, kadar bu halka açık yazıdan saklı tutuluyor. Canlı istismara olanak veren hiçbir şey yayımlanmadı.

Tüm testler, araştırmacının denetimindeki altyapıda, halka açık GPL eklentisiyle, yetkili ve yalıtılmış bir localhost laboratuvarında yapıldı. Üçüncü taraf ya da üretim sistemlerine dokunulmadı. Test ortamı ve test hesapları, yeniden üretimin ardından kaldırıldı.

Kaynaklar

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 düzeltme hazır olana dek saklı tutulur.

Bu hafta sömürülenler · her pazartesi

KEV'e girenler, yeni PoC'ler, WordPress triyajı ve bu hafta ne yapmalı. Hesap gerekmez.

Adresiniz yalnızca bu e-posta için kullanılır; üçüncü tarafla paylaşılmaz.

Sıradaki

GiveWP 4.18.0: Kimlik doğrulamasız bağışçı verisi sızıntısı (CWE-862)