Vulnerabilità nel popolare Javascript Framework (Angularjs)

17

Ho trovato un bug che ti consente di sfuggire alla sandbox del modello AngularJS. Angolare è un linguaggio modello basato sui baffi. Ti permette di inserire espressioni che vengono valutate nel tuo html. Ad esempio, il rendering {{1 + 1}} viene eseguito in 2

La sandbox fa in modo che gli utenti non possano accedere a finestre / costruttori dall'interno di Angular all'interno delle espressioni. Ad esempio, non puoi fare {{{} .constructor = ...}}. Questo perché tali operazioni sono considerate non sicure nel caso in cui il sito stia salvando i modelli dall'input dell'utente. Apre il sito a XSS.

Passando attraverso il codice sorgente, ho scoperto che esiste un controllo per obj === {}. costruttore che può essere ignorato.

Fondamentalmente, si tratta di ignorare questo:

if (obj) {
    if (obj === (0).constructor || obj === (false).constructor || obj ===     ''.constructor ||
      obj === {}.constructor || obj === [].constructor || obj ===     Function.constructor) {
      throw $parseMinErr('isecaf',
      'Assigning to a constructor is disallowed! Expression: {0}',      fullExpression);
    }
}

Sono riuscito a superare quei controlli nascondendo le mie chiamate al costruttore all'interno di un altro oggetto (letterale dell'oggetto o letterale di array).

Oggetto letterale:

{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert('Evaluated Object Literal')');}}

O come array:

{{x = [''.constructor.prototype]; x[0].charAt=[].join; $eval('x=alert('Evaluated Array')');}}

In che modo è possibile migliorare i controlli sopra riportati per far sì che questi casi non vadano a buon fine?

Ho provato a cambiare obj === {} .Controlla i controlli su instanceof invece che fa funzionare gli assegni, ma penso che possa introdurre i propri problemi di sicurezza. Vorrei inoltrare una richiesta di estrazione, ma spero che altri ricercatori di sicurezza là fuori possano contribuire alla conversazione per rendere la sandbox più strong possibile.

Ecco il mio problema pubblicato sul progetto Angular per riferimento: link

Ecco il materiale correlato: link

Ecco un jsFiddle: link

    
posta ialexander 22.07.2016 - 01:49
fonte

1 risposta

4

Utenti angolari: Interrompi il salvataggio dell'input utente UNSANITIZED .

Ho sentimenti contrastanti sulla risposta alla mia domanda. A partire dalla versione angolare 1.6, il team Angular ha deciso di rimuovere del tutto la sandbox. La sandbox (sebbene non perfetta) offriva all'utente un livello di protezione superficiale rispetto alle proprie scelte quando costruiva un'app Angular. La sandbox era davvero carina e migliorava sempre di più. Ma anche la sandbox non era mai intesa come confine di sicurezza. Era lì per cercare di aiutare a far rispettare i principi del design pulito.

Con la sandbox scomparsa, l'utente angolare sarà costretto a riflettere sulle implicazioni di sicurezza del salvataggio di input utente non sicuri, non disinfettati. Che personalmente penso sia una buona cosa. Se, e solo se, le persone capiscono di andare a quell'aggiornamento che potrebbe potenzialmente aprire problemi di sicurezza più ampi che avevano precedentemente ignorato. Speriamo che questo post aiuti a creare consapevolezza quando le persone cercano "sicurezza angolare 1.6".

La risposta a questa domanda è che Angular ha rimosso la sandbox a partire dalla 1.6 per rispondere al fatto che gli utenti stavano utilizzando la sandbox come meccanismo di sicurezza in cui non era mai stato previsto.

post sul blog di rimozione di sandbox angolare

    
risposta data 11.10.2016 - 13:38
fonte

Leggi altre domande sui tag