it-swarm-eu.dev

Perché la stessa politica di origine è così importante?

Non riesco davvero a capire cosa significhi stesso dominio Origin. So che significa che quando si ottiene una risorsa da un altro dominio (diciamo un file JS) verrà eseguita dal contesto del dominio che lo serve (come il codice di Google Analytics), il che significa che non può modificare i dati o leggere i dati sul dominio che "include la risorsa".

Quindi se dominio a.com sta incorporando un file js da google.com nella sua fonte, che js verrà eseguito dagoogle.com e non può accedere al DOM\cookies\nessun altro elemento su a.com -- ho ragione?

Ecco una definizione per la stessa politica di Origin che non riesco davvero a capire:

La politica della stessa origine è un meccanismo chiave implementato all'interno dei browser progettato per impedire ai contenuti provenienti da origini diverse di interferire tra loro. Fondamentalmente, il contenuto ricevuto da un sito Web è autorizzato a leggere e modificare altri contenuti ricevuti dallo stesso sito, ma non è consentito accedere ai contenuti ricevuti da altri siti.

Cosa significa veramente? Potete per favore darmi un esempio di vita reale?

Un'altra domanda è: qual è lo scopo dell'intestazione Origin e come esistono ancora le richieste tra domini? Perché non influenza la sicurezza o la stessa politica di Origin?

143
YSY

Perché è importante la stessa politica di origine?

Supponiamo di aver effettuato l'accesso a Facebook e di visitare un sito Web dannoso in un'altra scheda del browser. Senza la stessa politica di origine JavaScript su quel sito Web potrebbe fare qualsiasi cosa sul tuo account Facebook che ti è permesso fare. Ad esempio, leggi i messaggi privati, pubblica aggiornamenti di stato, analizza l'albero DOM HTML dopo aver inserito la password prima di inviare il modulo.

Ma ovviamente Facebook vuole usare JavaScript per migliorare l'esperienza dell'utente. Quindi è importante che il browser sia in grado di rilevare che questo JavaScript è attendibile per accedere alle risorse di Facebook. È qui che entra in gioco la stessa politica di Origin: se JavaScript è incluso da una pagina HTML su facebook.com, potrebbe accedere alle risorse di facebook.com.

Ora sostituisci Facebook con il tuo sito web di banking online e sarà ovvio che si tratta di un problema.

Qual'è l'origine?

Non riesco davvero a capire cosa significhi lo stesso dominio Origin. So che significa che quando si ottiene una risorsa da un altro dominio (diciamo un file JS) verrà eseguita dal contesto del dominio che lo serve (come il codice di Google Analytics), il che significa che non può modificare i dati o leggere i dati nel dominio che "include la risorsa".

Questo non è corretto: l'origine di un file JavaScript è definita dal dominio della pagina HTML che lo include. Quindi, se includi il codice di Google Analytics con un tag <script>, può fare qualsiasi cosa al tuo sito Web ma non ha le stesse autorizzazioni Origin sul sito Web di Google.

Come funziona la comunicazione interdominio?

La stessa politica di origine non viene applicata per tutte le richieste. Tra l'altro i tag <script> - e <img> possono recuperare risorse da qualsiasi dominio. È anche possibile pubblicare moduli e collegarsi ad altri domini. I frame e gli iframe visualizzano le informazioni di altri domini ma l'interazione con tali contenuti è limitata.

Esistono alcuni approcci per consentire chiamate XMLHttpRequest (ajax) ad altri domini in modo sicuro, ma non sono ben supportate dai browser comuni. Il modo comune per abilitare la comunicazione con un altro dominio è JSONP :

Si basa su un <script> -tag. Le informazioni, che devono essere inviate a un altro dominio, sono codificate nell'URL come parametri. Il JavaScript restituito è costituito da una chiamata di funzione con le informazioni richieste come parametro:

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

Il JavaScript generato dinamicamente da example.com potrebbe apparire come:

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

Che cos'è lo scripting tra siti?

Cross Site Scripting è una vulnerabilità che consente a un utente malintenzionato di iniettare codice JavaScript in un sito Web, in modo che provenga dall'attacco sito web dal punto di vista del browser.

