Genel Bakış
Google Chrome 51 (2016) ile tanıtılan ve ardından RFC 6265bis'te standartlaştırılan SameSite cookie özelliği, tarayıcılara bir isteğin farklı bir siteden kaynaklanması durumunda cookie'nin gönderilip gönderilmeyeceğini bildirir. Bu özellik açıkça belirtilmediğinde veya haklı bir neden olmaksızın SameSite=None olarak ayarlandığında, tarayıcı cookie'yi üçüncü taraf sayfalar tarafından başlatılan çapraz kaynaklı isteklere ekleyebilir. Bu davranış, Cross-Site Request Forgery (CSRF) saldırılarının temel ön koşuludur ve siteler arası bilgi sızıntısına da katkıda bulunur.
2020 öncesinde tarayıcıların örtük varsayılanı, cookie'leri kökenden bağımsız olarak tüm isteklerle göndermekti (SameSite=None ile eşdeğer). Modern tarayıcılar (Chrome 80+, Firefox, Safari) artık özellik yoksa varsayılan olarak SameSite=Lax uygulamakta ve riski kısmen azaltmaktadır; ancak bu tarayıcı düzeyindeki varsayılan, açık sunucu tarafı yapılandırmasının yerini tutmaz; çünkü eski tarayıcılar ve standart dışı kullanıcı aracıları bu sezgisel kuralı uygulamaz.
Nasıl çalışır?
SameSite özelliği, her biri farklı bir uygulama düzeyi tanımlayan üç değer alır:
- Strict: Cookie yalnızca istek, cookie'nin alanıyla aynı siteden geldiğinde gönderilir. Hiçbir koşulda siteler arası gönderim gerçekleşmez.
- Lax: Cookie, aynı site istekleriyle ve güvenli HTTP yöntemleri (GET, HEAD) kullanan üst düzey gezinmelerle (örneğin bir bağlantıya tıklama) gönderilir. Siteler arası alt kaynak isteklerinde (resimler, iframe'ler, AJAX/fetch) gönderilmez.
- None: Cookie, kökenden bağımsız olarak tüm isteklerle gönderilir. Aynı anda
Secureözelliğinin de ayarlanmasını gerektirir; aksi hâlde modern tarayıcılar cookie'yi tamamen reddeder.
Özellik eksik olduğunda ve tarayıcı Lax'e geri döndüğünde, durum değiştiren GET uç noktaları açık kalır. Tarayıcı eski veya uyumsuzsa ve None davranışına eşdeğer biçimde geri dönerse, tüm durum değiştiren uç noktalar açığa çıkar. Bir saldırgan bunu kontrol ettiği bir sayfaya yerleştirdiği sahte bir istekle (otomatik form gönderimi, resim etiketi, fetch çağrısı) sömürebilir:
- Kurban
bank.example.com'da kimliği doğrulanmış durumda;SameSiteiçermeyen bir oturum cookie'si depolanmış. - Kurban, saldırganın kontrolündeki
evil.example.com'u ziyaret eder. - Kötü amaçlı sayfa,
bank.example.com/transfer'e sessizce bir POST isteği gönderir. - Tarayıcı oturum cookie'sini otomatik olarak ekler ve sunucu isteği meşru olarak işler.
CSRF'nin ötesinde, eksik SameSite özelliği aynı zamanda siteler arası arama saldırılarına ve bir saldırganın cookie varlığından kimlik doğrulama durumunu çıkardığı zamanlama yan kanallarına da olanak tanır.
İş etkisi
Eksik SameSite özelliğinin mümkün kıldığı başarılı bir CSRF saldırısı, bir saldırganın kurbanın kimliği doğrulanmış hâlde gerçekleştirebileceği her eylemi yapmasına izin verir; bunlar arasında hesap kimlik bilgilerini veya e-posta adreslerini değiştirme, finansal transfer başlatma, yapılandırma değiştirme veya veri silme sayılabilir. Saldırganın kurbanın kimlik bilgilerini bilmesine gerek yoktur; yalnızca kurbanın aktif oturumu yeterlidir.
Uyumluluk açısından OWASP ASVS (Düzey 1, gereksinim 3.4.3), oturum yönetimine ilişkin PCI DSS gereksinimleri ve kişisel verileri uygun teknik önlemlerle koruma yükümlülüğü kapsamındaki GDPR ihlalleri söz konusu olabilir. Düzenlenmiş sektörlerdeki kuruluşlar, bu yanlış yapılandırmadan kaynaklanan bir ihlal sonrasında para cezası, denetim bulgusu veya sözleşmesel yaptırımlarla karşılaşabilir.
Nasıl giderilir?
- Tüm oturum ve kimlik doğrulama cookie'leri için temel olarak
SameSite=Laxayarlayın. Bu, çoğu uygulama için önerilen varsayılandır; siteler arası alt kaynak isteklerinde cookie iletimini önlerken üst düzey gezinmeler için işlevselliği korur. - Yönetim oturumları veya ödeme akışları gibi son derece hassas cookie'ler için
SameSite=Strictkullanın; siteler arası gezinme bağlantılarını kesmenin kabul edilebilir olduğu durumlarda bu tercih edilir. - Cookie'nin açıkça bir siteler arası bağlamda gerekli olmadığı durumlarda
SameSite=None'dan kaçının (örn. gömülü widget'lar, OAuth akışları).Nonezorunluysa her zamanSecureile birleştirin ve Eşzamanlayıcı Belirteç Modeli veya Çift Gönderim Cookie Modeli gibi ek CSRF savunmaları uygulayın. - Özelliği sunucu tarafında, her
Set-Cookieyanıt başlığında ayarlayın; tarayıcı varsayılanlarına güvenmeyin. Örnek:Set-Cookie: sessionid=abc123; Path=/; HttpOnly; Secure; SameSite=Lax - Birinci taraf kodu ve üçüncü taraf kütüphane/çerçeveler tarafından üretilen tüm cookie'leri denetleyin. Pek çok web çerçevesi genel cookie yapılandırması sunar (örn. Django'da
SESSION_COOKIE_SAMESITE, Express-session'dacookie.sameSite, Spring Boot'tasession.cookie.samesite). - Yalnızca tarayıcı varsayılanlarına hafifletme olarak güvenmeyin; eski tarayıcılar, gömülü WebView'lar ve standart dışı istemciler
Laxvarsayılan davranışını uygulamayabilir. - Savunmaları katmanlayın: Tüm durum değiştiren istekler için CSRF belirteçleri,
Origin/Refererbaşlık doğrulaması ve aynı cookie'lerdekiHttpOnlyileSecurebayraklarıylaSameSite'ı tamamlayın.
Kaynaklar
- OWASP – SameSite
- OWASP – Siteler Arası İstek Sahteciliği (CSRF)
- OWASP CSRF Önleme Kopya Kâğıdı
- OWASP Oturum Yönetimi Kopya Kâğıdı
- MITRE CWE-1275 – Uygunsuz SameSite Özelliğine Sahip Hassas Cookie
- MDN Web Docs – Set-Cookie: SameSite
- IETF RFC 6265bis – Cookie'ler: HTTP Durum Yönetimi Mekanizması (taslak)
- web.dev – SameSite cookie'leri açıklandı