Ferhat Gölge Ferhat Gölge
CV İndir
TR
Siber Güvenlik

PHP2Shell Açığı: Ubuntu ve Apache Sunucular İçin Adım Adım Güvenlik Rehberi

22 Oct 2026 Ferhat Gölge 8
PHP2Shell Açığı: Ubuntu ve Apache Sunucular İçin Adım Adım Güvenlik Rehberi

Bilgilerin kontrol tarihi: 22 Ekim 2026

PHP2Shell hakkında bir güvenlik duyurusu gördüğünüzde yapılacak ilk iş, sunucunuzda hangi PHP sürümünün gerçekten çalıştığını belirlemektir. Ardından kullandığınız paket kaynağında düzeltmenin sunulup sunulmadığını kontrol etmeli, yamalı paketi kurmalı ve PHP kodunu bellekte tutan servisleri yeniden başlatmalısınız.

Bu rehber; Ubuntu üzerinde APT ile kurulmuş PHP ve Apache kullanan sunucular için hazırlanmıştır. Docker, hosting paneli, kaynak koddan derlenmiş PHP veya farklı Linux dağıtımları kullanan sistemlerde güncelleme yöntemi değişebilir. İşleme başlamadan önce kullanılabilir bir yedeğiniz olduğundan emin olun ve kısa süreli hizmet kesintisi ihtimalini göz önünde bulundurun.

PHP2Shell nedir?

PHP2Shell, PHP çekirdeğinde tespit edilen iki kritik güvenlik açığı için kullanılan isimdir. Açıklar, uygun koşullarda kimlik doğrulama gerektirmeden uzaktan kod çalıştırılmasına yol açabilir. PHP projesi, ilgili düzeltmeleri 21 Ekim 2026 tarihinde yayımladı.

Güvenlik açığı Temel sorun CVE-2026-109618 Bellek yetersizliği sırasında yarım kalmış iç verilerin geçerli kabul edilmesi CVE-2026-109619 Bellek serbest bırakıldıktan sonra sonraki isteğin eski duruma erişebilmesi

Başarılı bir saldırı, genellikle web işçisinin yetkileriyle kod çalıştırılmasına neden olur. Bu durum doğrudan root erişimi anlamına gelmese de uygulamanın erişebildiği veritabanı parolaları, API anahtarları, .env dosyaları, kullanıcı verileri ve diğer sırlar açısından ciddi risk oluşturur.

Hangi sistemler etkileniyor?

Web isteği işleyen PHP kurulumlarının tamamı dikkatle değerlendirilmelidir. Apache üzerinde mod_php kullanılıyorsa risk özellikle önemlidir; doğrulanmış saldırı yollarından biri uygulama kodu çalışmaya başlamadan önce tetiklenebilir. PHP-FPM kullanmak da güncelleme gereksinimini ortadan kaldırmaz.

Dolayısıyla Laravel, Symfony, WordPress veya başka bir PHP çatısı kullanmanız güvenlik sorumluluğunu değiştirmez. Laravel bakım modu veya uygulama içinden eklenen bir koruma, PHP çalışma katmanından önce tetiklenebilen bir saldırı yolunu engelleyemeyebilir. Yama hemen uygulanamıyorsa PHP’ye yönelik dış erişimi sınırlandırmayı veya hizmeti geçici olarak kapatmayı değerlendirin.

Hangi PHP sürümüne geçmelisiniz?

Aşağıdaki tabloda, açıkları gideren ilk resmi PHP sürümleri yer alır. Mevcut dalınız için daha yeni bir güvenlik sürümü varsa her zaman onu tercih edin.

PHP dalı İlk yamalı resmi sürüm PHP 8.2 8.2.35 PHP 8.3 8.3.36 PHP 8.4 8.4.27 PHP 8.5 8.5.12

Ancak Ubuntu gibi dağıtımlar, güvenlik düzeltmelerini mevcut paket sürümüne geri taşıyabilir. Bu nedenle yalnızca php -v çıktısındaki kısa sürüm numarasına bakarak paketin güvensiz olduğu sonucuna varmayın. Örneğin Ubuntu’nun resmi paketlerinde daha eski görünen bir sürüm numarası, ilgili CVE düzeltmelerini içerebilir. Tam paket sürümünü ve paket kaynağını kontrol etmek gerekir.

1. Kurulu PHP paketlerini belirleyin

Önce komut satırında çalışan PHP sürümünü kontrol edin:

php -v

Bu komut yalnızca CLI ortamındaki PHP sürümünü gösterir. Apache’nin aynı sürümü kullandığını tek başına kanıtlamaz. Kurulu paketlerin envanterini almak için aşağıdaki komutu çalıştırın:

