Erişim-Kontrol-İzin Ver-Menşe ayarının güvenlik riskleri nelerdir?


124

Yakın zamanda, alt alan arası ajax aramaları yapabilmek için ayarlamam Access-Control-Allow-Origingerekiyordu *.
Şimdi yardım edemem ama ortamımı güvenlik risklerine soktuğumu hissediyorum.
Yanlış yapıyorsam lütfen bana yardım et.

Yanıtlar:


69

İle yanıt vererek Access-Control-Allow-Origin: *, istenen kaynak her kaynakla paylaşıma izin verir. Bu temelde, herhangi bir sitenin sitenize bir XHR isteği gönderebileceği ve sunucunun yanıtına erişebileceği anlamına gelir; bu, bu CORS yanıtını uygulamadıysanız durum böyle olmaz.

Böylece herhangi bir site, ziyaretçileri adına sitenize bir talepte bulunabilir ve yanıtını işleyebilir. Tarayıcı tarafından otomatik olarak sağlanan bir şeye (çerezler, çerez tabanlı oturumlar, vb.) Dayalı bir kimlik doğrulama veya yetkilendirme şeması gibi bir uygulamaya sahipseniz, üçüncü taraf siteler tarafından tetiklenen istekler de bunları kullanacaktır.

Bu, özellikle yalnızca seçilen kaynaklar için değil her kaynak için kaynak paylaşımına izin verirseniz, gerçekten bir güvenlik riski oluşturur. Bu bağlamda , CORS'u etkinleştirmek ne zaman güvenli? .


2
Paylaşılan kimlik doğrulama erişiminin nasıl bir güvenlik riski oluşturduğuna dair belirli bir örnek verebilirseniz, bunu yükselteceğim.
Petrus Theron

