Quali sono i rischi per la sicurezza derivanti dall'impostazione di Access-Control-Allow-Origin?


124

Recentemente ho dovuto impostare Access-Control-Allow-Originper *poter effettuare chiamate ajax tra sottodomini.
Ora non posso fare a meno di sentire che sto mettendo il mio ambiente a rischio per la sicurezza.
Per favore aiutami se sto sbagliando.

Risposte:


69

Rispondendo con Access-Control-Allow-Origin: *, la risorsa richiesta consente la condivisione con ogni origine. Ciò significa fondamentalmente che qualsiasi sito può inviare una richiesta XHR al tuo sito e accedere alla risposta del server, il che non sarebbe il caso se non avessi implementato questa risposta CORS.

Quindi qualsiasi sito può fare una richiesta al tuo sito per conto dei suoi visitatori ed elaborare la sua risposta. Se hai implementato qualcosa come uno schema di autenticazione o autorizzazione basato su qualcosa che viene fornito automaticamente dal browser (cookie, sessioni basate su cookie, ecc.), Anche le richieste attivate dai siti di terze parti li utilizzeranno.

Ciò rappresenta effettivamente un rischio per la sicurezza, in particolare se si consente la condivisione delle risorse non solo per le risorse selezionate ma per ogni risorsa. In questo contesto dovresti dare un'occhiata a Quando è sicuro abilitare CORS? .


2
Se puoi fornire un esempio specifico di come l'accesso di autenticazione condiviso rappresenta un rischio per la sicurezza, lo voterò a favore.
Petrus Theron

1
@ Gumbo E i contenuti statici? (es. contenuto cdn statico, come javascript, css, html statico ecc.) Ci sono problemi di sicurezza nell'impostarli Access-Control-Allow-Origin: *? Non ci sarà nessun nogin ecc, sono pubblici per tutti?
Umut Benzer,

2
@UmutBenzer Va bene.
Gumbo

25
In realtà questa risposta non è del tutto corretta secondo lo standard CORS corrente : "La stringa '*' non può essere utilizzata per una risorsa che supporta le credenziali." Quindi non è possibile forzare una richiesta per utilizzare l'autenticazione temporanea sotto forma di cookie, autenticazione HTTP memorizzata nella cache o certificati SSL client. Tuttavia, se il sito Web utilizzasse, ad esempio, l'archiviazione locale per l'autenticazione, sarebbe un problema.
Niklas B.

2
@ NiklasB: ho provato questo scenario e Chrome segue lo standard CORS come hai menzionato. cioè la stringa " " non è supportata con una richiesta di credenziali. Ecco quanto riportato da Chrome: "XMLHttpRequest non può caricare localhost: 12346 / hello . Un carattere jolly" "non può essere utilizzato nell'intestazione" Access-Control-Allow-Origin "quando il flag delle credenziali è true. Origin" localhost: 12345 " non è pertanto consentito l'accesso. La modalità delle credenziali di un XMLHttpRequest è controllata dall'attributo withCredentials. "
factotum

37

Access-Control-Allow-Origin: *è totalmente sicuro da aggiungere a qualsiasi risorsa, a meno che tale risorsa non contenga dati privati ​​protetti da qualcosa di diverso dalle credenziali standard (cookie, autenticazione di base, certificati client TLS).

Ad esempio: i dati protetti dai cookie sono al sicuro

Immagina https://example.com/users-private-data, che potrebbe esporre dati privati ​​a seconda dello stato di accesso dell'utente. Questo stato utilizza un cookie di sessione. È sicuro aggiungere Access-Control-Allow-Origin: *a questa risorsa, poiché questa intestazione consente l'accesso alla risposta solo se la richiesta viene effettuata senza cookie e i cookie sono necessari per ottenere i dati privati. Di conseguenza, nessun dato privato viene trapelato.

Ad esempio: i dati protetti da posizione / ip / rete interna non sono sicuri (purtroppo comune con intranet ed elettrodomestici):

Immagina https://intranet.example.com/company-private-data, che espone i dati di un'azienda privata, ma è possibile accedervi solo se sei sulla rete Wi-Fi dell'azienda. Non è sicuro aggiungere Access-Control-Allow-Origin: *a questa risorsa, poiché è protetta utilizzando qualcosa di diverso dalle credenziali standard. Altrimenti, uno script errato potrebbe usarti come tunnel per la intranet.