Ciò può accadere se l'input dell'utente non è sufficientemente igienizzato. Ad esempio, una funzione di ricerca può visualizzare la stringa "I risultati della tua ricerca per [input utente]". Se [userinput] non viene salvato, un utente malintenzionato può cercare:

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

Il browser non ha modo di rilevare che questo codice non è stato fornito dal proprietario del sito Web, quindi lo eseguirà. Al giorno d'oggi lo scripting cross site è un grosso problema, quindi è stato fatto del lavoro per prevenire questa vulnerabilità. Il più notevole è l'approccio Content Security Policy .

122

Cosa significa veramente? Potete per favore darmi un esempio di vita reale?

Esempio di attacco 1: falsificazione richiesta tra siti (CSRF) con un modulo HTML

Nella pagina a evil.com l'attaccante ha messo:

<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>

Senza ulteriori misure di sicurezza, ciò:

  • la richiesta viene inviata. Il SOP non proibisce l'invio di questa richiesta.
  • include i cookie di autenticazione da bank.com a cui accedi

È il modello di token del sincronizzatore, da solo, anche senza SOP, impedisce che funzioni.

Pattern token del sincronizzatore

Per ogni modulo su bank.com, gli sviluppatori generano una sequenza casuale una tantum come parametro nascosto e accettano la richiesta solo se il server ottiene il parametro.

Ad esempio, gli helper HTML di Rails aggiungono automaticamente un authenticity_token parametro all'HTML, quindi la forma legittima sarebbe simile a:

<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>

come menzionato in: https://stackoverflow.com/questions/941594/understanding-the-Rails-authenticity-token/26895980#2689598

Quindi se evil.com invia una singola richiesta post, non indovinerebbe mai quel token e il server rifiuterà la transazione!

Vedi anche: modello di token del sincronizzatore su OWASP .

Esempio di attacco 2: falsificazione richiesta tra siti (CSRF) con JavaScript AJAX

Ma poi, cosa impedisce al evil.com dal fare 2 richieste con JavaScript, proprio come farebbe un browser legittimo:

  1. XHR OTTIENI per il token
  2. XHR POST contenente il token valido

così evil.com proverebbe qualcosa del genere (jQuery perché pigro):

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

Questo è dove entra in gioco SOP. Anche se $.get e $.post in realtà invia la richiesta autenticata proprio come il modulo HTML, il browser del mittente impedisce al codice JavaScript di leggere la risposta HTML, poiché la richiesta è stata inviata a un dominio separato!

La console per sviluppatori Chromium mostra un errore di questo tipo:

L'accesso a XMLHttpRequest su ' http://bank.com ' from Origin ' http://evil.com ' è stato bloccato dalla politica CORS: No 'Access-Control -Llow-Origin 'header è presente sulla risorsa richiesta.

che è stato chiesto a: https://stackoverflow.com/questions/20035101/why-does-my-javascript-code-get-a-no-access-control-allow-Origin-header-is- pr

Perché non semplicemente inviare cookie di richiesta incrociata?

E se le implementazioni avessero una regola del tipo: "consenti qualsiasi richiesta, ma invia solo cookie sull'attuale dominio XHR"? Non sarebbe più semplice?

Ciò consentirebbe comunque un altro tipo di attacco: quando l'autenticazione non si basa sui cookie, ma sull'origine (IP) della richiesta!

Ad esempio, ci si trova nella rete Intranet aziendale e da lì è possibile accedere a un server interno, che non è visibile dall'esterno e serve dati segreti.

Sono vietate tutte le richieste di origine incrociata?

Anche dimenticando CORS, no , li facciamo tutti i giorni!

Da MDN :

  • Le scritture cross-origin sono in genere consentite: collegamenti, reindirizzamenti e invii di moduli.

    [Il mio commento]: ad esempio, quando si fa clic su un collegamento, ci si aspettava spesso di accedere al sito Web e ciò richiede la richiesta autenticata di GET che restituisce la nuova pagina.

  • In genere è consentito l'incorporamento tra origini: immagini, CSS e Javascript esterni, iframe.

  • Le letture Cross-Origin in genere non sono consentite: XHR (esempio sopra), iframe read.

    Tuttavia, l'accesso in lettura è spesso trapelato dall'incorporamento. Ad esempio, puoi leggere la larghezza e l'altezza di un'immagine incorporata, le azioni di uno script incorporato o disponibilità di una risorsa incorporata (e quindi possibilmente se l'utente ha effettuato l'accesso o meno su un dato dominio)

