PHP’de Kritik RCE Tehdidi: Resmi Yamalar Öncesi ve EOL Sürümlerde (PHP 7.4 & 8.0) Acil Sunucu Zırhlama Rehberi

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:

  1. 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.
  2. Yapay Bellek Aşımı: İstek bilerek sunucunun memory_limit sınırını zorlayacak şekilde şişirilir. PHP’nin Zend Bellek Yöneticisi bu aşım anında acil temizlik (bailout) yapmaya zorlanır.
  3. Pointer Ezme ve Kod Çalıştırma: Bellek temizliği sırasında manipüle edilen adresler sayesinde auto_prepend_file bellek 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

Acil Proje / İletişim WhatsApp