PHP ekosistemi, çekirdeğin en hassas noktalarından birini hedef alan kritik bir Uzaktan Kod Çalıştırma (RCE) alarmıyla sarsıldı. RFC1867 dosya yükleme mekanizması ve Zend Bellek Yöneticisi (ZendMM) üzerindeki bellek bozulması (memory corruption) açıklarını suistimal eden istismar zincirleri, saldırganlara herhangi bir kimlik doğrulamasına gerek kalmadan www-data yetkisiyle sunucuda rastgele kod çalıştırma imkanı sunuyor.
Resmi yamaların her Linux dağıtımına veya web kontrol paneline anında ulaşamadığı ilk saatlerde ve en önemlisi resmi desteği yıllar önce bitmiş (EOL) PHP sürümlerinde (7.4, 8.0, 8.1) bu açığı kökten etkisiz hale getirmek mümkündür.
Bu makalede; krizin teknik anatomisini, resmi güncelleme adımlarını ve en önemlisi eski PHP sürümleriyle çalışan sunucuları bozmadan nasıl tamamen zırhlayacağınızı adım adım bulabilirsiniz.
1. Krizin Anatomisi: Saldırganlar PHP’yi Nasıl Ele Geçiriyor?
Siber güvenlik çevrelerinde paylaşılan istismar demoları temel olarak şu zincirleme mekanizmaya dayanır:
- Kontrolsüz Bellek Doldurma: PHP’nin varsayılan olarak açık gelen
session.upload_progressözelliği suistimal edilir. Saldırgan, oturum başlatmamış olsa dahi multipart form yüklemeleriyle PHP worker sürecinin belleğine özel boyutlarda bayt dizilimleri enjekte eder. - Yapay Bellek Aşımı: İstek bilerek sunucunun
memory_limitsınırını zorlayacak şekilde şişirilir. PHP’nin Zend Bellek Yöneticisi bu aşım anında acil temizlik (bailout) yapmaya zorlanır. - Pointer Ezme ve Kod Çalıştırma: Bellek temizliği sırasında manipüle edilen adresler sayesinde
auto_prepend_filebellek işaretçisi (pointer) ezilir. Worker süreci çökmek yerine saldırganın belleğe bıraktığı zararlı PHP payload’ını yükler ve tam yetkili bir web shell elde edilir.
2. Resmi Desteği Olan Sürümler İçin Güncelleme
Eğer modern ve resmi desteği devam eden bir PHP sürümü kullanıyorsanız (PHP 8.2, 8.3, 8.4), birincil önceliğiniz resmi paket depolarından yamalı sürümlere geçmektir.
Ubuntu / Debian Ortamı
sudo apt update && sudo apt install --only-upgrade -y php8.3-fpm php8.3-cli
sudo systemctl restart php8.3-fpm
AlmaLinux / Rocky Linux / RHEL Ortamı
sudo dnf clean all && sudo dnf upgrade -y php php-fpm
sudo systemctl restart php-fpm
Sürüm doğrulaması için terminalden php -v çıktısını inceleyip güvenlik yamalı derlemeye geçildiğini teyit edin.
3. Asıl Tehlike: EOL Sürümler (PHP 7.4 & 8.0) ve Geç Kalan Paneller
Gerçek dünya koşullarında birçok kurumsal web sitesi, e-ticaret altyapısı ve eski framework’ler nedeniyle PHP 7.4 veya PHP 8.0 üzerinde kilitli kalmış durumdadır:
- PHP 7.4, Kasım 2022’de kullanım ömrünü (EOL) tamamladı.
- PHP 8.0, Kasım 2023’te EOL oldu.
PHP Core ekibi bu sürümler için resmi bir güvenlik yaması yayımlamaz. Ayrıca CyberPanel, cPanel veya özel derlenmiş Nginx/OpenLiteSpeed mimarilerinde paket depolarının güncellenmesi saatler, bazen günler alabilir.
Bu sürümleri kullanan sunucular kaderine mi terk edilecek? Kesinlikle hayır.
4. Sıfır Gün Kalkanı: PHP’yi Yeniden Derlemeden Zırhlama Yöntemi
Saldırganların geliştirdiği bellek bozma zinciri iki temel ayağa basar: session.upload_progress ve yapay memory_limit tetiklemesi. Bu iki parametreyi yapılandırarak saldırı zincirini henüz ilk adımında kırmak mümkündür.
Adım 1: Exploit Vektörünü Kökten Kapatın
İstismarın belleğe kontrolsüz veri yazmasını engellemek için php.ini dosyasında şu direktifi kapatın:
session.upload_progress.enabled = Off
Sitem Bozulur mu? (Geriye Dönük Uyumluluk):
Hayır. Bu özellik yaklaşık 10 yıl önce AJAX tabanlı dosya yükleme ilerleme çubukları için geliştirilmiştir. Günümüzde Laravel, modern WordPress, Vue, React veya modern e-ticaret sistemleri dosya yüklemelerini kendi API’leri ve istemci taraflı JavaScript mekanizmalarıyla takip eder. Bu ayarın kapatılması web sitelerinizin çalışmasını etkilemez.
Adım 2: Yapay Bellek Çökertmesini Engelleyin
Saldırganlar worker sürecini kasten memory_limit sınırına takarak bellek işaretçilerini ezer. Geçici zırhlama sürecinde sınır aşımı manipülasyonunu zorlaştırmak için bellek sınırını yükseltebilir veya kontrol altına alabilirsiniz:
memory_limit = -1
; veya yüksek trafikli sunucularda yüksek bir tavan:
; memory_limit = 1024M
Adım 3: İkincil Savunma Hattı (disable_functions)
Olası bir bellek manipülasyonunda saldırganın işletim sistemi kabuğuna (shell) sıçramasını engellemek adına, PHP’nin sistem komutu çalıştıran fonksiyonlarını sınırlandırmak kritik bir ek savunma katmanıdır:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
Kritik Uygulama ve Uyumluluk Notu:
Yukarıdaki liste, modern production sunucularımızda bizzat test ettiğimiz ve saldırı yüzeyini daraltmada tavsiye ettiğimiz fonksiyonları içerir. Ancak projenizde yer alan üçüncü parti kütüphaneler, artisan/CLI araçları, PDF oluşturucular (ör. WKHTMLTOPDF), kuyruk yöneticileri veya imaj işleme paketleri bu fonksiyonların bazılarına doğrudan bağımlı olabilir.
Bilinçsizce kapatılan bir fonksiyon uygulamanızın belirli servislerini kesintiye uğratabilir. Bu nedenle bu liste genel bir garanti veya mutlak bir reçete niteliğinde olmayıp; sunucunuza uygulamadan önce projenizin ve bağımlılıklarınızın hangi fonksiyonlara ihtiyaç duyduğunu analiz etmeli, projenizde kesinlikle kullanılmadığından emin olduğunuz fonksiyonları kademeli olarak devre dışı bırakmalısınız. Nihai mimari sorumluluk ve ortam testi tamamen sistem yöneticisine aittir.
5. Sunucudaki Tüm PHP Sürümlerini Tek Komutla Zırhlama (Toplu Otomasyon)
Sunucunuzda cPanel, Plesk, CyberPanel veya çoklu PHP (Multi-PHP) kuruluysa, her sürümün php.ini dosyasını tek tek aramakla vakit kaybetmeyin.
Aşağıdaki komut zinciri, sunucudaki tüm aktif php.ini dosyalarını bulur, session.upload_progress.enabled değerini otomatik olarak Off yapar ve PHP-FPM servislerini yeniden başlatır:
# Tüm php.ini dosyalarında upload_progress ayarını Off durumuna getirin
sudo find /etc/php /usr/local/lsws /opt/cpanel -name "php.ini" 2>/dev/null | while read ini_file; do
if grep -q "session.upload_progress.enabled" "$ini_file"; then
sudo sed -i 's/^;\?session.upload_progress.enabled = .*/session.upload_progress.enabled = Off/' "$ini_file"
else
echo "session.upload_progress.enabled = Off" | sudo tee -a "$ini_file" > /dev/null
fi
echo "Zırhlandı: $ini_file"
done
# PHP servislerini yeniden başlatın
sudo systemctl restart php*-fpm 2>/dev/null || sudo systemctl restart lsws 2>/dev/null
6. Doğrulama: Zırhlama Başarılı mı?
Sunucunuzun bu saldırı vektörüne karşı tamamen kapandığını CLI üzerinden teyit edin:
php -i | grep "session.upload_progress.enabled"
Beklenen Doğrulama Çıktısı:
session.upload_progress.enabled => Off => Off
Bu çıktıyı gördüğünüz anda, kullandığınız PHP sürümü 7.4 veya 8.0 olsa dahi, belleğe oturumsuz veri basma mekanizması tamamen kilitlendiği için RCE istismarı sunucunuzda çalışamaz hale gelir.
Çıkarılan Ders: Proaktif Refleks Hayat Kurtarır
Kritik sıfır gün ve bellek bozulması açıklarında güvenlik ekiplerinin resmi yamaları hazırlayıp paket depolarına sürmesi zaman alır. Bu bekleme süresi, saldırganların interneti tarayıp zafiyet barındıran sunucuları hedef aldığı en tehlikeli aralıktır.
Sistemin mimarisini anlamak, saldırının hangi parametre üzerinden belleğe sızdığını analiz etmek ve basit bir php.ini direktifiyle bu kapıyı erkenden kilitlemek, yüzlerce web sitesini olası bir veri sızıntısından ve tam yetkili sunucu ele geçirilmesinden kurtarır.
Bekir Bilgehan KÖKKUŞ
www.kokkus.com.tr
