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
| Soru | Neyi kontrol ettim | Güven | Sı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üksek | Apache 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üksek | Farklı 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üksek | CISA 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.
Bu analiz için kullanılan kanıtlar
Sürüm ve sömürü durumu değişebilir; üretici kayıtlarını takip edin.
Yazar teknik incelemeyi tamamladı. Bu etiket tek başına laboratuvar yeniden üretimi iddiası taşımaz.
