it-swarm-tr.com

Aynı Menşe politikası neden bu kadar önemli?

aynı Origin domain ne anlama geldiğini tam olarak anlayamıyorum. Başka bir alandan (JS dosyası diyelim) bir kaynak alırken, ona hizmet eden alanın bağlamından (Google Analytics kodu gibi) çalışacağı anlamına gelir, yani verileri değiştiremez veya verileri okuyamaz "kaynağı içeren" alanda.

Eğer etki alanı a.com, google.com Kaynağından bir js dosyasını gömüyorsa, js fromgoogle.com DOM\cookies\a.com Üzerindeki başka bir öğe - haklı mıyım?

İşte aynı Menşe politikası için gerçekten anlayamadığım bir tanım:

Aynı Köken politikası, farklı kökenlerden gelen içeriğin birbirine müdahale etmesini önlemek için tasarlanmış tarayıcılarda uygulanan önemli bir mekanizmadır. Temel olarak, bir web sitesinden alınan içeriğin aynı siteden alınan diğer içeriği okumasına ve değiştirmesine izin verilir, ancak diğer sitelerden alınan içeriğe erişmesine izin verilmez.

Bu gerçekten ne anlama geliyor? Bana gerçek hayattan bir örnek verebilir misiniz?

Başka bir soru şudur: Origin başlığının amacı nedir ve alanlar arası talepler hala nasıl mevcuttur? Güvenliği veya aynı Menşe politikasını neden etkilemiyor?

143
YSY

Aynı Menşe politikası neden önemlidir?

Facebook'a giriş yaptığınızı ve başka bir tarayıcı sekmesinde kötü amaçlı bir web sitesini ziyaret ettiğinizi varsayalım. Aynı Origin politikası olmadan bu web sitesindeki JavaScript, Facebook hesabınıza izin verdiğiniz her şeyi yapabilir. Örneğin, özel iletileri okuyun, durum güncellemelerini gönderin, formu göndermeden önce şifrenizi girdikten sonra HTML DOM ağacını analiz edin.

Ancak elbette Facebook, kullanıcı deneyimini geliştirmek için JavaScript kullanmak istiyor. Bu nedenle, tarayıcının bu JavaScript'in Facebook kaynaklarına erişmek için güvenilir olduğunu algılaması önemlidir. İşte aynı Köken politikası devreye girer: JavaScript facebook.com'daki bir HTML sayfasından eklenirse, facebook.com kaynaklarına erişebilir.

Şimdi Facebook'u çevrimiçi bankacılık web sitenizle değiştirin ve bunun bir sorun olduğu açıktır.

Kökeni nedir?

Aynı Origin alan adının ne anlama geldiğini tam olarak anlayamıyorum. Başka bir alandan (JS dosyası diyelim) bir kaynak alırken, hizmet veren alanın bağlamından (google analytics kodu gibi) çalışacağı anlamına gelir, yani verileri değiştiremez veya verileri okuyamaz "kaynağı içeren" alanda.

Bu doğru değil: Bir JavaScript dosyasının kaynağı, onu içeren HTML sayfasının etki alanı tarafından tanımlanır. Dolayısıyla, bir <script> etiketli Google Analytics kodunu eklerseniz, web sitenize herhangi bir şey yapabilir, ancak Google web sitesinde aynı Köken izinleri yoktur.

Web alanları arası iletişim nasıl çalışır?

Tüm kökenler için aynı Menşe politikası uygulanmamaktadır. Diğerlerinin yanı sıra <script> - ve <img> etiketleri herhangi bir alandan kaynak getirebilir. Form göndermek ve diğer alanlara bağlantı vermek de mümkündür. Çerçeveler ve iframe'ler yolu diğer alanlardan bilgileri görüntüler, ancak bu içerikle etkileşim sınırlıdır.

Diğer etki alanlarına XMLHttpRequest (ajax) çağrılarına güvenli bir şekilde izin vermek için bazı yaklaşımlar vardır, ancak bunlar yaygın tarayıcılar tarafından iyi desteklenmez. Başka bir alanla iletişim kurmanın yaygın yolu JSONP :

Bir <script> etiketine dayanır. Başka bir alana gönderilecek bilgiler URL'de parametre olarak kodlanır. Döndürülen JavaScript, istenen bilgileri parametre olarak içeren bir işlev çağrısından oluşur:

<script type="text/javascript" src="http://example.com/
     ?some-variable=some-data&jsonp=parseResponse">
</script>

Example.com'dan dinamik olarak oluşturulan JavaScript şöyle görünebilir:

parseResponse({"variable": "value", "variable2": "value2"})

Siteler Arası Komut Dosyası Nedir?

Siteler Arası Komut Dosyası , bir saldırganın bir web sitesine JavaScript kodu enjekte etmesine olanak tanıyan bir güvenlik açığıdır . web sitesi tarayıcı açısından.