dpkg-query -W \
  -f='${db:Status-Status}\t${binary:Package}\t${Version}\n' \
  'php*' 'libapache2-mod-php*' |
awk '$1 == "installed"'

Bu çıktı sayesinde kurulu PHP dallarını, uzantıları, FPM paketlerini ve Apache modüllerini birlikte görebilirsiniz. Sunucuda birden fazla PHP sürümü bulunabileceğini unutmayın.

2. Apache’nin hangi PHP çalışma biçimini kullandığını kontrol edin

Apache yüklü modüllerini görmek için:

sudo apache2ctl -M

Çıktıda php_module bulunuyorsa Apache, mod_php kullanıyor olabilir. Sürüm dalını öğrenmek için:

grep -RnE 'LoadModule.*php' /etc/apache2/mods-enabled

Örneğin libphp8.4.so sonucunu görmeniz Apache’nin PHP 8.4 modülünü yüklediğini gösterir. Fakat bunun hangi paket revizyonuna ait olduğunu ayrıca kontrol etmeniz gerekir.

PHP-FPM servislerini ve Apache’nin FPM soketlerine yönlendirilip yönlendirilmediğini incelemek için:

systemctl list-units --type=service --all 'php*-fpm.service'

grep -RnE 'SetHandler|ProxyPassMatch|php.*fpm' \
  /etc/apache2/sites-enabled /etc/apache2/conf-enabled

Farklı sitelerin farklı PHP-FPM sürümlerini kullanması mümkündür. Bu nedenle yalnızca varsayılan domaini değil, sunucudaki tüm etkin site yapılandırmalarını değerlendirin.

3. Depodaki güncel paketi inceleyin

Önce APT paket indeksini güncelleyin:

sudo apt update

Ardından örneğin PHP 8.4 paketlerinin kurulu ve aday sürümlerini kontrol edin:

apt-cache policy \
  php8.4-cli php8.4-common php8.4-fpm libapache2-mod-php8.4

apt-mark showhold

Installed alanı kurulu sürümü, Candidate alanı ise APT yapılandırmanıza göre kurulabilecek sürümü gösterir. Candidate sürümünün yamalı olması, güncellemenin henüz uygulandığı anlamına gelmez. Ayrıca apt update yalnızca paket bilgisini yeniler; paketleri yükseltmez.

4. Kurulu PHP paketlerini güncelleyin

Önce hangi PHP 8.2 ve PHP 8.4 paketlerinin kurulu olduğunu listeleyin:

mapfile -t php_packages < <(
  dpkg-query -W -f='${db:Status-Status} ${binary:Package}\n' \
    'php8.2*' 'php8.4*' \
    'libapache2-mod-php8.2' 'libapache2-mod-php8.4' |
  awk '$1 == "installed" {print $2}'
)

printf '%s\n' "${php_packages[@]}"

Listeyi dikkatle kontrol ettikten sonra önce simülasyon çalıştırın:

sudo apt-get --simulate --no-remove install --only-upgrade "${php_packages[@]}"

Beklenmedik paket kaldırma işlemi veya bağımlılık sorunu yoksa güncellemeyi başlatın:

sudo apt-get --no-remove install --only-upgrade "${php_packages[@]}"

Yalnızca php8.4-cli paketini güncellemek yeterli değildir. Apache modülü, PHP-FPM, ortak PHP paketleri ve kullanılan uzantılar da güncel olmalıdır. Yerel olarak değiştirilmiş yapılandırma dosyalarıyla ilgili bir soru gelirse farkları incelemeden varsayılan dosyaların üzerine yazmayın.

5. Apache ve PHP-FPM servislerini yeniden başlatın

Paket güncellemesi tamamlandığında eski süreçler belleklerinde önceki PHP kodunu çalıştırmaya devam edebilir. Bu nedenle servis yeniden başlatma adımı kritik önem taşır.

sudo apache2ctl configtest
sudo systemctl restart apache2

Yapılandırma testi Syntax OK sonucu veriyorsa Apache yeniden başlatılabilir. PHP 8.4 FPM kullanıyorsanız ilgili servisi de yenileyin:

sudo systemctl try-restart php8.4-fpm

Farklı bir PHP dalı kullanıyorsanız servis adını buna göre değiştirin. Laravel Horizon, queue worker, Octane, Supervisor veya systemd üzerinden çalışan uzun ömürlü PHP süreçlerini de uygulamanızın çalışma biçimine uygun olarak yeniden başlatın.

6. Güncellemeyi doğrulayın

Güncellemeden sonra hem paketlerin hem de servislerin durumunu kontrol edin:

php -v

dpkg-query -W \
  -f='${db:Status-Status}\t${binary:Package}\t${Version}\n' \
  php8.4-cli php8.4-common php8.4-fpm libapache2-mod-php8.4

systemctl is-active apache2
systemctl --failed

Doğrulama üç aşamadan oluşmalıdır: doğru paket sürümünün kurulu olması, sitenin doğru PHP ortamına yönlenmesi ve ilgili servislerin yeniden başlatılmış olması. Herkese açık bir phpinfo() sayfası bırakmayın. Gerekirse yalnızca yöneticilerin erişebildiği geçici bir tanılama yöntemi kullanın ve işlem tamamlandığında kaldırın.

Yama sonrasında ihlal belirtilerini inceleyin

Yama, güvenlik açığını kapatır; ancak daha önce gerçekleşmiş olası bir saldırıyı geri almaz. Apache ve uygulama kayıtlarını incelemek iyi bir başlangıçtır:

sudo journalctl -u apache2 --since "24 hours ago" --no-pager -n 200
sudo tail -n 200 /var/log/apache2/error.log

Beklenmeyen çökmeler, bellek hataları, değiştirilmiş PHP dosyaları, yeni cron görevleri, tanımadığınız SSH anahtarları ve olağandışı dış bağlantılar incelenmelidir. Loglarda hata bulunmaması sistemin kesin olarak güvenli olduğunu göstermez. İhlal şüphesi varsa sistemi izole edin, mümkünse log ve disk kanıtlarını koruyun, ardından erişilmiş olabilecek parolaları ve API anahtarlarını yenileyin.

Sonuç

PHP2Shell gibi çekirdek seviyesindeki açıklar, uygulama bağımlılıklarını güncellemekten daha geniş bir müdahale gerektirir. Composer paketlerini güncellemek tek başına yeterli değildir; web isteklerini işleyen PHP paketleri, Apache modülleri, FPM servisleri ve uzun süre çalışan işçi süreçleri birlikte ele alınmalıdır.

Gelecekteki güvenlik duyurularına daha hızlı yanıt verebilmek için her sitenin PHP sürümünü, paket kaynağını, Apache veya FPM kullanımını, sorumlu servislerini ve son güncelleme tarihini kayıt altında tutun.

Kaynaklar

Keywords: Ferhat Gölge, ana sayfa, portföy, blog, Laravel, yazılım geliştirici

Sıkça Sorulan Sorular

PHP2Shell açığı nedir?

PHP2Shell, PHP çekirdeğindeki CVE-2026-109618 ve CVE-2026-109619 güvenlik açıkları için kullanılan isimdir. Bu açıklar, belirli koşullarda saldırganların kimlik doğrulaması yapmadan web servisinin yetkileriyle uzaktan kod çalıştırmasına yol açabilir.

Laravel veya WordPress kullanıyorsam PHP2Shell beni etkiler mi?

Evet. Sorun PHP çalışma ortamında bulunduğu için Laravel, WordPress veya Symfony kullanmak tek başına koruma sağlamaz. Apache mod_php kurulumları özellikle yüksek risk taşır; PHP-FPM kullanan sistemlerin de güncellenmesi gerekir.

PHP2Shell açığını kapatmak için hangi PHP sürümünü kullanmalıyım?

İlk yamalı resmi sürümler PHP 8.2.35, 8.3.36, 8.4.27 ve 8.5.12’dir. Kullandığınız dalın bu sürümüne veya daha yenisine geçmelisiniz. Linux dağıtımları düzeltmeyi eski sürümlere geri taşıyabildiği için tam paket sürümünü sağlayıcınızın güvenlik duyurusuyla karşılaştırın.

Composer güncellemesi veya Laravel bakım modu yeterli olur mu?

Hayır. Composer uygulama bağımlılıklarını günceller; sunucudaki PHP çekirdeğini güncellemez. Laravel bakım modu da uygulama kodundan önce tetiklenebilen saldırı yollarını engellemez. PHP paketlerini güncellemeli ve ilgili Apache/PHP-FPM süreçlerini yeniden başlatmalısınız.

PHP’yi güncelledikten sonra başka kontrol yapmam gerekir mi?

Evet. Sitelerin gerçekten yamalı PHP ortamını kullandığını, ilgili servislerin yeniden başlatıldığını ve temel işlemlerin çalıştığını doğrulayın. Ayrıca yama öncesine ait logları ve izinsiz dosya değişikliklerini inceleyin. Güncelleme, daha önce gerçekleşmiş bir ihlali veya bırakılmış bir arka kapıyı temizlemez.