Yazı

Herkes PHP'ye Dalmışken: Ekim'in Gölgede Kalan Güvenlik Haberleri

PHP'nin acil güvenlik yaması 21 Ekim'de çıktı — ama aynı gün Node.js on CVE yayımladı; aynı 36 saatte GitLab'ın regex derleyicisinde tekrar eden açık sınıfı, LiteLLM'in backdoorlu PyPI sürümü, bir hafta önce nginx'in beş açığı ve eMudhra'nın tahmin edilebilir CA anahtarları da gündemdeydi.

21 Ekim 2026, güvenlik açısından yılın en yoğun günlerinden biri oldu. Ve günün tek hikâyesi PHP’ydi: motorun kalbinde iki açık, on dört yıllık kod, dünya çapında milyonlarca açık kurulum ve acil bir yama. 21 Ekim saat 14:00 UTC’de PHP 8.5.12, 8.4.27, 8.3.36 ve 8.2.35 çıktı ve o sırada 1.524 puanla en çok konuşulan güvenlik haberi oldu.

Ama aynı gün, aynı saat diliminde, tamamen farklı katmanlarda üç ciddi olay daha yaşandı: bir JavaScript runtime’ı, bir Python paketi, bir GitLab CI derleyicisi. Bir hafta önce nginx beş açık kapatmış, dört gün önce de bir sertifika otoritesinin anahtarları çözülmüştü. Hepsinde ortak bir özellik vardı: kırılma uygulamanın kendisinde değil, uygulamanın altındaki altyapıda. Herkes PHP’ye bakarken, geri kalan yığılma kendi yangın çıkardı.

1. php2shell: 14:00 UTC’de inen bıçak

İki açık var. CVE-2026-109618 — “RCE via OOM corruption” (GHSA-w8hw-w9fx-j79w) ve CVE-2026-109619 — “RCE via stale global state” (GHSA-6wmf-4rv5-p3rp). PHP her ikisini de CVSS 4.0 ile 9.2, NVD ise 3.1 ile 9.8 verdi. Kod, PHP 5.4’ten beri (2012) orada duruyor ve ikisi de motorun neredeyse her isteğin dokunduğu iki katmanda: bellek yönetimi ve hata işleme.

Yamalar: Desteklenen sürümlerde (8.2.35, 8.3.36, 8.4.27, 8.5.12) iki CVE de tek bir yama setiyle, kök nedeninden düzeltildi; aynı güncelleme her ikisini birden kapatıyor ve session.upload_progress’u kapatmaya gerek kalmıyor. EOL sürümlerde (7.4, 8.0, 8.1) PHP Vakfı’nın yayımladığı minimal backport’lar da iki açığı kapsıyor, ancak orada CVE-2026-109619 için çözüm çoğunlukla session.upload_progress yolunu kısıtlayarak uygulanıyor. Kapsam aynı, yöntem daha muhafazakâr. Bu yazının derlendiği 22 Ekim itibarıyla yama sonrası çalıştığı doğrulanmış bir bypass ya da üçüncü bir CVE yok.

Mekanizma basit ama yıkıcı. 109618’de saldırgan isteği bellek limitine dayandırarak PHP’yi allocator’ın ortasından atlatıyor; istek verisi yarı başlatılmış halde kalıyor, kapanış rutini de bu yarım veriyi geçerli sayıyor. 109619’da ise fatal error yanlış noktada yakalandığında worker’ın içinde serbest bırakılmış belleğe bakan bir state kalıyor; aynı worker’ın bir sonraki isteği bu boş belleği kullanıyor — klasik use-after-free. PHP, 109619 için bellek sızıntısını da teyit etti: Heartbleed benzeri bir okuma yeteneği.

Bunun neden bu kadar büyük olduğu basit: motor seviyesinde. Uygulama kodunuz tertemiz olsa bile hiçbir işe yaramaz. Sansec’in bağımsız olarak yetkisiz kod çalıştırmayı doğruladığı hedefler arasında Magento 2.4.9, WordPress 7.1.2, Drupal 11.4.3, Joomla 6.1.4, MediaWiki 1.46.2, Roundcube 1.7.4, phpMyAdmin 5.2.3, Nextcloud 35.0.1, Laravel 13.11, Symfony 8.1 ve WHMCS var. Unit 42’nin tahminine göre internete açık 22,6 milyon PHP kurulumu risk altındaydı.

