In che modo la vulnerabilità originale di Facebook di Access-Control-Allow-Origin: null consente l'accesso tra origini?

5

Recentemente, una vulnerabilità nell'app di messaggistica di Facebook che consentiva agli attacchi di accedere a messaggi privati degli utenti tramite AJAX di origine incrociata è stata corretta e divulgata.

Simple Bug allows Hackers to Read all your Private Facebook Messenger Chats

The root of this issue was misconfigured cross-origin header implementation on Facebook's chat server domain, which allowed an attacker to bypass origin checks and access Facebook messages from an external website.

screenshot

Il nome di "Originull" e lo screenshot sembrano indicare che il problema è la seguente intestazione:

Access-Control-Allow-Origin: null

Ma questo mi fa pensare, in che modo esattamente un valore di null porta a una vulnerabilità. Non sembra un'origine valida, a meno che tu non visiti in qualche modo un sito web dal dominio di null (in realtà, dovrebbe essere http://null o https://null , poiché il protocollo dovrebbe essere incluso) .

Ho controllato e null non è in realtà un valore consentito nello stesso modo in cui * è, in Chrome o Firefox.

XMLHttpRequest cannot load http://other.localhost/ajax.php. The 'Access-Control-Allow-Origin' header contains the invalid value 'null'. Origin 'http://localhost' is therefore not allowed access.

(L'uso di un valore di * funziona comunque, quindi chiaramente il fatto che solo null non è sufficiente per consentire alle pagine arbitrarie di accedere a tali risorse.)

C'è qualche caratteristica o bug nei browser che leggono null come * ? O alcune funzionalità nei browser, come le pagine aperte da un URI di dati, che consentono la corrispondenza con null ? Come funziona questa vulnerabilità?

    
posta Alexander O'Mara 14.12.2016 - 21:33
fonte

2 risposte

9

Sono Ysrael e sono il ricercatore che ha trovato questa vulnerabilità.

Dividiamo la tua domanda in 2 parti: A. In che modo l'origine del browser è diventata null ? B. In che modo null Origin influisce sui server di Facebook?

Iniziamo con A. L'origine fa parte del meccanismo CORS e ha lo scopo di comunicare al server da dove proviene la richiesta. Quando il server riceve la richiesta, il server può decidere di consentire a questa Origin di ricevere la risposta. Uno dei modi per aggirare questa protezione era trovare un Open-Redirect in una delle pagine e quindi indirizzare l'utente allo schema dataURI. In passato, dataURI ha ricevuto l'origine precedente perché non c'erano altre origini da dargli. Come miglioramento della sicurezza, il browser moderno imposta l'origine su null in modo che le richieste XHR da questa pagina dataURI non abbiano l'origine corretta. In Chrome, questa è la situazione in ogni caso, e in Firefox accade solo quando la pagina viene aggiornata tramite meta tag su dataURI.

Ecco come l'origine è diventata null .

L'attacco 'Originull' usa questo comportamento per aggirare i controlli di sicurezza basati sull'origine, perché la maggior parte delle volte i programmatori non pensano a null come valore in questo campo.

Ora passiamo alla parte B. In che modo ha influito su Facebook.

Facebook usa Access-Control-Allow-Origin sui suoi server di Messenger, perché usano un sottodominio differente.

Molto probabilmente, il sottodominio Messenger ha un filtro di sicurezza all'ingresso e quindi le richieste vengono passate al server interno che risponde agli utenti. Quando il server ha voluto rispondere, ha preso il valore dall'origine della richiesta e lo ha restituito sull'intestazione Access-Control-Allow-Origin . Questo design di sviluppo consente a Facebook di mantenere le Origini consentite in un unico posto.

Il sottodominio messenger consente anche richieste GET regolari. Le richieste GET regolari non avevano affatto un header Origin. In molti linguaggi di sviluppo, un'intestazione inesistente restituisce il valore null .

Quindi, il filtro ha una condizione che consente a null di passare (quindi le richieste GET passeranno correttamente) e il server accetta il valore che riceve nell'intestazione Origin della richiesta ( null ) e lo restituisce a il client nell'intestazione Access-Control-Allow-Origin .

Semplice, giusto? ;)

È possibile trovare i dettagli tecnici e le schermate nel documento di divulgazione completa sul sito Web di BusSec all'indirizzo: link

    
risposta data 15.12.2016 - 00:30
fonte
2

È possibile sfruttare Access-Control-Allow-Origin: null perché le risorse caricate su cose come gli URI dei dati e gli iframe in modalità sandbox utilizzano l'origine null . Un PDF che documenta l'exploit conferma che Originull ha usato un documento URI di dati per sfruttare questa intestazione per ottenere l'accesso all'origine incrociata .

Per questo motivo, il W3C consiglia di evitare di restituire questo valore per l'intestazione.

7.4. Avoid returning Access-Control-Allow-Origin: "null"

It may seem safe to return Access-Control-Allow-Origin: "null" , but the serialization of the Origin of any resource that uses a non-hierarchical scheme (such as data: or file: ) and sandboxed documents is defined to be "null". Many User Agents will grant such documents access to a response with an Access-Control-Allow-Origin: "null" header, and any origin can create a hostile document with a "null" Origin. The "null" value for the ACAO header should therefore be avoided.

The simple string comparison of CORS as applied to "null" is controversial. Some believe that "null" should be treated as a keyword token indicating the lack of an Origin, which, when tested, should never compare as equal to another "null" Origin. (As is the case with null values in SQL, for example.) It is unwise to build systems which rely on the "null" equals "null" comparison as this behavior may change in the future.

Quindi, come risulta, un valore di null attualmente non significa nulla di speciale. Non è uguale a * , è solo un'origine non così speciale che può attualmente corrispondere alle risorse prive di origine.

Quindi, se restituisci questa intestazione (anche accidentalmente):

Access-Control-Allow-Origin: null

Le tue risorse al momento saranno accessibili tra di loro.

    
risposta data 14.12.2016 - 23:06
fonte