Kullanıcı girişi yeterince sterilize edilmemişse bu gerçekleşebilir. Örneğin, bir arama işlevi "[userinput] için arama sonuçlarınız" dizesini görüntüleyebilir. [Userinput] öğesi kaçmazsa, bir saldırgan aşağıdakileri arayabilir:

<script>alert(document.cookie)</script>

Tarayıcının bu kodun web sitesi sahibi tarafından sağlanmadığını tespit etmesinin bir yolu yoktur, bu yüzden onu çalıştırır. Günümüzde siteler arası komut dosyası oluşturma önemli bir sorundur, bu nedenle bu güvenlik açığını önlemek için çalışmalar yapılmaktadır. En dikkat çekici olanı İçerik Güvenliği Politikası yaklaşımıdır.

122

Bu gerçekten ne anlama geliyor? Bana gerçek hayattan bir örnek verebilir misiniz?

Saldırı örneği 1: HTML formlu Siteler Arası İstek Sahteciliği (CSRF)

Saldırgan, evil.com Sayfasında:

<form method="post" action="http://bank.com/trasfer">
    <input type="hidden" name="to" value="ciro">
    <input type="hidden" name="ammount" value="100000000">
    <input type="submit" value="CLICK TO CLAIM YOUR PRIZE!!!">
</form>

Daha fazla güvenlik önlemi olmadan, bu:

  • istek gönderilir. SOP, bu isteğin gönderilmesini yasaklamaz.
  • size giriş yapan bank.com kimlik doğrulama çerezlerini içerir

SOP olmadan bile tek başına senkronize edici belirteç deseni bunun çalışmasını engeller.

Eşleyici belirteç modeli

bank.com Üzerindeki her form için, geliştiriciler gizli parametre olarak bir kerelik rastgele bir sıra oluşturur ve yalnızca sunucu parametreyi alırsa isteği kabul eder.

Örneğin, Rails HTML yardımcıları HTML'ye otomatik olarak bir authenticity_token Parametresi ekler, böylece yasal form şöyle görünür:

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="authenticity_token"
            value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p>
  <p><input type="hidden" name="to"      value="ciro"></p>
  <p><input type="hidden" name="ammount" value="100000000"></p>
  <p><button type="submit">Send 100000000$ to Ciro.</button></p>
</form>

belirtildiği gibi: https://stackoverflow.com/questions/941594/understanding-the-Rails-authenticity-token/26895980#2689598

Eğer evil.com Tek bir gönderi isteği yaparsa, asla bu jetonu tahmin etmez ve sunucu işlemi reddeder!

Ayrıca bkz .: OWASP'deki eşleyici belirteç modeli .

Saldırı örneği 2: JavaScript AJAX ile Siteler Arası İstek Sahteciliği (CSRF)

Ancak, evil.com Uygulamasının JavaScript ile 2 istekte bulunmasını engelleyen, tıpkı yasal bir tarayıcının yaptığı gibi:

  1. Jeton için XHR GET
  2. XHR POST iyi jetonu içeriyor

böylece evil.com böyle bir şey dener (jQuery çünkü tembel):

$.get('http://bank.com/transfer')
// Parse HTML reply and extract token.
$.post('http://bank.com/transfer', {
  to: 'ciro',
  ammount: '100000000',
  authenticity_token: extracted_token
})

Bu SOP oyununun devreye girdiği yerdir. $.get Ve $.post Kimliği doğrulanmış isteği tıpkı HTML formu gibi göndermiş olsa da, istek ayrı bir etki alanına gönderildiğinden gönderenin tarayıcısı JavaScript kodunun HTML yanıtını okumasını engeller. !

Chromium geliştirici konsolu, türünde bir hata gösteriyor:

' http://bank.com ' kaynağından ' http://evil.com ' adresinden XMLHttpRequest'e erişim CORS politikası tarafından engellendi: Hayır 'Erişim Kontrolü -Allow-Origin 'başlığı istenen kaynakta mevcut.

ve şu soru soruldu: https://stackoverflow.com/questions/20035101/why-does-my-javascript-code-get-a-no-access-control-allow-Origin-header-is- pR

Neden bunun yerine çapraz istek çerezleri göndermiyoruz?

Uygulamalar aşağıdaki gibi bir kurala sahip olsaydı: "herhangi bir isteğe izin ver, ancak yalnızca geçerli XHR alan adında çerez gönder"? Bu daha basit olmaz mıydı?

Ancak bu yine de başka bir saldırı türüne izin verir: kimlik doğrulama çerezlere değil, isteğin kaynağına (IP) bağlı olduğunda!

Örneğin, şirketinizin intranetindesiniz ve oradan dışarıdan görünmeyen ve gizli veriler sunan bir dahili sunucuya erişebilirsiniz.

Tüm çapraz menşe istekleri yasaklanmış mı?

CORS'ları bile unutmadan, hayır , her gün yapıyoruz!