Keşif hikâyesi, PHP Vakfı’nın 21 Ekim tarihli itirafıyla (725 puan, 358 yorum) en çarpıcı kısımlardan biri oldu. Hikâye 2024’te başlıyor: Sovereign Tech Agency’nin finanse ettiği, OSTIF üzerinden Quarkslab’ın yürüttüğü ilk dış denetimde, PHP Vakfı’nın sözleşmeli bir core geliştiricisi CVE-2026-109618’in arkasındaki OOM probleminin ilk izlerini buluyor. 2024’te olası bir exploit teorize ediliyor ama somut vektör bulunamıyor, düzeltme ise aylarca tıkanıyor. Vakıf bunu saklamıyor: “Gecikme yapısal bir başarısızlıktı; hem güvenlik ekibinin karar sürecinden hem de kaynak yetersizliğinden kaynaklandı.”

Yol haritası sonra hızlandı: 30 Temmuz’da Calif denetimi başlıyor, 11 Ağustos’ta araştırmacı Ryan A koşulsuz uzaktan kod çalıştırma bildiriyor, aynı gün OpenAI aynı kök nedeni bağımsız olarak bildiriyor, 24 Ağustos’ta Wiz ek vektörlerle katılıyor, 18 Eylül’de yeni vektörler geliyor. Yani “AI 14 yıllık açığı buldu” çerçevesi Wiz’in blogundaki (441 puan, 176 yorum) tam doğru değil: insan araştırmacılar zaten 2024’ten beri aynı problem üzerindeydi, AI ise eşiği alçaltan etken olarak devreye girdi.

Sonra 20 Ekim’de her şey bozuldu. Saat 15:00 civarında CVE numaraları yanlış yayın saati ve yanlış CVSS skoruyla (10.0, gerçeği 9.2) sızdı; teknik detay sızmadı ama panik başladı. PHP 19:30’da ön duyuruyu yayımlayıp sürümü 22 Ekim’den 21 Ekim’e çekti. O sırada, artık açıklanmış sayılan bir şeyin ardından, Calif “yanlışlıkla” bir video paylaştı — PoC’nin birkaç hedefte çalıştığını gösteriyordu. Video silindi ama kopyaları dolaştı ve PoC akışı hızlandı. 21 Ekim 07:41 UTC’de Chainguard ambargoyu tek taraflı kırdı: yamayı içeren imajları, herkes hâlâ beklerken yayımladı. “Herhangi bir saldırgan artık düzeltmeyi ikili formda inceleyebilirdi.”

Saha zaten dolmuştu. Amazon MadPot 17 Ekim’de, yani ifşadan dört gün önce bir istismar denemesi kaydetti. ELLIO’nun sensörlerine düşen ilk php2shell isteği 08:36 UTC’ydi — yamanın 5,5 saat öncesi, kullanıcı ajanında php2shell-scan/109618 yazıyordu. WatchTowr istismar denemeleri bildirdi, Cloudflare 07:43’te erken aktivite gördü ve WAF kurallarını tüm kullanıcılara ücretsiz dağıttı, Tenable “geniş ölçekli istismar” dedi. CISA, İngiliz NCSC ve Yeni Zelanda NCSC acil yama çağrısı yaptı; Yeni Zelanda NCSC’nin önerisi sert: yama yapamıyorsanız siteyi kapatın. CISA alerti tüm web isteği sunan PHP kurulumlarını kapsıyor.

Hasar da geniş oldu: DigiD.nl, RTL ve Hollanda parlamentosu etkilendi. En çarpıcı sahne ise Hollanda Ulusal Siber Güvenlik Merkezi’nin kendi sitesini kapatması (269 puan, 94 yorum) — gerekçe tek cümle: “PHP kullanıyor.” Belçika Merkezi ve Finlandiya devlet servisleri de aynı gün düştü.

Peki bu “Kolay” bir exploit mi?

Burada asıl tartışma başlıyor ve yazının en değerli kısmı burada. Elias Taylor’ın “There isn’t an easy exploit for this PHP vulnerability” yazısı (502 puan, 290 yorum) haftanın en çok konuşulan eleştirisi oldu. Taylor’ın iddiası net: “GitHub’da binlerce, kelimesi kelimesine binlerce ‘PoC’ var. Hepsinde ortak bir şey var: vanilla bir PHP kurulumunda çalışmıyorlar.” Çoğu zincir, sunucunun zaten LFI gibi ciddi bir açığa sahip olmasını gerektiriyor — ki o zaman oyun zaten kazanılmış sayılır. Taylor’ın en çarpıcı gözlemi ise şu: LLM’ler, kullanıcının kendi test sunucusuna savunmasız bir yapılandırma ekleyerek exploit’in “çalıştığını” gösteriyor. Taylor’ın tepkisi net: “Dolandırıcılık!”