Regola del pollice

Immagina cosa vedrebbe un utente se accedesse alla risorsa in una finestra di navigazione in incognito. Se sei soddisfatto che tutti vedano questo contenuto (incluso il codice sorgente ricevuto dal browser), puoi aggiungerlo senza problemi Access-Control-Allow-Origin: *.


"in quanto consente solo richieste senza cookie" dovrebbe essere "in quanto consente solo richieste con cookie"?
DJCordhose

3
@DJCordhose no. Access-Control-Allow-Origin: *consente solo richieste senza cookie. Ho modificato la risposta per chiarire un po '.
JaffaTheCake

Qual è la differenza tra "*" e case senza questa intestazione. È lo stesso?
Nigrimmist

Mi piacerebbe se "Altrimenti, un cattivo script potrebbe usarti come un tunnel per la intranet" potesse essere ulteriormente spiegato.
Sam Rueby

@Nigrimmist Quindi la richiesta di preflight fallirà e l'accesso alle risorse verrà bloccato
iamareebjamal

9

Per quanto ne so, Access-Control-Allow-Origin è solo un'intestazione http inviata dal server al browser. Limitarlo a un indirizzo specifico (o disabilitarlo) non rende il tuo sito più sicuro, ad esempio, per i robot. Se i robot lo desiderano, possono semplicemente ignorare l'intestazione. I normali browser disponibili (Explorer, Chrome, ecc.) Per impostazione predefinita rispettano l'intestazione. Ma un'applicazione come Postman lo ignora semplicemente.

L'estremità del server non controlla effettivamente qual è l '"origine" della richiesta quando restituisce la risposta. Aggiunge solo l'intestazione http. È il browser (l'estremità client) che ha inviato la richiesta che decide di leggere l'intestazione del controllo di accesso e di agire su di essa. Si noti che nel caso di XHR può utilizzare una richiesta speciale "OPZIONI" per richiedere prima le intestazioni.

Quindi, chiunque abbia capacità di scripting creativo può facilmente ignorare l'intera intestazione, qualunque cosa sia impostata in essa.

Vedi anche Possibili problemi di sicurezza dell'impostazione di Access-Control-Allow-Origin .


Ora per rispondere effettivamente alla domanda

Non posso fare a meno di sentire che sto mettendo il mio ambiente a rischio per la sicurezza.

Se qualcuno vuole attaccarti, può facilmente bypassare Access-Control-Allow-Origin. Ma abilitando "*" si fornisce all'attaccante qualche altro "vettore di attacco" con cui giocare, ad esempio, utilizzando normali browser web che rispettano l'intestazione HTTP.


6
Guardalo dal punto di vista di un utente finale incauto. Qualcuno può impostare una pagina web dannosa che inietta JavaScript per passare dati tra il sito reale e un sito dannoso (diciamo che vogliono rubare la tua password). Il browser web dell'utente finale normalmente bloccherà questa comunicazione tra siti, ma se è impostato Access-Control-Allow-Origin, allora sarà consentito e l'utente finale non sarà più saggio.
Brain2000

3
Sì, l'impostazione Access-Control-Allow-Origin *su un sito Web dannoso che ospita script per il furto di password è fortemente sconsigliata :-)
commonpike

6
@commonpike Hai ragione in quanto qualcuno potrebbe creare uno script per ignorare completamente l'intestazione. Se i dati sono accessibili, è accessibile con o senza intestazioni CORS. C'è un altro vettore di attacco che non stai prendendo in considerazione però. Supponiamo che acceda al sito web della mia banca. Se vado su un'altra pagina e poi torno alla mia banca, sono ancora connesso a causa di un cookie. Altri utenti su Internet possono raggiungere gli stessi URL della mia banca come me, ma non saranno in grado di accedere al mio account senza il cookie. Se le richieste cross-origin sono consentite, un sito Web dannoso può effettivamente impersonare ...
Brad

5
@commonpike ... l'utente. In altre parole, potresti semplicemente visitare il mio sito (che potrebbe anche essere un sito normale, senza nulla di sospetto ... forse è un vero sito legittimo che è stato appena dirottato!) Ma alcuni JavaScript che fanno richieste HTTP alla tua banca per trasferirne alcuni fondi sul mio conto. La banca non conosce la differenza tra le richieste dalle sue pagine o le richieste da altre pagine. Entrambi hanno quel cookie che consente alla richiesta di avere successo.
Brad

