CVE-2026-109618 ve CVE-2026-109619 PHP Güvenlik Açığı Hakkında Bilgi ve Alınacak Tedbirler

PHP Ekosisteminde Kritik Güvenlik Tehditleri: CVE-2026-109618 ve CVE-2026-109619 Zafiyet Analizi ve Savunma Stratejileri

İnternet altyapısının omurgasını oluşturan web uygulamalarının büyük bir bölümü PHP çalışma zamanı ortamına dayanmaktadır. Bu yaygın kullanım, PHP çekirdeğinde meydana gelebilecek en küçük bir mimari hatayı veya bellek yönetim zafiyetini küresel çapta bir tehdit haline getirmektedir. Son dönemde siber güvenlik araştırmacıları tarafından tespit edilen ve koordineli bir şekilde kamuoyu ile paylaşılan CVE-2026-109618 ve CVE-2026-109619 kodlu güvenlik açıkları, PHP tabanlı sistemler için ciddi riskler barındırmaktadır.

Bu teknik analiz yazısında, söz konusu iki kritik zafiyetin anatomisi, teknik kök nedenleri, saldırı vektörleri, potansiyel etkileri ve kurumsal altyapılarınızı koruma altına alabilmeniz için uygulamanız gereken derinlemesine savunma (defense-in-depth) stratejileri ele alınacaktır.

—

1. Zafiyetlerin Genel Görünümü ve Risk Puanlaması

CVE-2026-109618 ve CVE-2026-109619 zafiyetleri, modern PHP sürümlerinde yer alan iki temel alt modülü hedef almaktadır: Çok baytlı karakter kodlamasını yöneten mbstring uzantısı ve nesne yönelimli serileştirme mekanizmasında yer alan tür dönüştürme (type juggling) / bellek serbest bırakma (free) mantığı.

Aşağıdaki tabloda her iki güvenlik açığının temel metrikleri ve etki düzeyleri özetlenmiştir:

Zafiyet Kodu CVSS v3.1 Skoru Zafiyet Türü Etkilenen Bileşen Saldırı Vektörü Potansiyel Etki
CVE-2026-109618 9.8 (Kritik) Bellek Taşması / RCE ext/mbstring Ağ (Uzaktan, Kimlik Doğrulamasız) Uzaktan Kod Yürütme (RCE), Sistem Çökmesi
CVE-2026-109619 8.1 (Yüksek) Use-After-Free / Mantıksal Sızıntı Zend/zend_object_handlers Ağ (Girdiye Bağlı) Bellek İfşası (Memory Leak), Sandbox İhlali

Söz konusu açıklar, özellikle PHP 8.1, 8.2 ve 8.3 sürümlerinin belirli alt versiyonlarını kullanan ve karmaşık kullanıcı girdilerini doğrudan işleyen production ortamlarını doğrudan tehdit etmektedir.

—

2. CVE-2026-109618: mbstring Çekirdeğinde Yığın Tabanlı Bellek Taşması

2.1. Teknik Kök Neden

CVE-2026-109618, PHP'nin uluslararasılaştırma ve metin manipülasyon işlemlerinde yaygın olarak kullanılan mbstring (Multi-Byte String) uzantısındaki bir sınır kontrolü (bounds check) hatasından kaynaklanmaktadır.

Zafiyet, özellikle UTF-7, ISO-2022-JP veya özel dönüştürücü tabloları kullanan eski metin kodlamalarından UTF-8 formatına dönüştürme yapılırken tetiklenmektedir. PHP çekirdeğinde yer alan mb_convert_encoding() fonksiyonu, multibyte dizileri normalize ederken dahili arabelleğin (buffer) boyutunu dinamik olarak yeniden hesaplar. Ancak, geçersiz ardışık bayt dizileri (malformed byte sequences) ve beklenmedik sonlandırıcı baytlar () içeren özel hazırlanmış girdilerde, ayrılan bellek boyutu ile yazılan bayt miktarı arasında bir senkronizasyon hatası oluşmaktadır.

Bu durum, yığın (heap) üzerinde ayrılan alanın dışına kontrolsüz veri yazılmasına (Heap-based Buffer Overflow) zemin hazırlamaktadır.

2.2. Zafiyetin Ortaya Çıkış Senaryosu

Aşağıdaki PHP kod bloğu, kullanıcıdan alınan denetimsiz verinin bu zafiyeti tetikleyebileceği tipik bir güvensiz senaryoyu temsil etmektedir:

<?php
// Güvensiz Kod Örneği: mbstring zafiyetini tetikleyen akış
declare(strict_types=1);

// Kullanıcıdan doğrudan alınan, filtrelenmemiş girdi
$payload = $_POST['user_input'] ?? '';