PHP’nin kendi güvenlik ekibi benzer bir şey söyledi: sızıntıdan sonra beliren PoC’ları incelediklerini, ancak “sürüm ve ifşaat anında işlevsel bir exploit tespit etmediklerini” belirttiler. Bir başka araştırmacı ise daha da ileri gitti (184 puan, 63 yorum): iddia edilen zincirin ölü olduğunu, gerçek sorunun yalnızca prefork SAPI’da erişilebilen ve kod çalıştırmayan bir bellek güvenliği hatası (CVSS 5.3) olduğunu öne sürdü.

Buradaki tartışma “yamalayalım mı” sorusunu değiştirmiyor. Ama “tek curl komutuyla root” beklentisi gerçekçi değil. En gerçekçi risk profili şu: önce başka isteklerin verisini okuyan bir bellek sızıntısı (parolalar, oturum token’ları, API anahtarları — Heartbleed’in yaptığı gibi), sonra da ağır heap mühendisliği gerektiren kod çalıştırma. Aynı gün “üçüncü bir kritik PHP CVE” söylentisi de dolaştı (66 puan, 16 yorum), ancak tartışma bunun motor seviyesinde bir RCE olmadığı, uygulama/betik seviyesinde bir bellek hatası olduğu yönünde sonuçlandı.

2. Node.js: aynı gün, on CVE

PHP yaması 14:00 UTC’de çıkarken Node.js de aynı gün 22.23.4, 24.22.1 ve 26.12.1 sürümlerini yayımladı. Tek duyuruda on CVE vardı ve en yükseği “high” idi. Brotli RCE haberi HN’de 18 puan alırken, PHP’nin danışma duyurusu 1.524 puandaydı.

En ciddisi CVE-2026-111497: Node.js’in içindeki Brotli decoder’da sınır dışı yazma ve bunun üzerinden uzaktan kod çalıştırma. Node kendi başına Brotli çözmediği için her kurulum otomatik açık değil; uygulama veya kullandığı bir kütüphane saldırgan kontrollü Brotli verisini açtığında tetikleniyor — istek gövdesi ya da fetch edilen bir yanıt. Araştırmacılar süreç belleğinin ifşasını ve komut çalıştırmayı gösterdi; yama fetch edilen yanıtları da kapsıyor. Açığı bildiren kişi Node.js TSC üyesi Matteo Collina, düzelten ise Antoine du Hamel. Node 20 EOL olduğu için yama almıyor.

Aynı duyuruda üç ayrı TLS hostname bypass’ı var: fullwidth rakamlarla yazılmış IP (CVE-2026-105483, yalnız 26.x ve 24.x), host’un gevşek biçimde bir IP’ye çözümlenmesi (CVE-2026-106069) ve non-canonical IPv4 adreslerinin DNS SAN ile kimlik doğrulaması (CVE-2026-106072). Üçü de sertifika doğrulamasının beklenen sınırını aşıyor. Buna dns.resolve’un NUL karakterinde ismi kesmesi (CVE-2026-105482) eklenince, bu sürümlerde “hangi sunucuya bağlandım” sorusunun cevabı güvenilir değil.

Geri kalanlar daha düşük sesli: keep-alive soketinde istekten önce yazılmış yanıtın işlenmesi (CVE-2026-105481), crypto.randomUUID() ve randomInt() entropy cache’inin startup snapshot ve SEA’lara kaydedilmesi yüzünden her sürecin aynı değerleri üretmesi (CVE-2026-106074), ZipFile’ın başarısız başlık doğrulamasından sonra saldırgan kontrollü önek döndürmesi (CVE-2026-106070) ve permission model’de iki ayrı aşım (CVE-2026-106071, CVE-2026-106073).

Duyurunun en önemli satırı belki de bağımlılık listesinde: c-ares, OpenSSL, SQLite, Undici ve ca-cert (eMudhra Intermediate CA Compromise). Yani bu yazının ilerleyen bölümlerindeki sertifika otoritesi olayı, Node.js’in kendi güven deposuna kadar gelmişti.

3. LiteLLM: PyPI’ye sızan backdoor, PHP yamasıyla aynı gün

SafeDep’in raporu (505 puan, 167 yorum) olayın niteliğini tek cümlede anlatıyor: litellm 1.107.0’ın PyPI’daki wheel’leri bir kimlik bilgisi hırsızı ve uzaktan kod çalıştırma backdoor’u taşıyordu.