1
@Gumbo Statik içerik ne olacak? (örneğin, javascripts, css, statik html'ler vb. gibi statik cdn içeriği) Access-Control-Allow-Origin: *Bunlarda ayarlamanın herhangi bir güvenlik sorunu var mı? Nogin vs olmayacak, onlar herkese açık mı?
Umut Benzer

2
@UmutBenzer Sorun değil.
Gumbo

25
Aslında bu yanıt, mevcut CORS standardına göre tam olarak doğru değil : "'*' dizesi, kimlik bilgilerini destekleyen bir kaynak için kullanılamaz." Bu nedenle, tanımlama bilgileri, önbelleğe alınmış HTTP kimlik doğrulaması veya istemci SSL sertifikaları biçiminde geçici kimlik doğrulaması kullanma talebini zorlayamazsınız. Ancak, web sitesi örneğin kimlik doğrulama için yerel depolamayı kullanacak olsaydı, bu bir sorun olurdu.
Niklas B.

2
@NiklasB: Bu senaryoyu denedim ve Chrome, bahsettiğiniz gibi CORS standardını takip ediyor. yani " " dizesi bir kimlik bilgisi isteğiyle desteklenmez. Chrome tarafından bildirilenler: "XMLHttpRequest localhost'u yükleyemiyor : 12346 / hello . Kimlik bilgileri bayrağı doğru olduğunda 'Access-Control-Allow-Origin' başlığında bir joker karakter kullanılamaz. Origin ' localhost: 12345 ' bu nedenle erişime izin verilmez. XMLHttpRequest öğesinin kimlik bilgileri modu withCredentials özniteliği tarafından kontrol edilir. "
factotum

37

Access-Control-Allow-Origin: *bu kaynak standart kimlik bilgilerinden farklı bir şeyle korunan özel veriler içermediği sürece (tanımlama bilgileri, temel kimlik doğrulama, TLS istemci sertifikaları) herhangi bir kaynağa eklemek tamamen güvenlidir .

Örneğin: Çerezlerle korunan veriler güvenlidir

https://example.com/users-private-dataKullanıcının oturum açmış durumuna bağlı olarak özel verileri açığa çıkarabilecek bir düşünün . Bu durum bir oturum tanımlama bilgisi kullanır. Bu var güvenli eklemek için Access-Control-Allow-Origin: *istek çerezler olmadan yapılırsa, bu başlık sadece tepki erişime izin verdiği, bu kaynağa ve çerezleri özel verileri almak için gereklidir. Sonuç olarak, hiçbir özel veri sızdırılmaz.

Örneğin: Konum / ip / dahili ağ tarafından korunan veriler güvenli değildir (maalesef intranetler ve ev aletleriyle ortaktır):

https://intranet.example.com/company-private-dataÖzel şirket verilerini açığa çıkaran düşünün , ancak buna yalnızca şirketin wifi ağındaysanız erişilebilir. O var güvenli değil eklemek için Access-Control-Allow-Origin: *standart kimlik dışında bir şey kullanılarak korunuyor gibi bu kaynağa. Aksi takdirde, kötü bir komut dosyası sizi intranete bir tünel olarak kullanabilir.

Başparmak kuralı

Bir kullanıcının kaynağa gizli bir pencerede erişmesi durumunda ne göreceğini hayal edin. Herkesin bu içeriği görmesinden memnunsanız (tarayıcının aldığı kaynak kodu dahil), eklemek güvenlidir Access-Control-Allow-Origin: *.


"yalnızca çerez içermeyen isteklere izin verdiği için" "yalnızca çerezlerle isteklere izin verdiği için" olmalıdır?
DJCordhose

3
@DJCordhose hayır. Access-Control-Allow-Origin: *yalnızca çerez içermeyen isteklere izin verir . Cevabı biraz açıklığa kavuşturmak için düzenledim.
JaffaTheCake

"*" İle bu başlığın olmadığı durum arasındaki fark nedir? Aynı mı?
Nigrimmist

"Aksi takdirde, kötü bir komut dosyası sizi intranete bir tünel olarak kullanabilir" daha fazla açıklanabilseydi çok isterim.
Sam Rueby

@Nigrimmist Sonra ön kontrol isteği başarısız olacak ve kaynak erişimi engellenecek
iamareebjamal

9

AFAIK, Access-Control-Allow-Origin yalnızca sunucudan tarayıcıya gönderilen bir http başlığıdır. Bunu belirli bir adresle sınırlamak (veya devre dışı bırakmak) sitenizi örneğin robotlar için daha güvenli hale getirmez. Robotlar isterse, başlığı yok sayabilirler. Dışarıdaki normal tarayıcılar (Explorer, Chrome, vb.) Varsayılan olarak başlığı kullanır. Ancak Postman gibi bir uygulama bunu görmezden geliyor.

Sunucu tarafı, yanıtı döndürdüğünde isteğin 'kaynağının' ne olduğunu kontrol etmez. Yalnızca http başlığını ekler. Erişim kontrolü başlığını okumaya ve buna göre hareket etmeye karar veren isteği gönderen tarayıcıdır (istemci tarafı). XHR durumunda, önce başlıkları istemek için özel bir 'SEÇENEKLER' isteği kullanabileceğini unutmayın.

Bu nedenle, yaratıcı komut dosyası yazma yeteneklerine sahip herkes, içinde ayarlanmış olan tüm başlığı kolayca göz ardı edebilir.

Ayrıca bkz . Erişim-Kontrolü-İzin Ver-Menşe ayarının olası güvenlik sorunları .


Şimdi soruyu gerçekten cevaplamak için

Yardım edemem ama ortamımı güvenlik risklerine soktuğumu hissediyorum.

Herhangi biri size saldırmak isterse, Access-Control-Allow-Origin'i kolayca atlayabilir. Ancak '*' özelliğini etkinleştirerek, saldırgana, bu HTTP başlığını kullanan normal web tarayıcıları kullanmak gibi, oynaması için birkaç 'saldırı vektörü' vermiş olursunuz.


6
Buna dikkatsiz bir son kullanıcının bakış açısından bakın. Birisi, verileri gerçek site ile kötü amaçlı bir site arasında geçirmek için JavaScript'i enjekte eden kötü amaçlı bir web sayfası oluşturabilir (diyelim ki şifrenizi çalmak istiyorlar). Son kullanıcının web tarayıcısı normal olarak bu siteler arası iletişimi engelleyecektir, ancak Erişim Kontrolü-İzin Ver-Kaynak ayarlanırsa, o zaman buna izin verilecek ve son kullanıcı daha akıllı olmayacaktır.
Brain2000

3
Evet, Access-Control-Allow-Origin *şifreleri çalmak için komut dosyaları barındıran kötü amaçlı bir web sitesinde ayar yapmak kesinlikle önerilmez :-)
commonpike

6
@commonpike Birisinin üstbilgiyi tamamen yok sayacak bir betik yazabileceği konusunda haklısınız. Veriler erişilebilir durumdaysa, CORS başlıkları ile veya bunlar olmadan erişilebilir. Yine de düşünmediğiniz başka bir saldırı vektörü var. Bankamın web sitesine giriş yaptığımı varsayalım. Başka bir sayfaya gidip bankama geri dönersem, hala bir çerez nedeniyle oturum açmış durumdayım. İnternetteki diğer kullanıcılar benim bankamda benimle aynı URL'lere girebilirler, ancak çerez olmadan hesabıma erişemezler. Çapraz kaynaklı isteklere izin verilirse, kötü amaçlı bir web sitesi etkili bir şekilde kimliğe bürünebilir ...
Brad

5
@commonpike ... kullanıcı. Başka bir deyişle, sitemi ziyaret edebilirsiniz (şüpheli hiçbir şey içermeyen normal bir site bile olabilir ... belki de sadece ele geçirilmiş gerçek bir yasal sitedir!), Ancak bazılarını bankanıza aktarmak için HTTP istekleri yapan bazı JavaScript'ler hesabıma para. Banka, sayfalarından gelen talepler ile diğer sayfalardan gelen talepler arasındaki farkı bilmiyor. Her ikisinde de isteğin başarılı olmasını sağlayan o çerez bulunur.
Brad