In particolare, sarebbe possibile utilizzare un modulo in evil.com che effettua un'autenticazione POST richiesta a bank.com. Questo è il motivo per cui SOP da solo non è sufficiente: è necessario anche il token del sincronizzatore.

Vedi anche: CSRF su OSWAP .

Altri approcci di prevenzione

Non ti preoccupare. Ho trovato difficile anche avvolgermi la testa.

Si scopre che Google Analytics può, in teoria, fare tutto ciò che desidera ai tuoi utenti. (<script> tags crea un'eccezione alle restrizioni della stessa politica di origine)

Questo è uno dei maggiori motivi XSS gli attacchi sono Bad Thing ™ e uno dei motivi progettati da Mozilla Policy sulla sicurezza dei contenuti che ora è - in arrivo a essere standardizzato . (Anche l'implementazione WebKit dell'attributo HTML5 iframe sandbox può essere utile)

Poiché non sono riusciti a cavarsela con la rottura della compatibilità con le versioni precedenti, la stessa politica di Origin riguarda più la prevenzione di cose come <iframe> e XMLHttpRequest da trucchi come l'utilizzo dei cookie "Ricordami" o le finestre di dialogo di mentire per accedere ai tuoi account. (L'intestazione X-Frame-Options ti consente di bloccare ulteriormente i frame per proteggerti da cose come Clickjacking .)

L'intestazione Origin viene utilizzata da un meccanismo denominato "Condivisione delle risorse tra origini" che consente ai siti di concedere eccezioni limitate alla politica con le stesse origini per un'interazione sicura tra siti. (supportato completamente in tutti i browser correnti tranne Opera e Internet Explorer e parzialmente in IE8 + usando l'oggetto proprietario XDomainRequest che omette i cookie)

Fondamentalmente, quando provi a creare un XMLHttpRequest in un dominio diverso, il browser farà na delle due cose :

  1. Se si tratta di una richiesta GET o POST che soddisfa determinati limiti (che i produttori della norma hanno deciso di non aggiungere alcun rischio aggiuntivo per CSRF attacchi) quindi il browser passa la richiesta.

  2. Altrimenti, fa quella che viene chiamata "richiesta preflight", dove invece prima invia una richiesta OPTIONS e fa solo quello che hai richiesto se i controlli passano per la richiesta OPTIONS.

In entrambi i casi, il browser aggiunge un'intestazione Origin che indica al sito di destinazione chi sta chiamando. (È un po 'come l'intestazione Referer, ma richiesta e specificata più rigorosamente per garantire la sicurezza adeguata)

Il server sul lato ricevente (quello che si basa fortemente sulla stessa politica di Origin per la protezione) può quindi autorizzare la richiesta includendo un Access-Control-Allow-Origin header che contiene * o il valore dell'intestazione Origin della richiesta.

In caso contrario, il browser ignora semplicemente la risposta e restituisce un errore al callback Javascript. MDN fornisce dettagli dettagliati (1)(2) su cosa succede sotto il cofano in entrambi gli scenari e su quali altri header il sistema target può impostare per rilassare ulteriormente sicurezza in modo controllato. (ad es. consentire l'accesso alle intestazioni HTTP personalizzate che stai impostando)

Le richieste GET e il sottoinsieme consentito di POST richieste possono già essere utilizzate per gli attacchi CSRF tramite altri meccanismi a meno che l'app Web di destinazione non sia adeguatamente protetta, pertanto è stato deciso che non sarebbe stato possibile raddoppiare il numero di richieste HTTP coinvolte in servizi operativi come Google Font Library.

19
ssokolow

In realtà in questo caso, l'origine dello script analitico di Google è a.com

Citazione da JavaScript: The Definitive Guide :

È importante capire che l'origine dello script stesso non è rilevante per la stessa politica di origine: ciò che conta è l'origine del documento in cui è incorporato lo script.

1
nandin