MDN :

  • Cross-Origin yazımlarına genellikle izin verilir: bağlantılar, yönlendirmeler ve form gönderme.

    [Yorumum]: ör. Bir bağlantıyı tıkladığınızda, genellikle web sitesinde oturum açmayı beklersiniz ve bu, yeni sayfayı döndüren kimliği doğrulanmış bir GET isteği yapılmasını gerektirir.

  • Orijinallerin katıştırılmasına genellikle izin verilir: görüntüler, harici CSS ve Javascript, iframe'ler.

  • Çapraz Kaynak okumalara genellikle izin verilmez: XHR (yukarıdaki örnek), iframe okuma.

    Ancak, okuma erişimi genellikle gömme yoluyla sızdırılır. Örneğin, katıştırılmış bir görüntünün genişliğini ve yüksekliğini, katıştırılmış bir komut dosyasının eylemlerini veya katıştırılmış bir kaynağın kullanılabilirliği (ve muhtemelen kullanıcı belirli bir oturum açmışsa veya açmamışsa alan adı)

Özellikle, evil.com 'De bank.com İçin kimliği doğrulanmış POST isteği yapan bir form kullanmak mümkün olacaktır. Bu yüzden SOP tek başına yeterli değildir: senkronize edici belirteci de gereklidir.

Ayrıca bkz .: OSWAP'ta CSRF .

Diğer önleme yaklaşımları

Endişelenme. Ben de kafamı sarmak zor buldum.

Google Analytics'in teorik olarak kullanıcılarınıza istedikleri her şeyi yapabileceği ortaya çıkıyor. (<script> tags bir istisna oluştur aynı Kökenli politika kısıtlamalarına)

Bu en büyük nedenlerden biri XSS saldırıları bir Bad Thing ™ ve Mozilla'nın tasarladığı bir sebep İçerik Güvenliği Politikası şu anda - yolda olmak standart . (WebKit'in HTML5 iframe korumalı alanı özelliğini uygulaması da yararlı olabilir)

Geriye dönük uyumluluğu bozmaktan kurtulamadıklarından, aynı Köken politikası daha çok <iframe> ve XMLHttpRequest "Beni Hatırla" çerezlerinizi kullanmak veya hesaplarınıza erişmek için yalancı giriş iletişim kutularını kullanmak gibi numaralardan. ( X-Frame-Options başlığı Clickjacking gibi şeylere karşı korumak için çerçeveleri daha da kilitlemenizi sağlar.)

Origin başlığı, sitelerin güvenli siteler arası etkileşim için aynı Köken politikasına sınırlı istisnalar vermesine izin veren "Kaynaklar Arası Kaynak Paylaşımı" adlı bir mekanizma tarafından kullanılır. (tam olarak desteklenir mevcut tüm tarayıcılar hariç Opera ve Internet Explorer ve kısmen IE8 + 'da çerezleri ihmal eden tescilli XDomainRequest nesnesini kullanarak)

Temel olarak, farklı bir alana XMLHttpRequest yapmaya çalıştığınızda, tarayıcı iki şeyden biri yapar:

  1. Belirli limitleri karşılayan bir GET veya POST isteği ise (standardın yapımcıları için fazladan bir risk eklemeye karar vermediyse CSRF saldırılar) tarayıcı isteği yalnızca iletir.

  2. Aksi takdirde, ilk olarak bir OPTIONS isteği gönderdiği "ön ödemeli istek" olarak adlandırılan şeyi yapar ve yalnızca OPTIONS isteği için denetimlerin geçmesi durumunda istediğinizi yapar.

Her iki durumda da, tarayıcı, hedef siteye kimin aradığını söyleyen bir Origin üstbilgisi ekler. (Bir çeşit Referer başlığı gibi, ancak gerekli güvenliği sağlamak için gerekli ve daha kesin bir şekilde belirtilmiştir)

Alıcı uçtaki sunucu (büyük ölçüde koruma için aynı Köken politikasına dayanan sunucu) daha sonra Access-Control-Allow-Origin üstbilgisini içeren _ * veya isteğin Origin başlığının değeri.

Değilse, tarayıcı yalnızca yanıtı atar ve Javascript geri aramasına bir hata döndürür. MDN, her iki senaryoda da kaputun altında neler olduğu ve hedef sistemin daha fazla rahatlamak için ayarlayabileceği diğer ayrıntılar üzerinde (1)(2) kontrollü bir şekilde güvenlik. (örn. Ayarladığınız özel HTTP başlıklarına erişime izin verme)

GET istekleri ve POST isteklerinin izin verilen alt kümesi, hedef web uygulaması düzgün şekilde korunmadıkça CSRF saldırıları için zaten kullanılabilir, bu nedenle hedefin iki katına çıkarılmasının bir faydası olmadığına karar verildi Google Yazı Tipi Kütüphanesi gibi işletim hizmetlerinde yer alan HTTP isteklerinin sayısı.

19
ssokolow

Aslında bu durumda, Google analitik betiğinin kaynağı a.com

Alıntı: JavaScript: Kesin Kılavuz :

Komut dosyasının kendisinin aynı Köken politikasına uygun olmadığını anlamak önemlidir: önemli olan komut dosyasının gömülü olduğu belgenin Kökeni'dir.

1
nandin