İnternet tarihinin en büyük DDoS saldırılarına yol açan HTTP/2 Rapid Reset zafiyetini simüle edin. Yalnızca birkaç yüz TCP bağlantısı üzerinden gönderilen RST_STREAM fırtınasının Nginx ve Envoy sunucularında yarattığı CPU kilitlenmesini, HPACK bellek çalkantısını ve koruma bütçelerini hesaplayın.
HTTP/3 QUIC, TCP yerine UDP uzerinde bagimsiz akislar kullanir. Tek bir akistaki paket kaybi veya reset diger akislari kilitlemez (Sifir Head-of-Line blokaji).
RFC 9114 ve RFC 9000 uyarinca HTTP/3, MAX_STREAMS cercevesi ile istemciye dinamik akis kredisi verir. Kredi bittiginde istemci yeni akis acamaz.
HTTP/3'te RESET_STREAM ve STOP_SENDING cerceveleri ayrilmistir; sunucu henuz yanit uretmeden gelen resetleri akis olusturma yukunu atlayarak cok daha hafif sonlandirir.
Nginx, Envoy, HAProxy ve Caddy için CVE-2023-44487 önleyici kurallar.
# /etc/nginx/nginx.conf
# HTTP/2 Rapid Reset (CVE-2023-44487) Sertlestirme Yapilandirmasi
http {
# 1. Hizli istek ve reset firtinasini IP basina limitle
limit_req_zone $binary_remote_addr zone=h2_rst_limit:10m rate=100r/s;
server {
listen 443 ssl http2;
server_name example.com;
# 2. Eszamanli akis limitini muhafazakar bir degere (varsayilan 128 yerine 64) cekin
http2_max_concurrent_streams 64;
# 3. Tek bir TCP baglantisinda islenebilecek toplam istek limitini belirleyin
keepalive_requests 1000;
location / {
# Asiri reset atan IP'leri kuyruksuz aninda 429 Too Many Requests ile durdur
limit_req zone=h2_rst_limit burst=50 nodelay;
proxy_pass http://127.0.0.1:3000;
}
}
}
HTTP/1.1 protokolünde her istek için ya yeni bir TCP bağlantısı açılması ya da önceki isteğin yanıtının beklenmesi (pipelining sınırları) gerekiyordu. 2015 yılında tanıtılan HTTP/2 (RFC 7540), tek bir TCP bağlantısı üzerinde yüzlerce bağımsız akışın (stream) eşzamanlı olarak taşınmasını (multiplexing) sağladı. İstemcinin bir isteği iptal edebilmesi için de RST_STREAM çerçevesi tasarlandı.
2023 sonlarında keşfedilen ve 2026 altyapı güvenliğinde hala kritik bir test senaryosu olan Rapid Reset zafiyeti, bu akış iptal mantığındaki asimetriyi sömürür: İstemci bir HEADERS çerçevesi gönderir ve sunucunun bunu işlemesini beklemeden hemen arkasından bir RST_STREAM fırlar. Sunucu HPACK tablosunu güncellemek, bellek tahsis etmek ve yönlendirme middleware'lerini çalıştırmak zorunda kalırken, istemci neredeyse sıfır bant genişliğiyle saniyede yüz binlerce istek üretebilir.
Bir HTTP/2 sunucusu gelen isteği işlerken şu adımlardan geçer:
Modern Nginx, Envoy ve HAProxy sürümleri bu saldırıya karşı RST Bütçesi (Reset Budget) yaklaşımını benimsemiştir:
Tek bir TCP bağlantısında izin verilen meşru akış iptal sayısı sınırlanır (örneğin saniyede en fazla 100 reset). Bir istemci bu eşiği aştığında sunucu GOAWAY çerçevesi gönderir ve TCP bağlantısını derhal kapatır. Böylece saldırganın bağlantı havuzu çöker ve saldırı gücü %95'in üzerinde kırılır.
HTTP/3 (RFC 9114), aktarım katmanında TCP yerine QUIC protokolünü kullanır. QUIC akışları, taşıma düzeyinde kredi tabanlı akış kontrolü (Credit-based Flow Control) ile yönetilir. Sunucu, istemciye MAX_STREAMS çerçevesiyle izin verilen toplam akış sayısını bildirir. İstemci hızlıca reset atsa dahi, sunucu yeni kredi tahsis etmediği sürece yeni bir akış ID'si kullanamaz. Ayrıca HTTP/3'te QPACK kullanımı, akışlar arası kilit yarışlarını engelleyerek CPU yığılmasını önler.
1. Akış Limitini Düşürün: Nginx üzerinde varsayılan 128 olan http2_max_concurrent_streams değerini 64'e çekmek saldırı yüzeyini daraltır.
2. Nginx limit_req ile IP Sınırlandırması: limit_req_zone $binary_remote_addr zone=h2:10m rate=100r/s; kuralı ile tek bir IP'den gelen anormal istek fırtınasını doğrudan 429 koduyla engelleyin.
3. HAProxy Hata Takibi: HAProxy kullanıyorsanız stick-table ile sc_http_err_rate değerini izleyerek kısa sürede 100'den fazla reset üreten IP'lerin bağlantılarını TCP seviyesinde reddedin.