3 puan yazan GN⁺ 2024-04-06 | 1 yorum | WhatsApp'ta paylaş

HTTP/2 CONTINUATION Flood açığı: teknik ayrıntılar

  • CONTINUATION Flood, birden fazla HTTP/2 protokol uygulamasında bulunan ve Rapid Reset saldırısından daha ciddi bir tehdit oluşturan bir zafiyet sınıfıdır.
  • Saldırının sonuçları sunucu çökmesinden performans düşüşüne kadar değişebilir ve saldırı istekleri HTTP erişim günlüklerinde görünmez.

Önsöz

  • 2023 Ekim ayında HTTP/2 Rapid Reset saldırısını öğrendikten sonra, HTTP/2 üzerinde güvenlik analizi perspektifinden araştırma yapmaya karar verildi.

HTTP/2'ye kısa bir giriş

  • HTTP/1.1 ile HTTP/2 arasındaki temel fark, ikincisinin ikili bir protokol olması ve istemci ile sunucunun metin satırları yerine frame alışverişi yapmasıdır.
  • HEADERS frame'i ve CONTINUATION frame'i hakkında açıklama gereklidir.

HEADERS frame'i

  • HEADERS frame'i, istek ve yanıtların HTTP başlıklarını taşımak için kullanılır ve başlık verilerini sıkıştırmak için HPACK kodlama algoritmasını kullanır.
  • Frame üzerinde END_HEADERS ve END_STREAM gibi bayraklar ayarlanabilir.

CONTINUATION frame'i

  • CONTINUATION frame'i, HEADERS frame'ine çok benzer ancak yalnızca END_HEADERS bayrağına sahiptir; bu bayrak ayarlandığında başlık akışının sona erdiği anlamına gelir.

CONTINUATION Flood zafiyeti

  • İstemci yeni bir HTTP/2 akışı başlatıp HEADERS ve CONTINUATION frame'leri gönderir, ancak END_HEADERS bayrağını asla ayarlamazsa, sunucu sonsuz bir başlık akışını ayrıştırmak ve bellekte saklamak zorunda kalır.
  • HTTP/1.1'de başlık boyutu sınırları ve istek/başlık zaman aşımları sonsuz başlıklara karşı koruma sağlar, ancak birçok HTTP/2 sunucusunda bu korumalar eksik ya da hatalı uygulanmıştır.

CPU tüketimi: Golang örneği

  • Golang, CONTINUATION Flood nedeniyle CPU tüketimine bir örnektir; HEADERS frame'lerini ve CONTINUATION frame'lerini işlemek için http2MetaHeadersFrame adlı soyut bir sınıf kullanır.
  • HPACK çözücüsü, başlık boyutu sınırına ulaşıldığında başlık yayımını durduracak şekilde ayarlanmıştır, ancak END_HEADERS bayrağı yoksa fonksiyon geri dönmez ve başlıkları çözümlemeye devam eder.

Bellek yetersizliği

  • Bellek yetersizliği en ciddi durumlardan biridir; bazı uygulamalar CONTINUATION frame'leriyle oluşturulan başlık listesinin boyutunu sınırlamaz.
  • Başlık zaman aşımı olmayan uygulamalarda, tek bir HTTP/2 bağlantısı bile sunucuyu çökertebilir.

Tetiklenebilir assertion çökmesi: Node.js (özel durum)

  • Node.js, sonsuz CONTINUATION frame akışını uygun şekilde işler, ancak başlık akışı sırasında bağlantı kesildiğinde bir veri yarışı hatası oluşur.
  • Node.js, Http2Session yıkıcısı içinde bellek tahsisini izler ve bağlantı kesildiğinde current_nghttp2_memory_ değeri eşzamanlı olarak güncellenerek çökmeye yol açabilir.

Önceki HTTP/2 zafiyetleriyle karşılaştırma

  • Geçmişte birden fazla HTTP/2 zafiyeti raporlandı ve CONTINUATION Flood önceki zafiyetlerden farklı şekilde çalışır.
  • CONTINUATION Flood, boş başlıklar göndermek yerine sunucu tarafından belirlenen frame boyutu sınırına kadar çok sayıda rastgele başlık gönderir.

