Kubernetes CVE Kayıt Düzeltmesi: Tarayıcılarınız Şaşıracak
Geçenlerde Kubernetes Security Response Committee’den (SRC) gelen bir duyuru, sahada uzun zamandır konuştuğumuz bir şeyi nihayet resmileştirdi: bazı eski CVE kayıtlarında “fixed version” alanı var. Açık aslında kapanmamış. Yanı kâğıt üstünde “düzeltildi” yazıyor, gerçekte işe öyle değil. Şaşırdım mı? Pek sayılmaz. Uzun süredir küme yöneten biriyseniz, bu üç dört CVE’nın zaten biraz “design trade-off” koktuğunu bilirsiniz; ama tarayıcıların buna göre rapor basması ayrı bir meseleydi, işte asıl gürültü de oradan çıktı.
Dürüst olmak gerekirse, 1 Haziran 2026 itibarıyla SRC bu kayıtları düzeltecek. Evet, tarih net. Sonuç da biraz sert olacak: vulnerability scanner’larınız bir sabah kalktığında, dün “temiz” dediği kümelerde aniden açık göstermeye başlayacak. Kısacası, peki neden? Çünkü ortamda yeni bir şey patlamıyor; sadece kayıtlar nihayet gerçeğe yaklaşıyor. Kafa karıştırıcı mı? Biraz.
Bu yazıda hem teknik tarafı anlatacağım hem de Türkiye’deki kurumsal müşteri tarafında bunun ne anlama geldiğini, hangi mitigasyonlarla yola devam edebileceğinizi paylaşacağım. Azure Kubernetes Service (AKS) kullananlar için de ayrıca not düşeceğim. Orada işin rengi biraz değişiyor, hani her zaman olduğu gibi.
Olay tam olarak nedir?
Kısa cevap şu: Kubernetes ekibi, OSV (Open Source Vulnerabilities) formatında resmî feed üretirken bazı eski CVE kayıtlarının yanlış işaretlendiğini fark etti. Mesela CVE-2020-8561, CVE-2020-8562 ve CVE-2021-25740 için kayıtlarda bir “fixed version” görünüyor. Ama işin aslı, bu açıklar o klasik anlamda kapatılmadı; hatta kapatılmaya çalışılsa, Kubernetes’in temel davranışı bozulurdu.
Bakın, burayı atlarsanız yazının kalanı anlamsız kalır.
SRC şimdi bu kayıtları “tüm sürümleri etkiler, fix yok” diye güncelliyor. Bir de CVE-2020-8554 var; onun durumu zaten doğruydu, sadece versiyon gösterimi biraz daha standart hâle gelecek. Evet, mesele bu kadar sade. Ama kafa karıştıran tarafı da tam burada başlıyor.
Burada altı çizilmesi gereken şey şu: Bu açıklar yeni değil. Yıllardır biliniyor. Sadece kayıt sistemindeki bir tutarsızlık düzeltiliyor. Yanı ortamınız bugünden yarına daha “güvensiz” hâle gelmiyor — sadece tarayıcılarınız artık doğru bilgiyi görecek.
Neden “fix” yok? Bu nasıl bir mantık?
Küçük bir detay: Açık konuşayım: Bazı güvenlik sorunlarını kod değiştirerek kapatamazsınız. Çünkü ortadaki şey, (belki yanılıyorum ama) kodun yapması gereken meşru bir davranışın yan etkisi oluyor; yanı kötü görünen kısım, aslında başka bir senaryoda işe yarayan mekanizmanın kendisi. Klasik örnek de şu: HTTP redirect takip etme. kube-apiserver, admission webhook’larla konuşurken HTTP redirect’leri izliyor, bunu kaldırırsanız dünya genelinde baya fazla meşru entegrasyon kırılır (ve sonra herkes size dönüp bakar), ama bu davranış yerinde durdukça da AdmissionWebhookConfiguration’ı yapılandırabilen biri sunucuyu iç ağdaki adreslere yönlendirebilir.
Yanı, İşte mesele burada düğümleniyor. Bu yüzden bu açıklar “architectural trade-off” tarafında dürüyor. Çözüm kodda değil; idarede, yetki yönetiminde ve network policy’lerinde (kendi tecrübem). Yanı top biraz sizin sahada. Peki, peki neden? Çünkü böyle durumlarda asıl iş, sistemi nasıl kullandığınızda bitiyor.
Şey… aslında şaşırtıcı değil.
Üç açığı tek tek konuşalım
CVE-2020-8561: kube-apiserver webhook redirect
Severity: Orta (4.1). Hikâye kabaca şu: kube-apiserver, admission webhook’a istek atarken, webhook bir HTTP 3xx redirect dönerse önü izliyor. Kulağa küçük bir detay gibi geliyor, ama değil; saldırgan AdmissionWebhookConfiguration tarafına erişim alırsa, API server’ı iç ağdaki başka bir endpoint’e çevirebiliyor. Yanı işin özü SSRF’e çıkıyor.
Bunu yaşayan biri olarak söyleyeyim, Sahada bunu en çok şu durumda dert ediyoruz: multi-tenant kümelerde, namespace seviyesinde yetki verilmiş bir kullanıcının ValidatingWebhookConfiguration oluşturma hakkı da varsa. İlk bakışta “eh, sadece webhook” diyorsunuz. Sonra olay dönüp dolaşıp iç servislere kadar gidiyor (inanın bana). Açık konuşayım, insanı en çok şaşırtan kısım da bu oluyor.
Mitigasyon tarafında ben üç şeye bakıyorum. Birincisi, API server log level’ını 10’un altında tutun; çünkü yoksa response body’ler de log’a düşebiliyor. Redirect ile çekilen iç servis cevapları ortalıkta gezmeye başlıyor. İkincisi, --profiling=false bayrağını açın; bunu kapatmadan rahat etmek zor. Üçüncüsü de AdmissionWebhookConfiguration oluşturma yetkisini RBAC’te baya sıkı kısıtlayın, (evet, doğru duydunuz). Bunu cluster-admin gibi düşünmek daha doğru oluyor.
Ve işler burada ilginçleşiyor.
Evet.
CVE-2020-8562: TOCTOU ile proxy bypass
Eh, Bu açık biraz daha sinsi. Severity düşük (3.1), ama insanın kafasını kurcalıyor; Time-of-Check to Time-of-Use yarış koşulu var burada. API server proxy önce hostname’i çözüyor, “tamam bu izinli IP” diyor, sonra isteği gönderiyor. O aradaki birkaç milisaniyede DNS cevabı değişirse check edilen IP ile kullanılan IP farklı hâle gelebiliyor.
Nasıl desem, exploit etmek öyle kolay değil. Ama zaten tam da bu yüzden fix’i de rahat olmuyor; DNS davranışını kökten değiştirmek gerekiyor ve bu da başka yerleri bozabiliyor (özellikle mevcut cluster alışkanlıklarını). Peki bunu neden söylüyorum? Yanı çözüm var ama fiyatı biraz can sıkıyor.
Vallahi, Ben burada mitigasyon olarak API server’ın ağ erişimini sıkı tutmayı tercih ederim. AKS kullanıyorsanız private cluster ile dedicated subnet ikilisi fena iş görmüyor, hatta çoğu senaryoda yeterince rahatlatıyor diyebilirim.
Bi saniye — Daha açık söyleyeyim, peki neden?
CVE-2021-25740: Endpoint slice’lar üzerinden NetworkPolicy bypass
Buradaki mesele şu: Bir kullanıcı başka bir namespace’teki servise yönelik Service veya Endpoint oluşturabiliyorsa, NetworkPolicy’leri pratikte devre dışı bırakabiliyor. Çünkü policy tarafı genelde label selector mantığıyla ilerliyor; ama Service/Endpoint eşlemesi ayrı bir katman ve orada işler biraz kayıyor. Daha fazla bilgi için Outcome-Driven Learning: OpenEnv ve Foundry ile Kurumsal RL yazımıza bakabilirsiniz.
Yukarıda anlattığım o katman ayrımı var ya, işte açık tam oraya basıyor. İnsan ilk anda “policy var ya sorun olmaz” diye düşünüyor (en azından benim deneyimim böyle). Sonra yetki modeliyle servis keşfi birbirine girince tablo değişiyor. Hatta bazen en temiz görünen mimarı bile burada beklenmedik şekilde tökezleyebiliyor.
Bunun fix’i ne olurdu? NetworkPolicy semantiğini komple değiştirmek olurdu ki bunu yapmak kolay değil; yaparsanız onbinlerce production cluster’ı kırarsınız (şaka gibi ama değil) (evet, doğru duydunuz). O yüzden mesele teknik olarak bilinse de operasyonel olarak dokunması zor kalıyor.
Tarayıcılarınız ne diyecek? Bekleyebileceğiniz sürpriz
Peki, bunu yaşayan biri olarak söyleyeyim, Şimdi işin biraz can sıkıcı tarafına gelelim. 1 Haziran’dan sonra şöyle bir tablo çıkabilir: Trivy, Grype, Aqua, Prisma, Defender for Cloud gibi tarayıcılar OSV feed’ını ya da NVD’yi çekiyor olacak ve bu üç CVE için “affected: all versions, no fix” satırını görmeniz çok olası (eh, fena değil). Yanı durum kabaca şu; sistem temiz sanıyorsunuz, ama tarayıcı başka bir şey söylüyor (ve açık konuşayım, bazen asıl kavga da burada başlıyor).
| Senaryo | Önce | 1 Haziran sonrası | |
|---|---|---|---|
| Kubernetes 1.28 cluster | “Temiz” (yanlış) | 3 CVE listelenecek | |
| AKS 1.30 | “Temiz” (yanlış) | 3 CVE listelenecek | |
| En son sürüm Kubernetes | “Temiz” | 3 CVE listelenecek |
Bu içerik işinize yaradı mı?
Benzer içerikleri kaçırmamak için beni sosyal medyada takip edin.










Yorum gönder