Bir WebSocket sunucusu neredeyse her zaman HTTP de konuşur: soketi açan sayfayı sunar, sağlık denetimlerini yanıtlar, bir API barındırır veya ön ucunuza yönlendirir. Bu HTTP yüzeyinin kendine özgü iyi bilinen saldırı sınıfları vardır ve en son sgcWebSockets, en önemlilerini varsayılan olarak kapatır. Bu, her iki HTTP sunucusu için de geçerlidir: Indy tabanlı TsgcWebSocketHTTPServer ve Windows http.sys tabanlı TsgcWebSocketServer_HTTPAPI.
Dizin gezinme kapatıldı
DocumentRoot ayarlayarak statik dosyalar sunuyorsanız, sunucu eskiden dosya yolunu belge kökünü istek yoluyla birleştirerek oluştururdu. GET /../../../../windows/win.ini gibi bir istek veya URL kodlamalı biçimi olan /..%2f..%2f..., web kökünün dışına çıkıp rastgele dosyaları okuyabilirdi. Sunucu artık çözümlenen yolu kanonikleştirir ve yalnızca DocumentRoot içinde kaldığında sunar; dışarı çıkan her şey reddedilir. Bu hem HTTP/1.x hem de HTTP/2 yollarında her zaman etkindir ve herhangi bir yapılandırma gerektirmez.
İstek gövdesinin sınırlandırılması
Bir HTTP istek gövdesinin yerleşik bir boyut sınırı yoktur, dolayısıyla bir istemci çok büyük bir Content-Length bildirip sunucu belleğini tüketmek için gigabaytlarca veri akıtabilirdi. Yeni MaxRequestBodySize özelliği bunu sınırlandırır. Varsayılan olarak 64 MB'dir ve daha fazlasını bildiren bir istek, gövde arabelleğe alınmadan önce 413 ile reddedilir. Büyük yüklemeler için bunu yükseltin veya sınırı devre dışı bırakmak için 0 olarak ayarlayın.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 80;
oServer.MaxRequestBodySize := 16 * 1024 * 1024; // 16 MB, reject larger with 413
oServer.Active := True;
Daha katı istek ayrıştırması kaçakçılığı durdurur
HTTP istek kaçakçılığı, bir isteğin nerede bitip bir sonrakinin nerede başladığı konusunda anlaşamayan sunucuları, genellikle hem bir Content-Length hem de bir Transfer-Encoding: chunked başlığı göndererek kötüye kullanır. Varsayılan olarak etkin olan yeni StrictRequestParsing özelliği, bu tür belirsiz istekleri 400 ile reddeder ve daha katı chunked kodlama doğrulaması uygular, böylece bir ön uç proxy ile sunucu senkronizasyonu bozulamaz.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.StrictRequestParsing := True; // default: reject Content-Length + Transfer-Encoding
oServer.MaxRequestBodySize := 64 * 1024 * 1024;
oServer.Active := True;
HTTP/2 Rapid Reset savunması
HTTP/2 Rapid Reset saldırısı (CVE-2023-44487), bir akış açıp onu hemen RST_STREAM ile sıkı bir döngü içinde iptal eder ve sunucuyu, istemciye neredeyse hiçbir maliyet olmadan sınırsız istek işi yapmaya zorlar. HTTP/2 sunucusu artık tek bir bağlantının kaç sıfırlama ve kontrol çerçevesi gönderebileceğini sınırlar, varsayılan olarak 100 eşzamanlı akışlık sonlu bir değerle gelir ve kötüye kullanan bir bağlantıyı bir GOAWAY çerçevesiyle kapatır. HTTP/2 isteğe bağlıdır, dolayısıyla bu yalnızca onu etkinleştirdiyseniz önem taşır, ancak etkinleştirdiyseniz savunma otomatiktir.
Daha temiz yanıt başlıkları
Bir uygulama, istekten etkilenen verilerden bir yanıt başlığı oluşturduğunda, örneğin bir yönlendirme hedefi veya bir varlık etiketi, bu değere sokuşturulan bir satır başı veya satır besleme karakteri yanıtı bölüp ekstra başlıklar enjekte edebilirdi. http.sys sunucusu artık Location, Server ve ETag gibi yanıt başlığı değerlerinden CR ve LF karakterlerini ayıklar, böylece tek bir değer artık iki başlığa dönüşemez.
Güvenlik duvarının yeri
Bu korumalar, Firewall ve RateLimiter bileşenlerinin ulaşamadığı katman olan sunucunun kendi HTTP ayrıştırıcısında ve dosya sunucusunda yer alır. IP filtreleme, hız sınırları ve köken politikası için güvenlik duvarını kullanmaya devam edin ve yerleşik savunmaların ayrıştırmayı ve statik sunumu korumasına izin verin. Genel erişime açık bir sunucu için ayrıca DocumentRoot'u yalnızca gerçekten dosya sunduğunuzda ayarlamanızı, MaxRequestBodySize'ı gerçek üst sınırınıza göre ayarlamanızı ve MaxConnections'ı sınırlamanızı öneririz.
Yükseltme
Yeni korumalar, güncellediğiniz anda güvenli varsayılanlarla etkin olur, dolayısıyla çoğu sunucu bir kod değişikliği olmadan bu güçlendirmeyi kazanır. Uygulamanız 64 MB'den büyük istek gövdeleri kabul ediyorsa, MaxRequestBodySize'ı buna göre yükseltin. Mevcut istemciler etkilenmez.
sgcWebSockets indirme sayfasından güncelleyin veya GetIt aracılığıyla ya da kayıtlı hesabınızdan edinin.
Sorular, geri bildirim veya geçiş yardımı mı? İletişime geçin, kodu yazan kişilerden bir yanıt alacaksınız.
