Yazılar

PHP'de Yeni CVE-2026-115560 Zafiyeti: session.upload_progress ve Deserialization Analizi

PHP ekosisteminde duyurulan CVE-2026-115560 güvenlik bülteninin arkasındaki gerçek teknik mekanizma nedir? Haber sitelerinin abarttığı 'uzaktan sunucu ele geçirme' söylentilerinin aksine, session.upload_progress ve serialize_handler çakışmasının doğrulanmış analizi ve tek satırlık php.ini çözümü.

Furkan Özay24 Ekim 2026 · 3 dk okuma
czCZAY.DEV // EDITORIALTR
GÜVENLIK

#Güvenlik · 3 DK OKUMA

FURKAN ÖZAYVOL. 2026 // #2AD7

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:

  1. php (Varsayılan): Anahtar ve değerleri dikey çizgi (|) karakteriyle ayırarak yazar (kullanici_adi|s:6:"furkan";).
  2. php_serialize: Tüm oturum dizisini standart serialize() 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:

php
// Ç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:

  1. Dosya yükleme takibi (upload_progress), isteğin en başında php.ini'deki varsayılan ayarlarla oturum verisini hazırlar.
  2. Ardından senin kodun çalışma zamanında ini_set() ile serialize_handler ayarını değiştirir.
  3. 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:

ini
; Dosya yükleme ilerlemesinin oturuma (session) otomatik yazılmasını kapat
session.upload_progress.enabled = 0

Ardı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ç

Bunu da oku