PHP2Shell: PHP’de Kritik Kimliksiz Uzaktan Kod Yürütme — Yapılacaklar
Bu hafta PHP motorunun kendisinde açıklanan iki kritik güvenlik açığı — CVE-2026-109618 ve CVE-2026-109619, birlikte PHP2Shell adıyla anılıyor — anonim bir saldırganın kendi kodunu, uygulama kodunuz çalışmaya başlamadan sunucunuzda çalıştırmasını sağlıyor. Her ikisi de CVSS v4.0 ile 10 üzerinden 9.2 puanında, kimlik doğrulama gerektirmiyor ve kusurlar 5.4’ten (2012) beri her PHP sürümünde var. Web’in kabaca yüzde 70’i PHP üzerinde çalışıyor. Kendi kodunuzun temiz olması sizi korumaz.
Hafta nasıl gelişti
Ayrıntılar, 22 Ekim için planlanan eşgüdümlü açıklamadan önce sosyal medyaya sızdı; PHP ekibi acil sürümü 21 Ekim 14:00 UTC’ye öne çekti. Saldırı trafiği yama var olmadan önce gelmeye başlamıştı — Cloudflare o sabah 07:43’te probları kaydetti, altı saat daha erken. Bir exploit aracının yayımının yakın olduğu bekleniyor.
CVE-2026-109618: bellek tükenmesi yoluyla kod yürütme
Bellek ayırma isteğin ortasında başarısız olduğunda PHP, isteği iç veri yapıları yarıda başlatılmış durumdayken bırakabiliyor. Temizlik yordamları yine de çalışıyor — ve geçersiz, yarım kalmış bu veriyi geçerliymiş gibi işliyor. Saldırgan bu durumu, boyut limitlerinize sığıyormuş gibi görünen ama belleği tüketen özel bir multipart isteğiyle zorluyor.
Apache mod_php altında temizlik, istek başlatılması başarısız olsa bile çalışıyor; dolayısıyla exploit uygulamanızın tek satırı çalışmadan tetikleniyor — düz HTTP üzerinden, varsayılan limitlerle, tüm prefork işçilerinde.
CVE-2026-109619: bayat durum yoluyla kod yürütme
Bir isteğe ait iç durum, arkasındaki bellek serbest bırakıldıktan sonra bile kalabiliyor. Aynı işçinin üstlendiği bir sonraki istek, normal başlatma bu durumu sıfırlamadan önce bayat durumu kullanabiliyor — use-after-free’nin kod yürütmesine dönüştürülmüş hali; hem mod_php hem PHP-FPM için doğrulandı.
Kanıtlanmış tetik yolları egzotik hiçbir şey gerektirmiyor: oturum yükleme ilerlemesi (varsayılan olarak açık — uygulamanın session_start() çağırması gerekmez) ve PHP 8.5’te ölümcül hata geri izleri (bunlar da varsayılan açık).
Kimler etkileniyor
Web isteğine hizmet veren her PHP kurulumu — PHP-FPM, Apache mod_php, php-cgi, FrankenPHP ve LiteSpeed; en yüksek risk mod_php. Kimliksiz kod yürütme gerçek yazılımlara karşı gösterildi: Magento 2.4.9, WordPress 7.1.2, Drupal 11.4.3, Joomla 6.1.4, MediaWiki, Roundcube, phpMyAdmin, Nextcloud, Laravel, Symfony ve WHMCS. Kusur motorda olduğu için uygulamanın hatasız olması hiçbir şeyi değiştirmez.
Konu yalnızca kod yürütme değil. Araştırmacılar ayrıca kimlik doğrulaması gerektirmeyen işçi belleği sızıntısını kanıtladı — parolalar, oturum belirteçleri, API anahtarları ve TLS özel anahtarları, bir PHP oturum çerezi üzerinden ele geçebiliyor. Yama öncesi her maruz kalmayı olası bir sır sızıntısı olarak değerlendirin.
Sizi korumayan şeyler
İlk 24 saat, işe yaramazdan aktif zararlıya uzanan bir tavsiye dalgası üretti. Belgelenmiş başarısızlıklar:
RLIMIT_AS / RLIMIT_DATA limitleri. Aktif zararlı — CVE-2026-109618’i tetikleyen bellek ayırma hatasının kendisine yol açabilirler. Üretici açıkça uyarmaktadır.
error_reporting, display_errors veya @ ile hataları gizlemek. Gördüğünüzü değil, motorun yaptığını değiştirir; bayat duruma erişimi engellemez.
session.upload_progress.enabled=0’ı ini_set() veya .user.ini ile ayarlamak. Çok geç — bunlar, savunmasız yola dokunulmuş olan istek ayrıştırması sonrasında uygulanır. Ayar idari düzeyde, ayrıştırmadan önce yapılmalı ve işçiler yeniden başlatılmalıdır.
Konteyner/cgroup bellek limitini çözüm sanmak. Ayırma hataları yine mümkündür; en iyi durumda bir erişilebilirlik sınırıdır ve işçiler yalıtılmamışsa ana süreci ve tüm işçileri birden öldürebilir.
WAF’a güvenmek. Exploit, normal boyut limitleri içinde kalan sıradan görünen multipart trafiğiyle çalışıyor; Cloudflare halihazırda kaçınma girişimleri gözlemledi. WAF derinlemesine savunmadır, çözüm değil.
“Şüpheli kayıt yok, demek ki güvendeyiz.” Kayıt olmaması güvenliğin kanıtı değildir — başarılı bir bellek bozulması sömürüsü arkasında PHP hatası bırakmaz.
Sıradaki yama penceresini beklemek. Saldırı trafiği yamanın kendisinden de eski; bu, döngü dışı acil bir güncellemedir.
Nasıl korunursunuz
Her şeyi resmi bültenin tek cümlesi belirler: “Tam azaltmalar yoktur — güncelleme tek güvenli seçenektir.” Dalınıza göre PHP 8.5.12, 8.4.27, 8.3.36 veya 8.2.35’e güncelleyin — 21 Ekim’de yayınlandı; php.net, Linux dağıtımınız ya da LTS sağlayıcınız ve resmi Docker imajlarında mevcut. PHP 8.1, 8.0 ve 7.4 için yalnızca kaynak geri portları var; Remi deposunda bu konuda bir şey yok.
Yamaladıktan sonra: her PHP işçisini yeniden başlatın ve çalışan sürümü doğrulayın — paket sürümünü değil (php-fpm -i veya bir phpinfo() sayfası). Ardından web katmanının erişebildiği anahtarları döndürün — veritabanı parolaları, API anahtarları ve yama öncesi maruziyet düşünülüyorsa TLS özel anahtarları. Web köklerinde beklenmedik dosya olup olmadığına bakın ve çıkışları planlayın: PHP 8.2’nin ömrü 31 Aralık 2026’da bitiyor.
Bugün yamalayamıyorsanız
Bunlar, güncellemeyi planlarken belirli saldırı yollarını daraltır; yamalanmamış kurulumu güvenli yapmazlar. Ayarları idari katmanda uygulayın (php.ini, FPM havuzu veya Apache yapılandırması) ki uygulamalar geçersiz kılamasın, işçileri yeniden başlatın ve her birinin bir maliyeti olduğunu unutmayın.
; --- CVE-2026-109618: öngörülebilir OOM tetiğini kaldır ---
memory_limit = -1 ; yalnız idari düzeyde; sonlu limit geri getiren ayar kalmadığını doğrulayın
post_max_size = 8M ; yükleme gerekiyorsa 32M; upload_max_filesize bunun altında kalsın
; --- CVE-2026-109619: kanıtlanmış bayat-durum yollarını kapat ---
session.upload_progress.enabled = 0
fatal_error_backtraces = 0 ; yalnız PHP 8.5
; isteğe bağlı, performans bedeliyle:
; pm.max_requests = 1 ; FPM: istek başına taze işçi Nereden derinleşmeli
Yetkili kaynak php.net’teki resmi duyuru; ayrı bildiriler GHSA-w8hw-w9fx-j79w ve GHSA-6wmf-4rv5-p3rp. Okunmaya değer ilk müdahale analizleri: Qualys, Rapid7, Sansec, watchTowr, CERT-EU 2026-018 ve NCSC-UK duyurusu.