3
@commonpike Size daha yaygın bir örnek vereyim ... her zaman olan bir örnek. Linksys WRT54g veya başka bir şey gibi ortak bir ev yönlendiriciniz olduğunu varsayalım. Yönlendiricinin çapraz kaynak isteklerine izin verdiğini varsayalım. Web sayfamdaki bir komut dosyası, yaygın yönlendirici IP adreslerine (gibi 192.168.1.1) HTTP isteklerinde bulunabilir ve yönlendiricinizi saldırılara izin verecek şekilde yeniden yapılandırabilir. Yönlendiricinizi doğrudan bir DDoS düğümü olarak bile kullanabilir. (Çoğu yönlendiricinin pinglere veya basit HTTP sunucu kontrollerine izin veren test sayfaları vardır. Bunlar toplu halde kötüye kullanılabilir.)
Brad

6

Bir joker karakter gerçekten sorunlu olduğunda, yorum olarak gönderilen 2 örnek:

Bankamın web sitesine giriş yaptığımı varsayalım. Başka bir sayfaya gidip bankama geri dönersem, hala bir çerez nedeniyle oturum açmış durumdayım. İnternetteki diğer kullanıcılar benim bankamda benimle aynı URL'lere girebilirler, ancak çerez olmadan hesabıma erişemezler. Kaynaklar arası isteklere izin verilirse, kötü niyetli bir web sitesi kullanıcıyı etkin bir şekilde taklit edebilir.

- Brad

Linksys WRT54g veya başka bir şey gibi ortak bir ev yönlendiriciniz olduğunu varsayalım. Yönlendiricinin çapraz kaynak isteklerine izin verdiğini varsayalım. Web sayfamdaki bir komut dosyası, yaygın yönlendirici IP adreslerine (192.168.1.1 gibi) HTTP isteklerinde bulunabilir ve yönlendiricinizi saldırılara izin verecek şekilde yeniden yapılandırabilir. Yönlendiricinizi doğrudan bir DDoS düğümü olarak bile kullanabilir. (Çoğu yönlendiricinin pinglere veya basit HTTP sunucusu kontrollerine izin veren test sayfaları vardır. Bunlar toplu halde kötüye kullanılabilir.)

- Brad

Problemi gerçek hayattan bir örnekle açıkladıkları için bu yorumların cevap olması gerektiğini düşünüyorum.


8
Bunun işe yaramayacağı dışında. "'*' Dizesi, kimlik bilgilerini destekleyen bir kaynak için kullanılamaz." w3.org/TR/cors/#resource-requests
bayo

@bayotop Tarayıcı, kimlik doğrulama gerektiren sayfalar ile başlıklarında başka veriler bulunan sayfaları nasıl ayırt eder?
wedstrom

Sağlanan bağlantıyı okuduktan sonra, bu amaçla kullanılan "kimlik bilgilerini destekler bayrağı" vardır. Görünüşe göre manuel olarak ayarlanmış, bu yüzden muhtemelen birisi CORS'u doğru bir şekilde nasıl kuracağını bilmiyorsa bu bayrağı da yanlış alabilir, bu yüzden yukarıdaki güvenlik açıklarının mümkün olduğuna inanıyorum.
wedstrom

2
@wedstrom Bayrak, isteği yapan kişi tarafından belirlenir. Her neyse, yukarıdaki senaryolar CSRF saldırılarının örnekleridir. '*' Kökenine izin vermek sizi zaten olduğunuzdan daha savunmasız hale getirmez (belki biraz nadir durumlarda). Çoğu durumda, formlar kullanarak siteler arası hatalı istekte bulunabilirsiniz, böylece CORS önemli değildir. Bir AJAX isteği yapmanız gereken durumlarda, uçuş öncesi istekler yolunuza çıkacaktır (bu, tarayıcının ACAO: '*' ve Access-Control-Allow-Credentials: 'true' olduğunda geldiği noktadır).
bayo

0

Sunucunun, aşağıdaki başlıkları ayarlayarak CORS'u tamamen devre dışı bırakmaya çalıştığı senaryoda.

  • Access-Control-Allow-Origin: * (tarayıcıya, sunucunun herhangi bir ORIGIN'den siteler arası istekleri kabul ettiğini söyler)

  • Access-Control-Allow-Credentials: true (tarayıcıya siteler arası isteklerin çerez gönderebileceğini söyler)

Tarayıcılarda aşağıdaki hatayla sonuçlanacak bir hata güvenliği uygulanmıştır

"Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’"

Bu yüzden çoğu senaryoda 'Erişim-Kontrol-Menşe İzin Ver' ayarını yapmak *sorun olmayacaktır. Bununla birlikte, saldırılara karşı güvenlik sağlamak için, sunucu izin verilen kaynakların bir listesini tutabilir ve sunucu bir çapraz kaynak isteği aldığında, izin verilen kaynaklar listesine göre ORIGIN başlığını doğrulayabilir ve ardından aynı şeyi Access-Control-Allow-Origin'de tekrarlayabilir. başlığı.

ORIGIN başlığı, tarayıcıda çalışan javascript tarafından değiştirilemediğinden, kötü amaçlı site bunu yanıltamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.