Cloudflare 18 Kasım 2025 Kesintisi Sonrası Analizi
(blog.cloudflare.com)- 18 Kasım 2025 11:20'de (UTC) Cloudflare ağının çekirdek trafik iletim işlevi durdu ve dünya genelindeki kullanıcılar hata sayfaları gördü
- Nedeni, veritabanı izin değişikliği nedeniyle Bot Management sisteminin
featuredosyasının anormal şekilde büyümesi olup, siber saldırıyla ilgisi yoktu - Bu dosya boyutu artışı nedeniyle trafik yönlendirme yazılımı sınır değeri aşıp başarısız oldu ve büyük ölçekte HTTP 5xx hataları oluştu
- Yaklaşık 14:30'da sorunlu dosyanın dağıtımı durdurulup önceki sağlıklı sürümle değiştirilerek çekirdek trafik geri yüklendi; 17:06'da tüm hizmetler normale döndü
- Cloudflare bu olayı 2019'dan bu yana en kötü kesinti olarak değerlendiriyor ve yapılandırma dosyası doğrulamasını güçlendirme ile küresel kill switch ekleme gibi tekrarını önleyici adımlar atıyor
Kesintinin özeti
- 11:20 civarında Cloudflare ağında çekirdek trafik iletiminde başarısızlık yaşandı ve kullanıcılar Cloudflare iç hata sayfalarını gördü
- Nedeni siber saldırı veya kötü niyetli bir eylem değildi; doğrudan sebep veritabanı sistemindeki izin değişikliğiydi
- Bu değişiklik nedeniyle Bot Management sisteminin kullandığı
featuredosyasının boyutu iki katına çıktı ve ağ geneline dağıtıldı - Trafik yönlendirme yazılımı bu dosyayı okurken dosya boyutu sınırını aştı ve sistem hatası oluştu
- İlk aşamada büyük ölçekli bir DDoS saldırısı sanıldı, ancak neden belirlendikten sonra önceki sağlıklı dosyayla değiştirilerek kurtarma başlatıldı
Kesintinin ilerleyişi ve etkisi
- 11:20 öncesinde 5xx hata oranı normal seviyedeydi, ancak sonrasında hatalı
featuredosyasının dağıtılmasıyla hatalar hızla arttı - ClickHouse veritabanı kümesindeki bazı düğümlerde yanlış sorgu sonuçları 5 dakikalık aralıklarla üretildi; sağlıklı ve sağlıksız dosyalar dönüşümlü dağıtıldığı için sistem tekrar tekrar toparlanıp yeniden başarısız oldu
- 14:30'dan itibaren sorunlu dosya üretimi durduruldu ve sağlıklı dosya elle eklendi; çekirdek proxy yeniden başlatılarak kurtarma sağlandı
- 17:06'da tüm hizmetler normale döndü
| Hizmet | Etki |
|---|---|
| Core CDN ve güvenlik hizmetleri | HTTP 5xx hataları oluştu |
| Turnstile | Yüklenemedi, giriş yapılamadı |
| Workers KV | Gateway başarısızlığı nedeniyle 5xx hataları keskin biçimde arttı |
| Dashboard | Turnstile arızası nedeniyle giriş yapılamadı |
| Email Security | Spam tespit doğruluğu geçici olarak düştü, bazı otomatik taşıma işlemleri başarısız oldu |
| Access | Çok sayıda kimlik doğrulama hatası oluştu, mevcut oturumlar korundu |
- Kesinti süresince CDN yanıt gecikmesi arttı; bunun nedeni debug sistemindeki CPU kullanımının keskin biçimde yükselmesiydi
Kesintinin nedeni: Bot Management sistemi
- Cloudflare'ın Bot Management modülü, istek bazında bot puanı üretmek için makine öğrenimi modeli kullanıyor
- Model girdisi olarak kullanılan
featureyapılandırma dosyası birkaç dakikada bir ağın tamamına dağıtılarak güncel tehditlere yanıt veriyor - ClickHouse sorgu davranışındaki değişiklik nedeniyle çok sayıda yinelenen
featuresatırı eklendi ve dosya boyutu arttı - Bunun sonucunda Bot Management modülü hata verdi ve HTTP 5xx yanıtları döndürdü; Workers KV ve Access de etkilendi
- Yeni proxy motoru FL2 üzerinde 5xx hataları oluşurken, eski FL sürümünde bot puanı 0'a ayarlanarak yanlış pozitifler arttı
ClickHouse sorgu davranışındaki değişiklik
- 11:05'te ClickHouse'un veritabanı erişim izni değişikliği dağıtıldı
- Önceden yalnızca
defaultveritabanının metadata'sı sorgulanabiliyordu; değişiklikten sonrar0veritabanının metadata'sı da görünür hale geldi - Bot Management'ın
featuredosyası üretim sorgusu veritabanı adı filtresi olmadan çalıştı ve sonuç olarak yinelenen sütunlar döndürdü - Bu yüzden
featuredosyasındaki satır sayısı iki kattan fazla arttı ve sistem sınırını aştı
Belleğin önceden ayrılması ve sistem panic durumu
- Bot Management modülü en fazla 200 makine öğrenimi
feature'ı sınırı koyarak belleği önceden ayırıyor - Hatalı dosya 200'den fazla
featureiçerince Rust kodunda panic oluştu ve
thread fl2_worker_thread panicked: called Result::unwrap() on an Err valuehatası çıktı - Bunun sonucunda büyük ölçekte HTTP 5xx hataları meydana geldi
Diğer etkiler ve kurtarma süreci
- Workers KV ve Access'in çekirdek proxy'ye bağımlı olması, kesintinin etkisini büyüttü
- 13:04'te Workers KV'nin proxy'yi bypass etmesi için yama uygulandı ve hata oranı düştü
- Dashboard, Turnstile ve Workers KV bağımlılığı nedeniyle giriş yapılamadı
- 11:30~13:10 ve 14:40~15:30 aralıklarında iki kez erişilebilirlik düştü
- Backlog ve yeniden deneme istekleri nedeniyle gecikme arttı; yaklaşık 15:30'da düzeldi
- 14:30 sonrasında hizmetlerin çoğu normale döndü, 17:06'da tam kurtarma sağlandı
Tekrarını önleme adımları
- Cloudflare tarafından üretilen yapılandırma dosyaları için girdi doğrulamasının güçlendirilmesi
- Küresel işlev kapatma anahtarının (kill switch) genişletilmesi
- Hata raporlamasının sistem kaynaklarını tüketmesini önleme
- Çekirdek proxy modülleri genelinde hata koşullarının gözden geçirilmesi
Zaman çizelgesi özeti (UTC)
| Saat | Durum | Açıklama |
|---|---|---|
| 11:05 | Normal | Veritabanı erişim kontrolü değişikliği dağıtıldı |
| 11:28 | Etki başladı | Müşteri trafiğinde ilk hata oluştu |
| 11:32–13:05 | İnceleme sürüyor | Workers KV hata nedeni analiz edildi, hafifletme denendi |
| 13:05 | Etki azaldı | Workers KV ve Access için bypass uygulandı |
| 13:37 | Kurtarma çalışmaları yoğunlaştı | Bot Management yapılandırma dosyası rollback hazırlığı |
| 14:24 | Sorunlu dosya dağıtımı durduruldu | Sağlıklı dosya testi tamamlandı |
| 14:30 | Ana etki giderildi | Sağlıklı dosya küresel olarak dağıtıldı, hizmet kurtarması başladı |
| 17:06 | Tam kurtarma | Tüm hizmetler tamamen normale döndü |
Sonuç
- Bu kesinti, Bot Management yapılandırma dosyası üretim mantığı ile veritabanı izin değişikliğinin etkileşimi nedeniyle meydana geldi
- Cloudflare bunu 2019'dan bu yana en ciddi ağ kesintisi olarak değerlendiriyor
- Şirket, gelecekte sistem dayanıklılığını güçlendirmek için yapısal iyileştirmeler ve otomatik savunma mekanizmalarını artırmayı planlıyor
8 yorum
Yapılandırma dosyasıyla ilgili arızalar her yerde ortaya çıkıyor.
Cloudflare çalışmayınca her türlü hizmet aksadı, tam bir cehennemdi..
Kök neden analizi belgesi epey hızlı yayımlandı vay canına
Bu arada, bu yazının yazarı CEO'ymuş.
Hacker News görüşleri
Bu, milyonlarca dolarlık bir .unwrap() kaza hikâyesi
İnternetin çekirdek altyapı yolunda
.unwrap()çağırmak, "bu asla başarısız olmaz; başarısız olursa da iş parçacığını hemen öldür" demekle aynı şeyRust derleyicisi başarısızlık olasılığını açıkça ifade etmeye zorlar, ama onlar bunu zarif biçimde ele almak yerine panic seçmiş
Bunun tipik bir "parse, don’t validate" anti-pattern örneği olduğunu düşünüyorum
.unwrap()konusunda bir kör noktası var gibi görünüyor. Belki örnek kodlarda sık görünmesindendirGerçek üretim kodunda
.unwrap()ya da.expect()bir panic gibi review edilmelidirÜretim kodunda
.unwrap()kullanılıyorsa mutlaka "INFALLIBILITY" yorumu eklenmeli ve buclippy::unwrap_usedile zorunlu tutulabilirMesele sadece
.unwrap()değil; sorgu veritabanlarını ayırmadığı için payload büyüdü ve ClickHouse daha fazla DB’yi görünür kıldı"unwrap yüzünden" diye kestirip atmaktan ziyade, global kill switch ya da sistem kaynaklarının ezilmesini önleyecek tasarım iyileştirmeleri daha önemli bence
FL2 katmanında her bileşenin panic durumunu yakalamak gerekir, ama fail-open her zaman daha iyi değildir
Panic’in yakalanıp işlenip işlenmeyeceğine FL2 seviyesinde açıkça karar verilmesini sağlayacak mantık eklenmeli
Sharded sistemlerde neden kademeli rollout ve izleme olmadığını da merak ediyorum
!unwrap ve açık?unwrap varBen örtük unwrap’i neredeyse hiç kullanmıyorum. Değer garanti edilmiş olsa bile her zaman açıkça ele alıyorum
Örneğin
@IBOutlet weak var someView!yerine@IBOutlet weak var someView?tanımlıyorumBu biraz belt & suspenders yaklaşımı
Kesintiden 24 saat bile geçmeden post mortem yayımlamaları gerçekten etkileyici
Çoğu büyük şirkette çeşitli stakeholder incelemeleri yüzünden bu düzeyde açıklama yapmak neredeyse imkânsız olurdu
Cloudflare’ın kesinti açıklamasını okurken, "neden toparlanmaları bu kadar uzun sürdü" diye düşündüm
Kesintinin nedenini anladım ama ağın büyük kısmı çöktüyse yakın zamandaki yapılandırma değişikliğini geri almak ilk öncelik olmalı diye düşündüm
Elbette sonradan bakınca net görünüyor ama 7 dakika içinde incelemeye başlamış olmaları etkileyici
Bu olay bana CrowdStrike vakasını hatırlatıyor
Otomatik üretilen bir yapılandırma dosyası yazılımı bozdu ve tüm ağa yayıldı
Hızlı dağıtım ihtiyacını anlıyorum ama bu olay kademeli rollout ve rollback stratejisinin eksikliğini ortaya koyuyor
Cloudflare’ın duyurduğu ileriye dönük iyileştirme planlarına bakınca,
gibi maddeler var
Ama canary deployment ya da kademeli yapılandırma dağıtımı yok
Global switch riskli olabilir ve tek bir bug ile tüm sistemi durdurabilir
ClickHouse’u neden feature flag deposu olarak kullandıkları da soru işareti. ClickHouse deduplication dokümanı bile risklere işaret ediyor
Servisler arası bağımlılık haritalaması olsaydı kök neden takibi çok daha kolay olurdu
Kod dağıtımı dikkatli yapılıyor ama yapılandırma dağıtımı aynı ciddiyetle ele alınmıyor. Yapılandırmanın da kod olduğunun kabul edilmesi gerekiyor
Status sayfasının da düşmesi ve bunun saldırı sanılması ilginç
Cloudflare altyapısından tamamen ayrı olduğu söyleniyor ama neden onunla birlikte çöktüğüne dair bir açıklama yok
Ben Turnstile’ı fail-open stratejisiyle entegre ettim ve bu kesintide bunun faydasını gördüm
JS yüklenmezse dummy token ile gönderime izin veriyorum; backend’de doğrulama başarısız olsa bile fail-open davranıyorum
Bazı kullanıcılar yine de engellendi ama toplam etki azaldı
Bu, elimde başka bot azaltma araçları olduğu için mümkün olan bir yaklaşım
Ama bu muhtemelen yalnızca hedefli olmayan saldırılarda işe yarar
Cloudflare kodunda neden
.unwrap()kullanımına izin verildiği soru işaretiEn azından
expect("Bu asla olmaz")yazmaları gerekirdiHataları değer olarak ele alma felsefesi zaten bu tür sorunları önlemek için var; ayrıca teşhis de çok daha kolay olurdu
Ağ çağrıları içeren kodlarda başarısızlık ihtimali çok fazla
Geliştirme sırasında
.unwrap()kullanıyorum ama production’da bazen expect() bırakıyorum. Çünkü bazen ilerlemenin başka yolu olmuyorAsıl ders, çok fazla işlevin az sayıdaki oyuncuya bağımlı hâle gelmiş olması
Kazanan hepsini alır yapısı güçlendikçe sistemin dayanıklılığı azalıyor
Elbette bu konuma yetenekleriyle geldiler ama internetin her zaman “çalışır durumda” olacağını beklemek fazla iyimser gibi
"Rust olunca her şey güvenli" söylemi abartı
Hangi dil olursa olsun, yanlış kullanılırsa silahı kendi ayağına doğrultmak gibi olur
CF gibi bir şirkette bile
.unwrap()kullanılıyor ha vay beO kod prodüksiyona nasıl alınmış?
Sorunun
unwrapile ilgili olmadığını düşünüyorumAsıl temel sorun hatalı sorgu.
Ama bence
unwrapile sorun doğrulamasının atlanmış olması da bir sorun.İçeride bir sorun çıksa bile hata işleme yapılmış olsaydı trafik çökmezdi.