Genel Bakış
Aynı Kaynak İlkesi (Same-Origin Policy – SOP), bir kaynaktaki (şema + host + port) JavaScript'in farklı bir kaynaktan gelen yanıtları okumasını engelleyen bir tarayıcı güvenlik mekanizmasıdır. WHATWG Fetch Standard'da tanımlanan Cross-Origin Resource Sharing (CORS) protokolü, bu kısıtlamayı kontrollü biçimde gevşetmek için tasarlanmıştır: bir sunucu, Access-Control-Allow-Origin ve ilgili yanıt başlıklarını ayarlayarak hangi yabancı kaynakların yanıtlarını okuyabileceğini açıkça belirtebilir.
CORS yanlış yapılandırması, bir sunucunun çapraz kaynak erişimini gereğinden geniş tuttuğu durumlarda ortaya çıkar; örneğin istenen kaynağı (origin) doğrulamadan yansıtmak, tüm alt etki alanlarını doğrulama yapmadan güvenmek ya da Access-Control-Allow-Origin: * ile Access-Control-Allow-Credentials: true'yu kimliği doğrulanmış yanıtları açığa çıkaracak biçimde birlikte kullanmak gibi. Bir saldırgan, kurbanın tarayıcısını kendi sitesine yönlendirebilirse sunucunun yanıtlarını kurbanmış gibi okuyabilir ve Aynı Kaynak İlkesi'nin sağlamayı amaçladığı korumayı devre dışı bırakabilir.
Nasıl çalışır?
Tarayıcı çapraz kaynak isteği gönderdiğinde, isteğe bir Origin başlığı ekler. Sunucunun CORS politikası, yanıtın isteği yapan betiğe sunulup sunulmayacağını belirler. Yaygın yanlış yapılandırma kalıpları şunlardır:
- Origin yansıtma: Sunucu gelen
Originbaşlığını okuyupAccess-Control-Allow-Originolarak aynen geri döndürür ve bunuAccess-Control-Allow-Credentials: trueile birleştirir. Bu durumda saldırgan kontrolündeki bir alan dahil her kaynak fiilen güvenilir sayılır. - Joker karakter ile kimlik bilgisi:
Access-Control-Allow-Origin: *veAccess-Control-Allow-Credentials: truebirlikte döndürülür. Tarayıcılar bu kombinasyonu spesifikasyon gereği redderse de bazı sunucu tarafı çerçeveler bu hatayı farkında olmadan yapar; hatalı yapılandırılmış ters proxy'ler ise başlıkları aşağı akışta değiştirebilir. - Zayıf origin doğrulaması:
Origindeğerinin yalnızca güvenilir bir dize içerip içermediği veya o dizeyle bitip bitmediğinin kontrol edilmesi (örneğinexample.com); bu yöntemevil-example.comveyanotexample.comgibi değerlerle atlatılabilir. - Null origin güveni:
Origin: nulldeğerine izin vermek; bu değer, korumalı alandaki (sandboxed) iframe'ler, data URI'leri ve belirli yönlendirmeler tarafından gönderilebilir — bunların hepsi saldırgan tarafından kontrol edilebilir. - Keyfi alt etki alanlarına güvenmek:
*.example.com'a izin vermek, alt etki alanı ele geçirmesi (subdomain takeover) gibi yollarla ele geçirilmiş bir alt etki alanının örtülü olarak güvenilir sayılması sonucunu doğurabilir.
İstismar, basit bir çapraz site isteği kalıbını izler: saldırgan kendi alanında, hedef API uç noktasına istek gönderen, yanıt gövdesini (oturum belirteçleri, kişisel veriler veya iş açısından kritik bilgiler içerebilir) okuyan ve bu veriyi dışarıya sızdıran JavaScript barındırır. Tarayıcı kurbanın çerezlerini isteğe ekleyeceğinden yanıt tamamen kimlik doğrulamalıdır.
İş etkisi
Kimliği doğrulanmış bir uç noktada başarıyla sömürülen bir CORS yanlış yapılandırması şu sonuçlara yol açabilir:
- Hesap ele geçirme: Yanıtlarda dönen oturum belirteçlerinin, OAuth tokenlarının veya API anahtarlarının çalınması.
- Hassas veri ifşası: JSON API'lerinden kişisel verilerin, finansal kayıtların, iç yapılandırma bilgilerinin veya fikri mülkiyetin okunması — GDPR, HIPAA, PCI-DSS ve benzeri düzenlemeler kapsamında doğrudan bir ihlal.
- Yetki yükseltme: Yalnızca ayrıcalıklı rollere açık iç API'lerde, bir yöneticiyi kötü amaçlı bir sayfayı ziyaret etmeye ikna eden saldırgan yöneticiye özel verileri okuyabilir.
- İtibar ve düzenleyici zarar: Uygulama katmanı yanlış yapılandırmalarından kaynaklanan veri ihlalleri, düzenleyiciler tarafından giderek artan ölçüde incelenmekte ve önemli mali yaptırımları beraberinde getirmektedir.
Nasıl düzeltilir?
- Güvenilen kaynaklar için açık bir izin listesi oluşturun. Gelen
Originbaşlığını, bilinen ve güvenilen kaynakları içeren sunucu tarafı bir kümeyle tam dize eşleştirmesi kullanarak karşılaştırın. Yalnızca alt dize veya sonek denetimlerine güvenmeyin. - İstek
Originbaşlığını doğrulama yapmadan hiçbir zaman yansıtmayın. Mantıkresponse.setHeader('Access-Control-Allow-Origin', request.headers.origin)şeklinde herhangi bir denetim olmadan işliyorsa dünyadaki her kaynak güvenilir sayılmış demektir. - Üretim uç noktaları için
nullorigin'e izin vermeyin. Açık ve belgelenmiş bir gereklilik olmadıkçanulldeğerini güvenilmez olarak kabul edin. - Joker karakteri (
*) yalnızca tamamen açık, kimlik doğrulaması gerektirmeyen kaynaklar için kullanın.Access-Control-Allow-Origin: *ileAccess-Control-Allow-Credentials: true'yu hiçbir zaman birlikte kullanmayın. Access-Control-Allow-Credentials: true'yu yalnızca kesinlikle gerekli olduğunda ve yalnızcaAccess-Control-Allow-Origin'de doğrulanmış belirli bir kaynakla birlikte ayarlayın.Access-Control-Allow-MethodsveAccess-Control-Allow-Headersdeğerlerini uygulamanın gerçekten ihtiyaç duyduğu minimum kümeyle sınırlayın.Access-Control-Allow-Origindeğeri dinamik olarak hesaplandığındaVary: Originyanıt başlığını ekleyin; böylece önbellekler bir kaynağın yanıtını başka bir kaynağa sunmaz.- Uygulama mantığından bağımsız olarak CORS başlıkları ekleyebilen veya geçersiz kılabilen üçüncü taraf kütüphaneleri ve ters proxy yapılandırmalarını (örn. nginx, API ağ geçitleri) denetleyin.
- CORS politikalarını sunucu tarafında uygulayın, istemci tarafı kodda değil. Tarayıcı tarafındaki geçici çözümler bir güvenlik denetimi değildir.
Sensagraph, web uygulamalarının sürekli taranması sırasında izin verici ve yanlış yapılandırılmış CORS politikalarını otomatik olarak tespit eder.
Kaynaklar
- WHATWG Fetch Standard – CORS Protokolü
- MDN Web Docs – Cross-Origin Resource Sharing (CORS)
- OWASP – CORS Origin Başlığı İncelemesi
- OWASP WSTG – CORS Testi (WSTG-CLNT-07)
- MITRE CWE-942 – Güvenilmeyen Etki Alanlarıyla İzin Verici Çapraz Alan Politikası
- RFC 6454 – Web Kaynak Kavramı
- PortSwigger Web Security Academy – CORS