Zamanlama tırtıklı: 21 Ekim 10:44 UTC’de meşru 1.106.2 PyPI’ye çıktı, 11:39’da zararlı 1.107.0 yedi tekerlek olarak yüklendi. PyPI sürümü 13:23’te kaldırdı, Docker Hub etiketleri 14:20’ye kadar — Docker Hub’daki kalıntı PyPI’dan 57 dakika daha uzun sürdü. PHP yaması 14:00’te çıkarken LiteLLM zararlısı 11:39’da yüklenmişti: aynı gün, aynı saat diliminde, aynı altyapı katmanında iki ayrı yangın.

Mekanizma klasik Python başlangıç tuzağı. Wheel, site-packages köküne üç dosya bırakıyor: cook.pth (içeriği import cook), cook.py (zlib+base64 ile paketlenmiş, kendini privcollect diye tanıyan 16 modüllük bilgi hırsızı) ve sitecustomize.py (loader ve backdoor). Python, .pth dosyasındaki import satırlarını her yorumlayıcı başlangıcında çalıştırdığı için payload tetikleniyor — litellm’i hiç import etmeye gerek yok. pip bile, pytest, Jupyter kernel’i, IDE dil sunucusu; hepsi tetikliyor. Hedef listesi de LiteLLM’in nerede çalıştığına göre seçilmiş: tarayıcı parolaları, SSH anahtarları, shell geçmişi, AWS/GCP/Azure kimlik bilgileri ve bulut metadata’sı, Kubernetes, Docker, Vault, CI sırları, ~/.cursor/~/.claude/~/.kiro yapılandırmaları, GPG ve TLS özel anahtarları, .npmrc, .pypirc ve LiteLLM proxy’in kendi kimlik bilgisi tabloları.

Saldırının teknik tarafı ilginç: saldırgan 13 Ekim’de letters9813 adlı bir GitHub hesabı açmış, üç dakika sonra litellm[.]dev alan adı için Let’s Encrypt sertifikası almış. Saldırı, LiteLLM’in üç mühendisinin GitHub CLI OAuth token’ı sayesinde projenin kendi yayın hattına sızdı; üretim sürümünü onaylayan ikinci bir geliştiricinin kimlik bilgisi devreye girdi. sitecustomize.py ise ayrılmış bir daemon başlatıyor, saatte bir GitHub’daki bir dosyadan alan adını okuyup yeniden çalıştırıyor — yani ölü kod değil, canlı uzaktan yükleme. Çalınan kimlik bilgilerinin AWS’te kullanıldığı da bildirildi.

Bu, LiteLLM’in ilk vakası değil: aynı .pth mekanizması Mart 2026’da 1.82.7 ve 1.82.8’i (938 puan, 500 yorum) aynı şekilde zehirlemişti. Yani aynı proje, yedi ay içinde ikinci kez aynı yöntemle vuruldu. LiteLLM haftalık 23 milyon indirme sayısına sahip bir paket; iki saatlik pencere bile bu ölçekte anlamlı.

4. GitLab: aynı açık sınıfı, haftalar içinde tekrar tekrar

GitLab’ın 21 Ekim tarihli kritik yama duyurusu (341 puan, 79 yorum) CVE-2026-110264 ile birlikte geldi: CVSS 3.1 ile 10.0, CWE-190 integer overflow, düzenli ifade derleyicisinde. GitLab bunun 7.0’dan bu yana tüm sürümleri etkilediğini ve düzeltmelerin 18.11.13, 19.0.10, 19.1.9, 19.2.9, 19.3.6, 19.4.3 ve 19.5.1 sürümlerine geri portlandığını açıkladı — yani ürünün on yılı aşkın geçmişi etkilenmiş.

Hikâyenin asıl ilginç tarafı, tek bir açık değil de bir seri olması. Aynı bileşende daha önce CVE-2026-97229 (12 Ekim’de, CI/CD regex derleyicisinde, CVSS 10.0, joaxcar tarafından HackerOne üzerinden bildirildi), CVE-2026-93577 (integer overflow, 9.9) ve CVE-2026-89078 (regex parser’da double-free) çıkmıştı. Kısacası aynı bileşende, kısa sürede, birbirini izleyen bir CVE serisi.

