CSWSH zafiyeti nedir ve nasıl çalışır?
Cross-Site WebSocket Hijacking
WebSocket, tarayıcı ile sunucu arasında çift yönlü (full-duplex) ve kesintisiz bir iletişim kanalı açar. Canlı sohbetler, borsa grafikleri veya online oyunlar bu teknolojiyle çalışır. Ancak bu bağlantının ilk kurulma anı (handshake / el sıkışma) bildiğimiz standart bir HTTP isteği ile başlar.
Saldırı tam olarak şu adımlarla gerçekleşir:
- Oturum Açma: Kurban kullanıcı, hedef güvenli siteye (örneğin
banka.com) giriş yapar. Tarayıcıda bu siteye ait bir oturum çerezi (session cookie) oluşur. - Tuzak: Kullanıcı oturumu kapatmadan, saldırganın hazırladığı zararlı bir web sitesini ziyaret eder.
- Gizli İstek: Saldırganın sitesindeki kötü niyetli JavaScript kodları, arka planda kullanıcının haberi olmadan
banka.com‘un WebSocket adresine (wss://[banka.com/live](https://banka.com/live)) bir bağlantı isteği gönderir. - Tarayıcı Otomatizmi: Klasik tarayıcı davranışı gereği, tarayıcı
banka.com‘a giden bu yeni isteğin arkasına kullanıcının oturum çerezlerini otomatik olarak ekler. - Ele Geçirme: Eğer sunucu gelen isteğin hangi siteden (Origin) geldiğini kontrol etmiyorsa, bağlantıyı onaylar. Saldırgan artık kurbanın kimliğiyle açılmış canlı bir WebSocket hattına sahip olur.
Klasik CSRF’ten Farkı Nedir? Neden Daha Tehlikeli?
Klasik bir CSRF saldırısında saldırgan sunucuya tek taraflı bir istek gönderebilir (örneğin “şifremi değiştir” veya “para transfer et”) ama sunucunun döndüğü cevabı (response) okuyamaz. Çünkü tarayıcının Aynı Politikası (SOP – Same-Origin Policy) buna engel olur.
Ancak WebSocket’lerde durum farklıdır:
Önemli Fark: WebSocket protokolü, tarayıcıların standart SOP tarafından kısıtlanmaz. Bağlantı bir kez kurulduktan sonra saldırgan sunucuya sadece veri göndermekle kalmaz; sunucudan kurbana gelen tüm canlı verileri, mesajları ve hassas bilgileri de anlık olarak okuyabilir.
Neden “Klasik Tarayıcı” Davranışı Diyoruz?
Tarayıcılar tarihsel olarak internetin açık ve esnek olması amacıyla tasarlanmıştır. Bir siteye istek atıldığında o siteye ait çerezlerin otomatik olarak gönderilmesi, internetin temel bir kuralıydı.
Günümüzde modern tarayıcılar bu riski azaltmak için çerezlere varsayılan olarak SameSite=Lax özelliği getirse de, eski (klasik) tarayıcı yapılandırmaları veya yanlış konfigüre edilmiş çerez politikaları bu otomatik gönderimi sürdürerek CSWSH’e davetiye çıkarır.
CSWSH Zafiyetinden Korunma Yolları
Bu zafiyeti engellemek tamamen geliştiricinin ve sunucu mimarisinin sorumluluğundadır. En etkili yöntemler şunlardır:
- Origin Başlığı Kontrolü (En Kritik Adım): Sunucu, WebSocket el sıkışma isteği geldiğinde HTTP başlığındaki
Origin(isteğin hangi siteden geldiği) bilgisini kontrol etmelidir. Eğer isteksaldirgan.com‘dan geliyorsa bağlantıyı derhal reddetmelidir. - CSRF Token Kullanımı: Tıpkı web formlarında olduğu gibi, WebSocket bağlantısı başlatılırken URL’e veya istek gövdesine tahmin edilemez, rastgele bir token eklenmeli ve sunucu tarafında doğrulanmalıdır.
- SameSite Çerez Politikası: Oturum çerezleri tanımlanırken
SameSite=Strictveya en azındanSameSite=Laxöznitelikleri kullanılmalıdır. Bu sayede çerezlerin üçüncü taraf sitelerden gelen isteklerle birlikte gitmesi engellenir. - WSS (WebSocket Secure) Kullanımı: Verilerin yolda dinlenmesini (Man-in-the-Middle) engellemek için her zaman şifreli olan
wss://protokolü tercih edilmelidir.