deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Cloudflare'ın 2019 regex kesintisi yeniden gündemde: Tek bir WAF kuralından 27 dakikalık 502 hataları

Bir dev.to retrospektifi, Temmuz 2019'daki Cloudflare kesintisini yeniden ele alıyor: simulate modundaki bir WAF kuralındaki bir regex, dünya genelinde CPU'ları %100'e çıkardı ve 27 dakika boyunca 502 hatalarına yol açtı.

Cloudflare'ın 2019 regex kesintisi yeniden gündemde: Tek bir WAF kuralından 27 dakikalık 502 hataları

2 Temmuz 2019'da ne oldu

2 Temmuz 2019'da saat 13:42 UTC'de, yeni birleştirilmiş bir firewall kuralı, 180'den fazla şehirdeki tüm Cloudflare makinelerine otomatik olarak dağıtıldı. Kural, olağan trafik üzerinde işlemci çekirdeklerini başarısız eşleşme denemelerinin sarmalına sokan bir regular expression içeriyordu. İlk uyarı 13:45'te tetiklendi ve Cloudflare arkasındaki siteler dünya genelinde 502 hataları döndürmeye başladı. En kötü noktada trafik %82 düştü ve kesinti 27 dakika sürdü.

Bir dev.to retrospektifine göre, neden bulunduktan sonra toparlanma hızlı ilerledi: WAF yaklaşık 14:00'de tespit edildi, WAF'ın küresel olarak durdurulması 14:02'de önerildi ve 14:07'de uygulandı; trafik ve CPU 14:09 itibarıyla normale döndü. WAF, sorunlu kural olmaksızın 14:52'de tekrar açıldı. Cloudflare CTO'su John Graham-Cumming tam teknik postmortem'i 12 Temmuz'da yayımladı; CEO Matthew Prince ise olayın bir saldırı olmadığını vurguladığı aynı günkü özeti on gün önce paylaşmıştı.

Merkezdeki regex

Kural, cross-site scripting saldırılarında kullanılan inline JavaScript kalıplarını yakalamak için tasarlanmıştı. Postmortem'de yayımlanan tam ifade uzun, ancak Graham-Cumming .*(?:.*=.*) parçasını öne çıkardı; bu da .*.*=.* ifadesine indirgenir: önce herhangi bir şey, sonra herhangi bir şey, ardından bir eşittir işareti, sonra yine herhangi bir şey. Bitişik iki sınırsız wildcard sorunun kalbidir.

Kural, eşleşmeleri istekleri engellemeden kaydeden simulate modunda çalışıyordu. Bu, CPU maliyeti açısından hiçbir fark yaratmadı: postmortem'de açıklandığı gibi, kurallar simulate modunda da çalışmak zorundadır; dolayısıyla hiçbir şeyi engellemeyen bir kuralı çalıştırmak, her şeyi engelleyen bir kural kadar maliyetlidir.

Felaket boyutlu backtracking nasıl patlar

Cloudflare'ın WAF'ı Lua ile yazılmıştı ve kontrolden çıkan ifadelere karşı yerleşik koruması olmayan bir backtracking motoru olan PCRE ile eşleştirme yapıyordu. Açgözlü bir .* önce girdinin tamamını yutar, sonra karakterleri teker teker geri verir; ve ilk wildcard'ın her bölünmesi için motor ikinci wildcard'ın her bölünmesini de dener. Bir eşittir işareti bir yerde varsa, motor onu sonunda bulur; yoksa, motor başarısız olduğunu beyan edebilmeden önce tüm olası kombinasyonları tüketmek zorundadır.

Postmortem'in eki bunu sayısallaştırıyor: x=x için 23 adım, x= ve ardından 20 x için 555 adım, ve hiç eşittir işareti içermeyen 20 x için 4.067 adım. Kalıptaki sondaki noktalı virgül son durumu 5.353 adıma çıkardı. En kötü durum, yani eşleşmeyen girdi, olağan istekleri tarayan bir WAF için en yaygın durum olan aynı zamanda. Bu davranış bilinçli olarak tetiklendiğinde ReDoS olarak bilinir; burada kimsenin bir şey saldırması gerekmedi, çünkü günlük trafik yeterliydi.

Eksik olan korumalar

Postmortem on bir katkıda bulunan neden sayıyor ve üçü öne çıkıyor. Kontrolden çıkan ifadeleri durduracak bir CPU sınırı, kendisi de WAF CPU kullanımını azaltmayı amaçlayan bir refactor sırasında haftalar önce yanlışlıkla kaldırılmıştı. Test paketi kuralların neyi engellediğini ve neye izin verdiğini kontrol ediyordu, ancak bir kuralın çalışmasının ne kadar sürdüğini hiç ölçmüyordu. Ve WAF kuralları, diğer Cloudflare yazılımlarının geçtiği kademeli rollout sürecini bilinçli olarak atlıyordu; böylece tehditlere hızlı yanıt verilebiliyordu: kurallar Quicksilver key-value store üzerinden dağıtılıyor ve p99'da yaklaşık 2,3 saniyede her makineye ulaşıyordu. Önceki 60 günde 476 kural değişikliği olmuştu, kabaca her üç saatte bir; ve bu değişiklik bir acil durum değildi. Yine de anında küresel hale geldi.

Kesintinin arkasındaki bir kill switch

Toparlanma yolu bile tehlikeye girmişti. Dahili kontrol paneli, diğer her şey gibi çöken Cloudflare Access'in arkasındaydı ve bazı mühendislerin kimlik bilgileri, panelin seyrek kullanımı nedeniyle devre dışı bırakılmıştı. Jira ve build sistemine de ulaşılamıyordu ve ekip nadiren kullanılan bir bypass mekanizmasına başvurdu. Müşteriler aynı duvarla karşılaştı: dashboard ve API, Cloudflare'ın kendi edge'i üzerinden çalışıyor; dolayısıyla data plane üzerinde binen bir control plane onunla birlikte çöker.

Cloudflare neleri değiştirdi

Düzeltmeler arasında CPU korumasının geri getirilmesi, yönetilen 3.868 WAF kuralının tamamının elle gözden geçirilmesi, test paketine performans profilleme eklenmesi, WAF'ın ikisi de run-time garantileri taşıyan re2 veya Rust regex motoruna doğru taşınması, acil olmayan kurallar için kademeli rollout'lar ve dashboard ile API için edge'i atlayan bir acil durum rotası yer aldı.

Neden önemli

Retrospektifin ana noktası, bu olayla ilgili hiçbir şeyin tarihe karışmadığı. Bugün herkes .*.*=.* yazabilir ve çoğu code review ile test paketi bunu yakalamaz, çünkü bunlar doğruluğu, maliyeti değil, test eder. Kalıcı dersler sistemseldir: regex çalışma süresine sert sınırlar koyun, CI'da performansı ölçün, kural rollout'larını diğer kod değişiklikleri gibi kademeli yapın ve tek kill switch'i asla kapatması gereken altyapının arkasına koymayın. Postmortem ayrıca suçsuz analiz için bir standart belirledi: ilk nedeni basitçe bir mühendisin muazzam backtracking'e yatkın bir regex yazması; diğer on ise bunu saniyeler içinde dünya genelindeki her sunucuya taşıyan sistemi tarif ediyor.

  • #cloudflare
  • #regex
  • #outage
  • #web-infrastructure
  • #waf

İlgili yazılar