Yeni olanın teknik olarak ayrı bir yolu var: GitLab .org dosyalarını org-ruby gem’i ile işliyor ve bu gem, saldırganın kontrolündeki bir #+TODO: anahtarını doğrudan Regexp.new() içine gömüyor. 32.767’den fazla genel tekrar içeren bir anahtar, Onigmo’ya 16-bit imzalı sınırın ötesinde bir tekrar kimliği atamaya yol açıyor ve eşleme anında sınır dışı yazma oluşuyor. Saldırgan bir .org dosyasının işlenmesini sağladığı anda bu, kimlik doğrulaması gerektirmeyen bir kod çalıştırma yoluna dönüşüyor — RCE, git kullanıcısı olarak, ve sonuç gitlab-secrets.json, tüm CI/CD değişkenleri, runner token’ları ve her repository.

GitLab ayrıca iki tehdit tespit kuralı yayımladı — “Onigmo native worker crash” ve “Org mode render error burst” — ki bunlar istismar denemelerini görmek için. Zarar modeli büyük: kendi kurulumunuzda başarılı olan bir saldırgan, o kurulumun tüm sırlarına erişir.

5. nginx: Temmuz’da kapatılan açık, Ekim’de yenisini doğurdu

14 Ekim’de nginx 1.30.6 (stable) ve 1.31.7 (mainline) yayımlandı — yılın sekizinci güvenlik sürümü. Beş açık vardı; nginx hepsini “medium” sayarken F5 üç bellek hatasına CVSS v4 ile 9.2, TLS hatasına 8.3, HTTP/3 hatasına 6.9 verdi. Hepsi belirli bir yapılandırma gerektiriyor, ama o yapılandırmalar hiç de egzotik değil.

CVE Ne yapıyor Tetikleyen yapılandırma Etkilenen
CVE-2026-15176 worker’da heap overflow; çökme, ASLR kapalıysa kod çalıştırma alias + rewrite + $request_filename okuyan bir yönerge 0.1.29–1.31.6
CVE-2026-93479 regex map capture’ları root/log_format’ta kullanılınca heap overflow regex map + capture’ı kullanan root veya log_format 1.30.0–1.30.5, 1.31.2–1.31.6
CVE-2026-97205 AIO + SSI include virtual ile use-after-free aio on + SSI sayfası 0.8.11–1.31.6
CVE-2026-97629 Sahte TLS oturumu; client-cert doğrulaması atlatılabilir ssl_session_cache shared var, ssl_session_ticket_key yok 1.23.2–1.31.6
CVE-2026-95101 HTTP/3 isteğine fazladan bayt; client_max_body_size aşımı HTTP/3 + varsayılan proxy_request_buffering on 1.25.0–1.31.6

En eskisi CVE-2026-15176: hata Mayıs 2005’ten beri kodda. En ilginci ise CVE-2026-93479. Temmuz’da kapatılan CVE-2026-42533 için eklenen koruma, verinin ayrılmış alana taşmasını engellemiyordu; ikinci bir yama da nihai string’in boyunu bu taşmış uzunluktan hesaplayınca string kendi tamponunu aşabiliyordu. Yani Temmuz’daki düzeltme, Ekim’deki açığın zeminini hazırladı. F5’in Temmuz’daki geçici çözümünün (named capture kullanmak) dar bir yol bıraktığını söyleyen araştırmacılar haklı çıktı.

TLS hatası da aynı sınıftan: 1.23.2’den beri otomatik session ticket anahtar rotasyonu üç slotun yalnızca ikisini kopyalıyor; üçüncü slot bellekte ne varsa onunla kalıyor ve o slotu işaret eden bir ticket, başlatılmamış anahtar malzemesiyle doğrulanabiliyor. F5 sonucu “saldırganın kontrolü dışında, deterministik olmayan” bir sahteleme olarak tanımlıyor; yine de client-cert doğrulamasını atlatmaya yetebiliyor. Etkilenen ssl_session_cache shared:SSL:10m satırı, nginx belgelerinin kendi örneğinde geçen satır.

15 Ekim itibarıyla hiçbiri CISA KEV’de değildi ve nginx/F5 aktif istismar bildirmedi. Ama Mayıs’ta CVE-2026-42945’in ifşadan günler sonra istismar edildiğini biliyoruz. Çözüm 1.30.6 veya 1.31.7; dağıtım paketleri yalnızca yamayı gerçekten geri portladıysa güvenli. HN’de bu güvenlik sürümü 1 puan aldı.

6. eMudhra: tek baytlık sekiz anahtar

17 Ekim’de bir araştırmacı (1.221 puan, 483 yorum) Hindistan merkezli sertifika otoritesi eMudhra’nın sekiz ara sertifikasının özel anahtarlarının milisaniyeler içinde kırılabildiğini bildirdi. Kanıt olarak emudhra.we-have-a-problem.com adresinde, kırılmış anahtarlarla imzalanmış bir mesaj bıraktı: “We have a problem here – Wayne.”

