kutombawewe.net

Perché Google si antepone mentre (1); alle loro risposte JSON?

Perché Google antepone while(1); alle loro risposte JSON (private)?

Ad esempio, ecco una risposta mentre si attiva e disattiva un calendario in Google Calendar :

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

Suppongo che ciò impedisca alle persone di eseguire eval() su di esso, ma tutto quello che dovresti fare è sostituire while e poi verrai impostato. Assumerei che la prevenzione della valutazione sia di assicurarsi che le persone scrivano un codice di analisi JSON sicuro.

Ho visto questo anche in un paio di altri posti, ma molto di più con Google (Mail, Calendar, Contatti, ecc.) Stranamente, Google Docs inizia con &&&START&&& invece, e Google Contacts sembra per iniziare con while(1); &&&START&&&.

Cosa sta succedendo qui?

3824
Jess

Impedisce JSON hijacking , un importante problema di sicurezza JSON formalmente fixed in tutti i principali browser dal 2011 con ECMAScript 5.

Esempio di esempio: Google ha un URL come mail.google.com/json?action=inbox che restituisce i primi 50 messaggi della tua casella di posta in formato JSON. I siti Web malvagi su altri domini non possono effettuare AJAX richieste per ottenere questi dati a causa della stessa politica di origine, ma possono includere l'URL tramite un tag <script>. L'URL viene visitato con your cookies, e per sovrascrivendo il costruttore di array globale oi metodi accessor possono avere un metodo chiamato ogni volta che viene impostato un attributo object (array o hash), che consente loro di leggere il contenuto JSON.

Il while(1); o &&&BLAH&&& impedisce che: una _ AJAX richiesta a mail.google.com abbia pieno accesso al contenuto del testo e possa eliminarlo. Ma un inserimento di tag <script> esegue ciecamente il codice JavaScript senza alcuna elaborazione, risultando in un loop infinito o un errore di sintassi.

Questo non risolve il problema della falsificazione di richieste incrociate .

4079
rjh

Previene la divulgazione della risposta tramite il dirottamento JSON.

In teoria, il contenuto delle risposte HTTP è protetto dalla stessa politica di origine: le pagine di un dominio non possono ottenere parti di informazioni dalle pagine dell'altro dominio (se non esplicitamente consentito).

Un utente malintenzionato può richiedere pagine su altri domini per suo conto, ad es. utilizzando un tag <script src=...> o <img>, ma non può ottenere alcuna informazione sul risultato (intestazioni, contenuti).

Pertanto, se visiti la pagina di un utente malintenzionato, non è possibile leggere la tua email da gmail.com.

Tranne che quando si usa un tag script per richiedere contenuti JSON, il JSON viene eseguito come Javascript nell'ambiente controllato di un utente malintenzionato. Se l'autore dell'attacco può sostituire il costruttore Array o Object o qualche altro metodo utilizzato durante la costruzione di un oggetto, qualsiasi cosa nel JSON dovrebbe passare attraverso il codice dell'attaccante e essere divulgata.

Nota che ciò accade nel momento in cui il JSON viene eseguito come Javascript, non nel momento in cui viene analizzato.

Ci sono più contromisure:

Assicurarsi che il JSON non venga mai eseguito

Inserendo un'istruzione while(1); prima dei dati JSON, Google si assicura che i dati JSON non vengano mai eseguiti come Javascript.

Solo una pagina legittima può effettivamente ottenere l'intero contenuto, rimuovere while(1); e analizzare il resto come JSON.

Cose come for(;;); sono state viste su Facebook, ad esempio, con gli stessi risultati.

Assicurarsi che il JSON non sia Javascript valido

Allo stesso modo, aggiungere token non validi prima del JSON, come &&&START&&&, fa in modo che non venga mai eseguito.

Restituisci sempre JSON con un oggetto all'esterno

Questo è OWASPmodo consigliato per proteggere dal dirottamento JSON ed è il meno intrusivo.

Analogamente alle contromisure precedenti, si assicura che il JSON non venga mai eseguito come Javascript.

Un oggetto JSON valido, quando non è racchiuso da qualcosa, non è valido in Javascript:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

Questo è comunque valido JSON:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

Pertanto, assicurandoti di restituire sempre un oggetto al livello più alto della risposta, assicurati che JSON non sia Javascript valido, mentre è ancora valido JSON.

Come notato da @hvd nei commenti, l'oggetto vuoto {} è Javascript valido e sapere che l'oggetto è vuoto può essere di per sé un'informazione preziosa.

Confronto dei metodi di cui sopra

Il modo OWASP è meno invadente, in quanto non richiede modifiche alla libreria client e trasferisce JSON valido. Non è sicuro se i bug del browser passati o futuri possano sconfiggere ciò, comunque. Come notato da @oriadam, non è chiaro se i dati possano essere trapelati in un errore di analisi attraverso una gestione degli errori o meno (ad esempio window.onerror).

Il modo in cui Google richiede la libreria client per supportare la de-serializzazione automatica e può essere considerato più sicuro in relazione ai bug del browser.

Entrambi i metodi richiedono modifiche laterali del server per evitare che gli sviluppatori inviino inavvertitamente JSON vulnerabili.

513
Arnaud Le Blanc

Questo per assicurarsi che qualche altro sito non possa fare brutti scherzi per cercare di rubare i tuoi dati. Ad esempio, con sostituendo il costruttore di array , includendo questo URL JSON tramite un tag <script>, un sito di terze parti malintenzionato potrebbe rubare i dati dalla risposta JSON. Mettendo all'inizio while(1);, lo script si bloccherà.

D'altra parte, una richiesta con lo stesso sito che utilizza XHR e un parser JSON separato, può facilmente ignorare il prefisso while(1);.

354
bdonlan

Ciò renderebbe difficile a una terza parte inserire la risposta JSON in un documento HTML con il tag <script>. Ricorda che il tag <script> è esente da Same Origin Policy .

104
Daniel Vassallo

Nota : dal 2019, molte delle vecchie vulnerabilità che portano alle misure preventive discusse in questa domanda non sono più un problema nei browser moderni. Lascerò la risposta sotto come una curiosità storica, ma in realtà l'intero argomento è cambiato radicalmente dal 2010 (!!) quando è stato chiesto.


Impedisce che venga utilizzato come target di un semplice tag <script>. (Beh, non lo impedisce, ma lo rende spiacevole). In questo modo i cattivi non possono semplicemente mettere quel tag script nel proprio sito e fare affidamento su una sessione attiva per rendere possibile recuperare il contenuto.

edit - annota il commento (e altre risposte). Il problema ha a che fare con strutture built-in sovvertite, in particolare con i costruttori Object e Array. Questi possono essere modificati in modo tale che il JSON altrimenti innocuo, se analizzato, possa attivare il codice dell'attaccante.

72
Pointy

Poiché il tag <script> è esente dallo stesso criterio di origine, che è una necessità di sicurezza nel mondo web, while(1) quando aggiunto alla risposta JSON impedisce l'uso improprio di esso nel tag <script>.

9
kg11