Son notlar

  • HTTP/2 trafiği, insanlar tarafından üretilen tüm HTTP trafiğinin yaklaşık %60'ını oluşturur ve etkilenen projelerin önemi düşünüldüğünde internetin önemli bir bölümü kolayca istismar edilebilen bu zafiyetten etkilenmiştir.
  • Bu zafiyet doğada gerçekten istismar edildiyse, uygun HTTP/2 bilgisi olmayan sunucu yöneticileri için hata ayıklama son derece zor olurdu.

GN⁺ görüşü

  • Bu zafiyet, özellikle günlüklerde kaydedilmemesi nedeniyle, sunucunun kullanılabilirliğini ciddi biçimde düşürebilir ve izleme ile müdahaleyi zorlaştırır.
  • Sunucu yöneticileri düzenli olarak güvenlik güncellemelerini uygulamalı ve olağandışı kalıpları tespit etmek için trafik analiz araçları kullanmalıdır.
  • Bu tür zafiyetler siber güvenlik topluluğu için bir uyarı niteliğindedir ve daha güvenli protokol tasarımı ile uygulamasının önemini vurgular.
  • Eleştirel bakıldığında bu zafiyet, yaygın kullanılan bir protokoldeki temel tasarım kusurunu ortaya koyar; bu da internetin temel altyapısının güvenilirliği konusunda soru işaretleri doğurur.
  • İlgili alanda bilgi sahibi uzmanlar dışında, bu tür karmaşık zafiyetleri anlamak ve bunlara yanıt vermek zor olabilir; bu nedenle güvenlik eğitimi ve farkındalığının artırılması gerekir.

1 yorum

 
GN⁺ 2024-04-06
Hacker News görüşü
  • Bu sorun yakın zamanda Bandit'te çözüldü

    • Bir ay önce Bandit'te aynı sorunu çözdüğüne dair kişisel deneyim.
    • Bağlantı üzerinden kodun somut konumu sağlanıyor.
    • Uygulayıcının bakış açısından bu sorun oldukça barizdi ve diğer implementasyonların da zaten savunma önlemleri almış olduğunu düşünmüştü.
    • Ancak onlarca implementasyonu kontrol ettikten sonra, büyük HTTP/2 sunucularında bile bu tür korumaların ya hiç bulunmadığı ya da hatalı uygulandığı görüldü.
  • Geliştirme kültürüne yönelik eleştiri

    • Geliştiricilerin otomatik olarak dinamik biçimde ölçeklenen yapılara fazla alıştığı, bu yüzden bir şeyin ne kadar büyüyebileceği üzerine düşünmedikleri bir kültürün sorun olduğu belirtiliyor.
    • Bu tür sorunlar yalnızca HTTP/2 ile sınırlı değil, ancak HTTP/2'nin karmaşıklığı sorunu daha da kötüleştirebilir.
    • Geçmişte HTTP/1.x döneminde C gibi diller kullanılırken buffer uzunluklarının yönetimine sürekli dikkat etmek gerekiyordu ve istek başlığı tahsisini sonsuza kadar büyütmek gibi bir şey yapılmazdı.
  • Etkilenmeyen sunucu/reverse proxy listesi

    • Önceki yazıda belirtilen, etkilenmeyen web sunucuları ve reverse proxy listesi.
    • Nginx, Jetty, HAProxy, NetScaler, Varnish etkilenmiyor.
  • HTTP/1.1'in güvenliği üzerine düşünce

    • Sitelerinin gün boyu ilgi gördüğünden bahsediliyor.
    • Sitelerinin trafiği düşükse, HTTP/1.1 kullanmanın daha güvenli olup olmadığı soruluyor.
  • Yazara övgü

    • Yazarın geniş bir bakış açısıyla yaklaşması, bulduklarını sorumlulukla bildirmesi ve bunları okunması kolay bir şekilde paylaşması övülüyor.
  • Slowloris v2'ye değinme

    • Bu sorun yavaşça tetiklenirse buna 'slowloris v2' denebileceğine dair bir şaka yapılıyor.
  • Yazım hatasına değinme

    • 'serveral retries' yazım hatası eğlenceli bulunuyor.
  • HTTP/2'ye eleştirel bakış

    • HTTP/2'nin, uygulama katmanı protokolüne "upgrade" için bir taşıma katmanı gibi nasıl zorla sokulabildiğine yönelik eleştiri.