Scott Helme’nin analizi (886 puan, 420 yorum) olayın nedenini tek cümlede açıklıyor: anahtarlar P-384 eliptik eğri için üretilmiş olmalıydı — yani 384 bit rastgelelik — ama özel değerler 4, 56, 66, 115, 155, 156, 230 ve 237 gibi tek baytlık sayılardan ibaretti. Mozilla’nın bug kaydındaki ifade daha da acı: anahtarlar “son bayt dışında tamamen sıfırdan ibaretti.” Yani saldırgan için bu bir alıştırma: 255 olasılığı sırayla dene, her birinde bir kez çarp ve sertifikanın herkese açık anahtarıyla karşılaştır. Toplam süre: bir saniyeden az. Mozilla kendi başına yaklaşık iki saatte çözmüştü; Helme bir saniyenin altında.

Anahtarlar 30 Nisan 2025’te tek bir “key generation ceremony”de üretilmişti — yani 17 aylık bir pencere. Helme’nin ifadesiyle: “17 aylık bir pencere ve bunun istismar edilip edilmediğini bilmenin hiçbir yolu yok.”

Bloklamalar hızlıydı: Mozilla raporu 17 Ekim 20:06 UTC’de aldı, 22:59’da Firefox’a OneCRL ile distrust gönderdi — “raporu aldıktan sonra üç saatten kısa sürede”. Chrome aynı akşam, Apple 19’unda, Microsoft 20’de blokladı. eMudhra sekiz sertifikayı 18 Ekim’de iptal etti, Sectigo çapraz imzalarını 19’unda tamamladı. Firefox 158.0.1, ESR 115.43.1 ve 153.5.1 ile NSS 3.131.1 yayımlandı, Go 1.27.3 ve 1.26.10 çıktı, Python certifi, Rust webpki-roots ve Electron güncellendi; Node.js de 21 Ekim’de 22.23.4, 24.22.1 ve 26.12.1 sürümleriyle ca-cert paketini yeniledi.

En rahatsız edici kısım: tarayıcılar sorunu çözdü, gerisi çözmedi. Birçok yazılım iptal durumunu hiç kontrol etmiyor. Helme’in testinde curl, Python, Node, Go ve Java — Stripe API’si için üretilmiş sahte bir sertifikayı kabul etti. Ve iptal dalgası araç ekosistemini de sarstı: mitmproxy’ye --emudhra seçeneği eklendi (445 puan, 111 yorum), Tailscale TS-2026-013 ile 1.104.2 sürümüne geçti, Oracle kendi uyarısını yayımladı. MCU güvenlik araştırmacısının analizi (60 puan, 24 yorum) ise şu sonuca varıyor: gömülü sistemlerin büyük kısmı etkilenmedi, ama bunu ancak her cihazı tek tek denetleyerek öğrenebilirsiniz.

7. Kessler sendromu: yamaladıkça açığa çıkan şey

HN’de “The Kessler Syndrome (where blowups multiply exponentially) applied to software” başlıklı bir soru (6 puan) Ekim ayında bu yazının çerçevesini verdi. Teşhis şu: birbiriyle bağlı sistemlerde tek bir arıza, zincirleme yeni arızalar üretir. Güvenlikte bunun adı “saldırı yüzeyi dönüşümü” — ve Ekim 2026 bu teşhisi hafta boyunca doğruladı. GitLab’da aynı regex derleyicisi kısa sürede dört ayrı CVE üretti; nginx’te Temmuz’da kapatılan CVE-2026-42533, Ekim’de CVE-2026-93479’un zeminini hazırladı; PHP’de 2024’ten beri ertelenen düzeltme ise 2026’da iki kritik CVE olarak geri döndü.

GhostAction ile başlayalım: GitGuardian’ın bulduğu kampanya 8–9 Ekim’de 1.900 GitHub hesabını ve 30.000’den fazla repoyu hedefledi; saldırganlar 3.174 sırrı çıkarmayı denedi. Saldırı, GitHub Actions’ın push ve workflow_dispatch tetikleyicilerine enjekte edilmiş kötücül workflow dosyaları üzerinden çalışıyordu; payload fetch-depth: 0 ile Git geçmişini tarayıp AWS anahtarlarını, GitHub/GitLab PAT’lerini ve Anthropic/OpenAI anahtarlarını topluyor, sonra düz HTTP ile 193.32.204[.]199/?c=monami adresine gönderiyordu. Vektör GitHub’ın kendisi değildi — çalınmış PAT’ler ve infostealer loglarıydı. Önceki dalgalarda 772 repo, 373 kullanıcı ve 26 sır sızdı; 5 Ekim’e kadar yalnızca yüzde 16’sı temizlenmişti. Kampanya, teknik olarak Eylül 2025’te Wiz tarafından fark edilmişti ve Ekim’de yeniden canlanmıştı.

