60 saniyede CVE-2024-4577

Bazı Windows web sunucusu yapılandırmaları php-cgi.exe sürecini başlatır ve içinde eşittir işareti (=) bulunmayan bir sorgu dizesini (query string) doğrudan komut satırı argümanlarına dönüştürür. PHP, 2012 yılından beri tire (-) ile başlayan tehlikeli argümanları engellemeye çalışıyordu. CVE-2024-4577 zafiyeti bu kontrolü atlatmayı başardı; çünkü Windows işletim sistemi, PHP girdiyi onayladıktan sonra, farklı bir karakteri ASCII tire (-) işaretine dönüştürüyordu (Best-Fit Mapping).

Saldırı yolu (attack path) şu şekilde gerçekleşti:

Windows üzerindeki bir PHP-CGI rotasına HTTP isteği
  -> Query string tire ("-") ile başlamıyor gibi görünür
  -> PHP'nin 2012 yılından kalma güvenlik kontrolü opsiyon ayrıştırmasına izin verir
  -> Windows best-fit karakter dönüşümü baştaki karakteri "-" yapar
  -> php-cgi.exe saldırgan tarafından seçilen komut satırı opsiyonlarını çalıştırır
  -> Web servisi hesabı altında uzaktan rastgele PHP kodu (RCE) çalışır

Bu zafiyet her PHP web sitesini etkilemedi. Yüksek etkili saldırı yolu; Windows üzerinde PHP-CGI kullanılmasını, sorguyu komut satırı argümanlarına ileten bir web sunucusu eşlemesini (mapping), ilgili bir kod sayfası (code-page) dönüşümünü ve savunmasız bir PHP sürümünü gerektiriyordu. CISA’nın Bilinen İstismar Edilen Zafiyetler (KEV) kataloğu bu açığın vahşi doğada aktif olarak kullanıldığını doğrulamaktadır.

CGI, Option Parsing ve Windows Best-Fit dönüşümü nedir?

CGI, bir web sunucusu ile uygulama arasındaki süreç arayüzüdür. Etkilenen PHP modunda, bir HTTP sorgusunun bir kısmı php-cgi.exe için argüman vektörüne (argv) dönüşebilir. PHP parametreleri bir tire ile başlar; bu nedenle bu argümanları kontrol etmek, yalnızca uygulama verisi sağlamak yerine doğrudan yorumlayıcı (interpreter) yapılandırmasını değiştirebilir (örneğin -d allow_url_include=1 -d auto_prepend_file=...).

Windows, karakterleri Unicode ile eski kod sayfaları arasında dönüştürür. Bir “best-fit” (en iyi uyum) eşlemesi, hedef kod sayfasında tam karşılığı olmayan bir karakteri görsel veya işlevsel olarak benzer bir karakterle değiştirebilir. Güvenlik problemi; doğrulama mekanizmasının dönüştürme öncesi karakteri görmesi, ancak komut ayrıştırıcının dönüştürme sonrası tireyi (-) görmesi durumunda ortaya çıkar.

Ne oldu?

PHP’nin 2012 yılında geliştirdiği savunma, eşittir işareti içermeyen sorguları decode ediyor ve ilk anlamlı karakter - olduğunda komut satırı opsiyon ayrıştırmasını kapatıyordu (skip_getopt). Etkilenen Windows kod sayfalarında (özellikle geleneksel Çince, basitleştirilmiş Çince ve Japonca dillerini kullanan sistemlerde), farklı bir bayt dizisi (örneğin soft hyphen %ad) bu testi geçebiliyor ve Windows süreç komut satırını oluştururken tireye dönüşebiliyordu. PHP bir temsili yetkilendirdi, ancak işletim sistemi diğer temsili yürüttü.

Haziran 2024 sürümleri (8.1.29, 8.2.20, 8.3.8) CVE-2024-4577 için dönüşüm duyarlı bir kontrol ekledi. Ancak standart dışı kod sayfaları bu modeli de atlatmayı başardı (CVE-2024-8926). Eylül 2024 sürümleri (8.1.30, 8.2.24, 8.3.12) daha köklü bir çözüme gitti: Windows üzerinde, işletim sisteminin her karakter dönüşümünü tahmin etmeye çalışmak yerine CGI ve FastCGI’ın bu yoldan gelen komut satırı opsiyonlarını ayrıştırması tamamen kapatıldı (skip_getopt = cgi || fastcgi).

Evidence matrix

SoruNeyi kontrol ettimGüvenSınır
Zafiyetten hangi sürümler etkilendi?8.3.8 / 8.2.20 / 8.1.29 öncesini ve Eylül 2024 sürümleriyle nihai çözümü doğruladım.YüksekÖzel derlemeler ve Windows kod sayfası ayarları yerel inceleme gerektirir.
Yolu ne tetikliyor?Windows üzerinde PHP-CGI çalıştıran web sunucusuna özel kodlanmış bir query string gönderilmesi.YüksekApache mod_cgi / FastCGI konfigürasyonuna bağlıdır.
Best-fit dönüşümü neden tehlikeli?Geniş karakterli Unicode girdisinin Windows WideCharToMultiByte API’si ile ASCII tireye çevrilmesi.YüksekFarklı Windows sistem yerelleri farklı karakterleri dönüştürür.
Kod çalıştırma (RCE) kanıtlandı mı?-d auto_prepend_file=php://input argüman enjeksiyonu ile RCE vahşi doğada istismar edildi.YüksekCISA KEV ve kamuya açık PoC kayıtları ile doğrulandı.

Sonuç

PHP sürümünüzü derhal 8.3.12, 8.2.24, 8.1.30 veya daha güncel bir sürüme yükseltin. Mümkün olan her yerde eski PHP-CGI mimarisinden modern ve izole PHP-FPM mimarisine geçin.

Zafiyetin bize öğrettiği temel mimari ders şudur: Doğrulama katmanı ile çalıştırma katmanı farklı karakter kümesi yorumlayıcılarına (parser/encoding) sahip olduğunda, aradaki çeviri boşluğu daima bir bypass vektörüne dönüşür. Kalıcı çözüm dönüşümü tahmin etmeye çalışmak değil, güvenilmeyen kanaldan gelen opsiyon ayrıştırmasını tamamen durdurmaktır.

Kaynaklar ve sınırlar

Bu analiz için kullanılan kanıtlar

Kontrol edilen kaynaklar24 Ağustos 2026

Sürüm ve sömürü durumu değişebilir; üretici kayıtlarını takip edin.

İnceleme DurumuYazar incelemesi tamamlandı

Yazar teknik incelemeyi tamamladı. Bu etiket tek başına laboratuvar yeniden üretimi iddiası taşımaz.

◈ Bu Araştırmayı Kaynak GösterBibTeX · Markdown

Bu araştırma notunu, CVE analizini veya bulgularını akademik çalışmalarınızda ya da güvenlik bültenlerinizde atıfta bulunmak için kopyalayabilirsiniz:

@misc{jankesec_php_cgi_best_fit_cve_2024_4577_2026,
  author       = {Sevban D\"{o}nmez},
  title        = {CVE-2024-4577: Windows'un PHP-CGI Komut Enjeksiyonunu Yeniden Açması},
  year         = {2026},
  howpublished = {\url{https://jankesec.com/tr/arastirma/php-cgi-best-fit-cve-2024-4577/}},
  note         = {jankesec technical security research (CVE-2024-4577, CVE-2024-8926)}
}