3
@commonpike Lascia che ti faccia un esempio più comune ... uno che accade sempre. Supponi di avere un router domestico comune, come un Linksys WRT54g o qualcosa del genere. Supponiamo che il router consenta richieste cross-origin. Uno script sulla mia pagina web potrebbe effettuare richieste HTTP agli indirizzi IP del router comune (come 192.168.1.1) e riconfigurare il router per consentire gli attacchi. Può persino utilizzare il router direttamente come nodo DDoS. (La maggior parte dei router ha pagine di test che consentono ping o semplici controlli del server HTTP. Questi possono essere abusati in massa.)
Brad

6

Ecco 2 esempi pubblicati come commenti, quando un carattere jolly è davvero problematico:

Supponiamo che acceda al sito web della mia banca. Se vado su un'altra pagina e poi torno alla mia banca, sono ancora connesso a causa di un cookie. Altri utenti su Internet possono raggiungere gli stessi URL della mia banca come me, ma non saranno in grado di accedere al mio account senza il cookie. Se le richieste cross-origin sono consentite, un sito Web dannoso può effettivamente impersonare l'utente.

- Brad

Supponi di avere un router domestico comune, come un Linksys WRT54g o qualcosa del genere. Supponiamo che il router consenta richieste cross-origin. Uno script sulla mia pagina web potrebbe effettuare richieste HTTP agli indirizzi IP del router comune (come 192.168.1.1) e riconfigurare il router per consentire gli attacchi. Può persino utilizzare il router direttamente come nodo DDoS. (La maggior parte dei router ha pagine di test che consentono ping o semplici controlli del server HTTP. Questi possono essere utilizzati in modo improprio in massa.)

- Brad

Penso che questi commenti avrebbero dovuto essere risposte, perché spiegano il problema con un esempio di vita reale.


8
Tranne che questo non funzionerà. "La stringa '*' non può essere utilizzata per una risorsa che supporta le credenziali." w3.org/TR/cors/#resource-requests
bayo

@bayotop Come fa il browser a distinguere tra le pagine che richiedono l'autenticazione e quelle con altri dati nelle intestazioni?
mercoledì

Dopo aver letto il collegamento fornito, viene visualizzato il "flag delle credenziali di supporto" utilizzato per questo scopo. Sembra essere impostato manualmente, quindi presumibilmente se qualcuno non sapesse come impostare CORS correttamente potrebbe anche sbagliare questo flag, quindi credo che le vulnerabilità di cui sopra siano possibili.
mercoledì

2
@wedstrom Il flag è impostato da chi effettua la richiesta. Ad ogni modo, gli scenari di cui sopra sono esempi di attacchi CSRF. Consentire l'origine "*" non ti renderà più vulnerabile di quanto lo sei già (forse un po 'in rari casi). Nella maggior parte dei casi è possibile effettuare la richiesta tra siti dannosi utilizzando i moduli in modo che CORS non abbia importanza. Nei casi in cui è necessario eseguire una richiesta AJAX, le richieste pre-volo si intrometteranno (questo è il punto in cui entra in gioco il browser quando ACAO: '*' e Access-Control-Allow-Credentials: 'true').
bayo

0

Nello scenario in cui il server tenta di disabilitare completamente CORS impostando le intestazioni di seguito.

  • Access-Control-Allow-Origin: * (indica al browser che il server accetta richieste cross-site da qualsiasi ORIGIN)

  • Access-Control-Allow-Credentials: true (indica al browser che le richieste cross-site possono inviare cookie)

C'è un fail safe implementato nei browser che comporterà il seguente errore

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

Quindi, nella maggior parte degli scenari, l'impostazione di "Controllo accesso-Consenti-Origine" *non sarà un problema. Tuttavia, per proteggersi dagli attacchi, il server può mantenere un elenco di origini consentite e ogni volta che il server riceve una richiesta di origine incrociata, può convalidare l'intestazione ORIGIN rispetto all'elenco delle origini consentite e quindi ripetere lo stesso in Access-Control-Allow-Origin intestazione.

Poiché l'intestazione ORIGIN non può essere modificata da javascript in esecuzione sul browser, il sito dannoso non sarà in grado di falsificarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.