OVHcloud CLI vakası ise sürüm imzasının ne kadar işe yaramadığını gösteriyor: saldırgan, bakımcının GitHub hesabını Mart 2026’dan beri ele geçirmiş ve Release API’sini kullanarak ovh/ovhcloud-cli’nun v0.11.0–v0.15.0 sürümlerinin ikili dosyalarını değiştirmiş. Kaynak repo ve CI hattı bozulmamıştı; sadece GitHub release immutability’si kapalıydı. Zararlı sürüm 19 Ekim’de 94 dakika canlı kaldı. Payload’ın işi “diskten sırları toplamak”; ikinci aşama bir Solana memo dead drop adresinden çekiliyordu ve sistem “Rusça görünüyorsa” sessizce çıkıyordu. (Bu kaçınma davranışı bir kimlik değil, bir evasion tekniği — araştırmacılar saldırganın Rus kökenli olduğuna dair iddiaları destekleyemedi.) Bu, GlassWorm kampanyasının bir parçasıydı.

Rank Math’de ise durum daha da rahatsız edici: CVE-2026-111862 (CVSS 9.8), resmî SEO eklentisinin 3.0.123 sürümüne gömülmüş bir zararlı yazılım. Pencere dar ama sinsiydi — 15 Ekim 20:02 ile 16 Ekim 07:12 UTC arasında indirilen paketler. C2 sunucusu rank1cdn[.]com; payload, her sayfa ziyaretinde kendini yeniden kuran gizli PHP backdoor’ları, üç zehirli wp_options anahtarı, sahte bir WordPress çekirdek dosyası (wp-includes/class-wp-cache-util.php) ve proc_open kullanan bir shell. Anahtar xmmqhn ile XOR’lanmıştı. Güncellemek yetmiyordu: 15 Ekim 20:02’den önceki bir yedekten tam geri yükleme ve kimlik bilgisi rotasyonu gerekiyordu.

ConnectWise vakası CVE değil, ama daha rahatsız edici bir şey: ConnectWise Cloud Backup (eski adıyla SkyKick) adına çalışan çok kiracılı Entra uygulamasının client secret’ı çalınmış, 13–15 Ekim arasında saldırgan her onaylı kiracı için kendi token’ını üretmiş. Huntress 162 kiracıda yetkisiz oturum açmayı doğruladı; Kudelski’ye göre yaklaşık 1.000 kiracıda oturum hareketi vardı ve 300’den fazla başarılı giriş gerçekleşti. Yaklaşık 50 kiracıda servis principal’ları kendilerine Exchange Administrator atadı; bir kiracıda ise 03:44 ve 03:48’de Global Administrator kendini verdi ve yeni client secret’ler ekledi. Kullanıcı parolası, MFA, hatta oturum gerektirmiyordu.

SAP Cloud SDK ise tam tersi bir ders veriyor: CVE-2026-89111, CVSS 10.0, CWE-918 SSRF, sap-cloud-sdk paketinin 0.45.2’den eski tüm sürümleri. Saldırgan tenant_subdomain üzerinde kontrol ederse OAuth2 token isteği yönlendiriliyor ve client ID ile client secret dışarı sızıyor. Düzeltme 21 Ağustos’ta çıktı — ama danışmanlık 13 Ekim’de, 53 gün sonra yayımlandı. O 53 gün boyunca herkesin lockfile’ında kırılgan sürüm kalmaya devam etti ve sürüm notları güvenlik değişikliğinden hiç bahsetmiyordu. Buna karşılık Cisco Secure Email Gateway’de CVE-2026-76519 (CVSS 9.8) CISA KEV listesine 14 Ekim’de girdi ve Shadowserver internete açık yaklaşık 300 örneği takip ediyor — yönlendirme dosyası yolu geçişli bir dosya yazma + AsyncOS üzerinde root yetkisiyle komut çalıştırma. Ve Langflow tarafında IBM tek duyuruda 25 CVE açıkladı; ikisi kritik ve kimlik doğrulaması gerektirmiyordu (CVE-2026-104334 ve CVE-2026-93674, ikisi de 9.8), KEV listesine düşen Langflow CVE sayısı ise altıya çıktı.

