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
Hacker News görüşü
Bu sorun yakın zamanda Bandit'te çözüldü
Geliştirme kültürüne yönelik eleştiri
Etkilenmeyen sunucu/reverse proxy listesi
HTTP/1.1'in güvenliği üzerine düşünce
Yazara övgü
Slowloris v2'ye değinme
Yazım hatasına değinme
HTTP/2'ye eleştirel bakış