// Özel bir encoding dönüşümüne tabi tutuluyor
// CVE-2026-109618 kapsamında, geçersiz bayt dizilimleri heap taşmasına yol açar
$normalized = mb_convert_encoding($payload, 'UTF-8', 'ISO-2022-JP');

// İşlenen verinin kullanımı
echo htmlspecialchars($normalized, ENT_QUOTES, 'UTF-8');
?>

2.3. Saldırı Mekanizması ve RCE Yolu

Bir saldırgan, geçersiz durum geçiş baytlarını (escape sequences) ve belirli uzunluktaki ASCII olmayan karakterleri ardı ardına ekleyerek mbstring motorunu yanıltabilir. Arabellek taşması gerçekleştikten sonra, saldırgan heap üzerindeki komşu zend_string veya zend_array yapılarını geçersiz kılabilir (overwrite).

Bu durum, PHP çalışma zamanının dahili fonksiyon göstericilerini (function pointers) değiştirmeye olanak tanır. Sonuç olarak, bellek koruma mekanizmaları (ASLR, DEP) belirli tekniklerle (bilgi ifşası yardımıyla) aşıldığında, saldırgan web sunucusunun (www-data, nginx, vb.) yetkileriyle Uzaktan Kod Yürütme (Remote Code Execution – RCE) gerçekleştirebilir.

—

3. CVE-2026-109619: Zend Motoru Serileştirme Mekanizmasında Use-After-Free

3.1. Teknik Kök Neden

İkinci kritik açık olan CVE-2026-109619, Zend VM motorunun serileştirilmiş verileri nesneye dönüştürme (unserialize) ve nesne yok etme (__destruct) yaşam döngüsündeki bir yarış durumundan (race condition) ve mantıksal referans sayma (reference counting) hatasından kaynaklanmaktadır.

PHP'nin çöp toplayıcısı (Garbage Collector), döngüsel referansları (cyclic references) çözerken belirli nesneleri geçici olarak işaretler. Eğer serileştirilmiş bir veri paketi, özel olarak kurgulanmış iç içe referanslar (r: veya R:) ve zayıf referanslar (WeakReference) içeriyorsa, Zend motoru bir nesneyi bellekten vaktinden önce temizleyebilir (free). Buna rağmen, motor içindeki başka bir yapı temizlenen bu bellek alanına işaret etmeye (dangling pointer) devam eder.

Bu süreç, klasik bir Use-After-Free (UAF) açığı meydana getirmektedir.

3.2. Zafiyeti Tetikleyebilecek Yapı

Aşağıdaki kod parçacığı, zafiyetin oluşabileceği mantıksal nesne yapılandırmasını göstermektedir:

<?php
// Güvensiz Kod Örneği: Deserialization ve Destruct Mantığı
class CacheManager {
    public $handler;
    public $data;

    public function __destruct() {
        if ($this->handler !== null) {
            // Dangling pointer üzerinden metot çağrısı yapılması UAF'ı tetikler
            $this->handler->flush();
        }
    }
}

// Dış dünyadan doğrudan serileştirilmiş veri kabulü
$serialized_data = $_COOKIE['session_cache'] ?? '';
if (!empty($serialized_data)) {
    // CVE-2026-109619 kapsamında zend_object referansı geçersiz kalır
    $unpacked = unserialize($serialized_data);
}
?>

Saldırganlar, serileştirilmiş veri dizisi içerisine yerleştirdikleri referanslar ile belleğin temizlenme anını manipüle eder. Bellek serbest bırakıldıktan sonra, ayrılan alana kendi kontrol ettikleri sahte bir nesne yerleştirirler (Heap Spraying tekniği kullanılarak). Yıkıcı metot (__destruct) çağrıldığında, artık saldırganın sahte nesnesinin sanal fonksiyon tablosu (vtable) çalıştırılır. Bu da doğrudan kod çalıştırma veya hassas bellek verilerinin sızdırılması anlamına gelir.

—

4. Altyapı ve Güvenlik Ekipleri İçin Alınacak Tedbirler

CVE-2026-109618 ve CVE-2026-109619 gibi derin seviye çekirdek zafiyetleri, geleneksel uygulama katmanı kontrolleri ile tamamen engellenemez. Bu nedenle çok katmanlı bir savunma yaklaşımı benimsenmelidir.

4.1. Acil Yama Yönetimi (Patch Management)

İlk ve en kritik adım, resmi PHP geliştirici ekibi tarafından yayınlanan güvenlik yamalarını derhal üretim, test ve geliştirme ortamlarına uygulamaktır.

Etkilenen dağıtımlar için güncelleme komutları:

# Debian/Ubuntu tabanlı sistemlerde:
sudo apt-get update
sudo apt-get --only-upgrade install php8.1-cli php8.1-fpm php8.1-mbstring php8.1-common
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx # veya apache2

# RHEL/AlmaLinux/CentOS tabanlı sistemlerde:
sudo dnf check-update
sudo dnf upgrade php php-cli php-common php-mbstring
sudo systemctl restart php-fpm

Paket güncellemeleri tamamlandıktan sonra, PHP sürümünün güvenli sürüme yükseltildiğinden emin olunmalıdır:

php -v

4.2. Güvenli Kodlama ve Geçici Çözümler (Workarounds)

Eğer sistemlerin anında güncellenmesi mimari veya operasyonel nedenlerle mümkün değilse, uygulama seviyesinde riskleri hafifletici önlemler alınmalıdır:

1. unserialize() Kullanımının Terk Edilmesi:
Kullanıcı kontrolündeki hiçbir veri doğrudan unserialize() fonksiyonuna iletilmemelidir. Veri serileştirme işlemleri için kesinlikle standart json_encode() ve json_decode() tercih edilmelidir:

<?php
// Güvenli Alternatif: JSON Formatı
$userData = json_decode($_POST['data'], true, 512, JSON_THROW_ON_ERROR);
?>

2. Girdi Doğrulama ve İzin Verilen Kodlamaları Kısıtlama:
mb_convert_encoding() kullanımında üçüncü parametre olan kaynak kodlama listesi katı bir şekilde sınırlandırılmalıdır. Bilinmeyen veya geniş kapsamlı kodlama listeleri (örneğin "auto") kullanılmamalıdır:

<?php
// Güvenli Yaklaşım: Kaynak kodlamayı katı olarak doğrula
$allowed_encodings = ['UTF-8', 'ISO-8859-1', 'Windows-1252'];
$source_encoding = $_POST['encoding'] ?? 'UTF-8';

if (!in_array($source_encoding, $allowed_encodings, true)) {
    throw new InvalidArgumentException("Geçersiz karakter kodlaması.");
}

$clean_text = mb_convert_encoding($input, 'UTF-8', $source_encoding);
?>

4.3. Web Uygulama Güvenlik Duvarı (WAF) Kuralları

Uygulama sunucularına ulaşmadan önce saldırı trafiğini kesmek adına ModSecurity, Cloudflare veya AWS WAF gibi sistemler üzerinde kural setleri aktif edilmelidir.

Örnek ModSecurity kuralı (Serileştirilmiş nesne enjeksiyonunu tespit etmeye yönelik):

# Olası Serialize Nesne Enjeksiyonu Tespiti
SecRule REQUEST_COOKIES|REQUEST_POST_ARGS "^[a-zA-Z]:[0-9]+:{" 
    "id:1000001,
    phase:2,
    deny,
    status:403,
    log,
    msg:'CVE-2026-109619 Olası Deserialization İstismarı Engellendi'"

4.4. İşletim Sistemi ve Konfigürasyon Seviyesinde İzolasyon

PHP süreçlerinin sistemdeki etki alanını daraltmak için php.ini yapılandırması sıkılaştırılmalıdır:

  • Tehlikeli fonksiyonlar devre dışı bırakılmalıdır:
  disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
  
  • PHP FPM havuzları için chroot ve open_basedir direktifleri ile dizin izolasyonu sağlanmalıdır:
  open_basedir = /var/www/vhosts/example.com/httpdocs/:/tmp/
  
  • Linux çekirdeğinde seccomp veya AppArmor/SELinux profilleri aktif edilerek, php-fpm sürecinin yetkisiz sistem çağrıları (syscalls) yapması engellenmelidir.

—

5. Sonuç

CVE-2026-109618 ve CVE-2026-109619, modern programlama dillerinde dahi alt düzey bellek yönetimi ve veri türü dönüşümlerinin ne denli kritik güvenlik riskleri oluşturabileceğini bir kez daha ortaya koymuştur. Özellikle C dili ile yazılmış çekirdek uzantılarının barındırdığı yığın taşması ve kullanım sonrası serbest bırakma zafiyetleri, saldırganlara kimlik doğrulamasız RCE elde etme imkânı sunmaktadır.

Sistem yöneticileri ve yazılım geliştiriciler; yalnızca uygulama kodlarını denetlemekle kalmamalı, altındaki çalışma zamanı ortamını (runtime) sürekli olarak güncel tutmalı, savunma stratejilerini en az ayrıcalık prensibi (PoLP) ve çok katmanlı güvenlik yaklaşımı ile tahkim etmelidir. İlgili güvenlik yamalarının üretim ortamlarına ivedilikle uygulanması, sistem bütünlüğü açısından zorunludur.