Siber güvenlik dünyasında yeni bir CVE (Common Vulnerabilities and Exposures) bülteni yayınlandığında, sosyal medyada ve haber sitelerinde çoğu zaman teknik gerçeklikten kopuk bir panik havası oluşur. Nitekim PHP ekosisteminde duyurulan CVE-2026-115560 zafiyetinde de birçok kaynak, olayı daha önceki HTTP başlık (header) açıklarıyla karıştırarak aktardı.
İyi bir backend mühendisinin görevi, kulaktan dolma başlıklarla panik yapmak değil; resmi güvenlik bültenini (GHSA-4966-6377-397r) açıp zafiyetin tam olarak hangi koşulda tetiklendiğini anlamaktır. Gelin CVE-2026-115560 (CVSS 6.4) açığının gerçek teknik anatomisini ve tek satırlık çözümünü inceleyelim.
1. Zafiyetin Kök Nedeni: PHP Oturumlarını (Session) Nasıl Kaydeder?
PHP'de $_SESSION içine koyduğun veriler diske veya Redis'e yazılmadan önce metin formatına dönüştürülür (serialize edilir). PHP'nin içinde bu işi yapan farklı session.serialize_handler motorları vardır:
php(Varsayılan): Anahtar ve değerleri dikey çizgi (|) karakteriyle ayırarak yazar (kullanici_adi|s:6:"furkan";).php_serialize: Tüm oturum dizisini standartserialize()fonksiyonuyla paketler ve|karakterini özel bir ayırıcı olarak kabul etmez.
Eğer bir uygulama oturumu yazarken de okurken de aynı motoru kullanırsa hiçbir sorun çıkmaz. Ancak veri bir formatla yazılıp diğer formatla okunursa, saldırganın gönderdiği metnin başındaki | karakteri PHP tarafından "Buradan sonrası yeni bir PHP nesnesidir, bunu unserialize() et!" şeklinde yorumlanır.
2. session.upload_progress ve ini_set() Çakışması Nasıl Oluşuyor?
PHP'nin php.ini dosyasında çoğu zaman varsayılan olarak açık (1) gelen session.upload_progress.enabled adında eski bir özellik vardır. Bu özellik açık olduğunda, bir kullanıcı sunucuya dosya yüklerken (multipart/form-data) isteğin içine PHP_SESSION_UPLOAD_PROGRESS adında bir alan eklerse; PHP daha senin yazdığın index.php koduna bile geçmeden, istek başlangıcında (request startup) oturum mekanizmasını otomatik olarak başlatır.
CVE-2026-115560 Tam Olarak Nerede Patlıyor?
Eğer sunucuda session.upload_progress.enabled = 1 açıksa ve senin PHP uygulaman çalışma zamanında (runtime) session_start() çağırmadan hemen önce şu satırı çalıştırıyorsa:
// Çalışma zamanında (runtime) serileştirme motorunu değiştirmek
ini_set('session.serialize_handler', 'php_serialize');
session_start();İşte felaket burada gerçekleşir:
- Dosya yükleme takibi (
upload_progress), isteğin en başındaphp.ini'deki varsayılan ayarlarla oturum verisini hazırlar. - Ardından senin kodun çalışma zamanında
ini_set()ileserialize_handlerayarını değiştirir. - Bu uyumsuzluk yüzünden, saldırganın dosya yükleme isteğinin içine gizlediği
|O:8:"ZararliSinif":...şeklindeki metin, oturum okunurken gerçek bir PHP nesnesiymiş gibi belleğe yüklenir (PHP Object Injection / Deserialization of Untrusted Data).
Bilgi: Neden CVSS Puanı 10.0 Değil de 6.4 (Orta-Yüksek)?
Bu açık, internetteki her PHP sunucusunun tek bir istekle vurulabileceği genel bir açık değildir. Bir sistemin etkilenmesi için iki şartın aynı anda sağlanması gerekir: Sunucuda session.upload_progress.enabled açık olmalı VE uygulama kodunun içinde çalışma zamanında ini_set('session.serialize_handler', ...) ile format değişikliği yapılmalıdır.
3. Nasıl Korunursun? (Tek Satırlık php.ini Çözümü)
1. Adım: PHP Sürümünü Güncelle
PHP ekibi bu yaşam döngüsü çakışmasını PHP 8.3, 8.4 ve 8.5 için yayınlanan güvenlik yamalarıyla kapattı. Paket yöneticin üzerinden (apt upgrade veya Docker imajı güncellemesi) son yama sürümüne geç.
2. Adım: session.upload_progress.enabled Ayarını Kapat!
Modern web geliştirmede dosya yükleme yüzdesini (progress bar) takip etmek için artık kimse PHP'nin sunucu taraflı oturum özelliğini kullanmıyor; bu iş tarayıcıda JavaScript (Fetch veya Axios onUploadProgress) ile çözülüyor. Dolayısıyla session.upload_progress özelliğinin canlı sunucularda açık kalması tamamen gereksiz bir saldırı yüzeyidir.
Sunucundaki php.ini dosyasını aç ve şu satırı kalıcı olarak 0 yap:
; Dosya yükleme ilerlemesinin oturuma (session) otomatik yazılmasını kapat
session.upload_progress.enabled = 0Ardından php-fpm servisini yeniden yükle (sudo systemctl reload php8.3-fpm). Böylece hem CVE-2026-115560 zafiyetini hem de gelecekte upload_progress üzerinden çıkabilecek tüm oturum enjeksiyonu risklerini kökünden kapatmış olursun.
İlgili Kısa Video & Güvenlik Analizlerimiz
İnteraktif Yol Haritası & Araç
Junior Backend Developer 2026
2026'da junior backend pozisyonuna girmek isteyen biri gerçekten neyi bilmeli, neyi sonraya bırakabilir — ilanlardaki buzzword tuzaklarını ayıklayarak.
SQL mi NoSQL mi?
Altı soruya cevap ver, projene hangi tür veritabanının uyduğunu ve nedenini söyleyeyim.
Bunu da oku
- CZTROrtalık Çok Karışık: Backend Geliştirmeye Başlarken Hangi Dil ve Framework Seçilmeli? (2026 Karar Rehberi)
Ortalık Çok Karışık: Backend Geliştirmeye Başlarken Hangi Dil ve Framework Seçilmeli? (2026 Karar Rehberi)
25 Ekim 2026 · 5 dk okuma - CZTRIDOR (Insecure Direct Object Reference) Açığı Nedir? Authentication vs Authorization Farkı ve Çözümü
IDOR (Insecure Direct Object Reference) Açığı Nedir? Authentication vs Authorization Farkı ve Çözümü
24 Ekim 2026 · 3 dk okuma