Bu listenin asıl meselesi sayılar değil, görünürlük farkı. php2shell’in danışma duyurusu 1.524 puan ve 654 yorum alırken, CVSS 10.0 olan SAP açığının haberi 1 puan aldı; Node.js’in Brotli RCE’si 18 puan, nginx’in sekizinci güvenlik sürümü 1 puan. GitHub Actions kampanyasının haberi 4 puan. ConnectWise’in 162 kiracıyı etkileyen kimlik bilgisi hırsızlığı 1 puan. Langflow’un 25 CVE’lik duyurusu da HN’de neredeyse görünmedi. Yani en çok konuşulan zafiyet, en çok zarar veren zafiyet değildi — sadece en çok konuşulabilendi.

Ne yapmalı

  1. PHP’yi yamalayın. 8.5.12, 8.4.27, 8.3.36 veya 8.2.35’e yükseltin. 7.4/8.0/8.1 için minimal backport’lar var ama bu sürümler EOL — yükseltme doğru cevap.
  2. Yama yapamıyorsanız durdurun, kapanın. NCSC’nin önerisi bu ve ciddi. Acil geçici önlem olarak session.upload_progress.enabled = 0 (php.ini / .user.ini / .htaccess) — bu ayar CVE-2026-109619’a karşı özellikle önemli görünüyor; aynı zamanda web sunucunuzun multipart POST trafiğini kısıtlayın ve PHP 8.5’te fatal_error_backtraces = 0. Apache üzerinde php_admin_value memory_limit -1 gibi agresif denemeler yerine, yükleme kapatmak daha güvenilir.
  3. Node.js’i 22.23.4, 24.22.1 veya 26.12.1’e yükseltin. Özellikle saldırgan kontrollü Brotli verisi çözen servisler için; Node 20 EOL olduğu için yama almıyor.
  4. LiteLLM’i 1.106.2’ye pinleyin ve imajları digest ile sabitleyin. 1.107.0 çalıştırdıysanız o makineyi, o konteyneri ve o runner’ı ele geçirilmiş kabul edin — paketi kaldırmak yetmez, dışarı çıkan bütün sırları döndürün.
  5. Self-hosted GitLab’ı 19.5.1’e (veya 19.4.3 / 19.3.6 / 19.2.9 / 19.1.9 / 19.0.10 / 18.11.13’e) yükseltin ve Org mode render’ı ile ilgili logları inceleyin.
  6. nginx’i 1.30.6 veya 1.31.7’ye yükseltin. nginx -T ile alias+rewrite, regex map, aio+ssi, ssl_session_cache shared ve HTTP/3 kullanımını denetleyin; dağıtım paketinin yamayı gerçekten içerdiğini doğrulayın.
  7. Kendi trust store’unuzu denetleyin. eMudhra’nın iptal ettiği sertifikaları kullanan araçlar — curl, Node, Java — iptali kontrol etmiyor. Sertifika iptalini doğrulamayan her istemci sizin için bir MITM yüzeyi.
  8. Paket ve CI zincirinizi kilitleyin. Sabitlenmemiş sürüm, imzasız artifact ve CI’da gizliye erişen pip install komutu, bu yazıdaki olayların ortak noktası.

Kısacası haftanın dersi tek cümlede: Ekim’in ortasında tek bir zafiyet değil, bir altyapı seviyesi sorunu vardı. PHP’nin motoru, Node.js’in Brotli decoder’ı, GitLab’ın regex derleyicisi, nginx’in string işleme kodu, PyPI’ın yayın hattı ve bir sertifika otoritesinin anahtar üretim töreni — altısı da aynı yerde kırıldı: varsayılanlarda, otomasyonda ve güvenilen üçüncü taraf zincirlerinde. Bu da yamalama listelerinin neden yetmediğini gösteriyor; bir yamayı uygulamak, sizinkini üstüne yeni bir yama daha yazmak demek.

Bu yazıdaki puan ve yorum sayıları 22 Ekim 2026 tarihli Hacker News verileridir; tüm olaylar birincil kaynaklardan (PHP Vakfı, PHP güvenlik danışmanlıkları, GitLab belgeleri, SafeDep, LiteLLM olay raporu, Mozilla güvenlik bülteni, CISA KEV) doğrulanmıştır.

Aylık genel görünüm için Ekim Hacker News bültenine göz atabilirsiniz; geçen haftanın derlemesi ise burada.