it-swarm.dev

Come scansionare Javascript per codice dannoso?

Stiamo programmando di dare la possibilità di scrivere estensioni basate sulla community in javascript per la nostra webapp pubblica e consentire alle persone di personalizzare le loro istanze dell'applicazione. Il problema è monitorare la qualità delle estensioni.

Cosa suggeriresti per automatizzare questo processo?

O come scansionare Javascript alla ricerca di codice dannoso?

In poche parole vorremmo avere un servizio come l'antivirus che scansionerebbe in tempo reale le estensioni caricate per essere dannose. E se rileva un codice sospetto, genererebbe un avviso.

Qualsiasi suggerimento/consiglio è il benvenuto! Grazie.

22
Igor

Un approccio sarebbe quello di definire un'API sicura da utilizzare per le estensioni, dichiarando gli oggetti che implementano tale API nell'ambito di esecuzione dell'estensione. Quindi richiede che il codice di estensione sia scritto in una versione sandbox di Javascript, quindi il codice di estensione può invocare solo i metodi API sicuri che hai definito e nient'altro.

Quindi, se la tua API consisteva in un oggetto memorizzato in una variabile api, il codice:

var x = api.frob();
x.bar();

sarebbe consentito il codice di estensione, poiché api fa parte dell'API sicura e le varianti JavaScript sicure consentono di richiamare l'API esposta al codice di estensione.

Tuttavia, il codice:

document.createElement("img");

non sarebbe consentito, poiché document non fa parte dell'API sicura.

Nel progettare l'API, assicurarsi che nessun oggetto esposto abbia proprietà che potrebbero essere utilizzate in modo dannoso. Per fornire un accesso limitato a una risorsa, utilizzare le chiusure per creare funzioni che fanno riferimento privatamente alla risorsa.

Esistono numerosi progetti che hanno definito una versione sandbox di Javascript che è possibile utilizzare per questo scopo: SES , Caja , ADsafe , FBJS e altri. SES e Caja consentono agli sviluppatori di scrivere codice con il minor numero di restrizioni: sembra molto come scrivere Javascript, con alcune restrizioni minori (ad es. No eval, no with). ADsafe e FBJS richiedono allo sviluppatore di apprendere una variante di Javascript. SES, ADsafe e FBJS offrono le migliori prestazioni. SES richiede il supporto di un motore Javascript molto recente e pertanto non è compatibile con alcuni browser Web meno recenti. Se il codice di estensione verrà eseguito sul lato server, allora SES potrebbe essere la soluzione migliore, perché puoi assicurarti che il tuo motore Javascript sia aggiornato. Se l'estensione verrà eseguita sul browser dell'utente, è possibile prendere in considerazione Caja se l'estensione non è critica alle prestazioni o ADsafe/FBJS se lo è.

9
JGWeissman

Non esiste un buon modo per scansionare Javascript alla ricerca di codice dannoso. Non puoi farlo. Il problema è che ci sono troppi modi in cui uno sviluppatore malintenzionato/nascosto può nascondere elementi dannosi nel loro codice e non sarai mai in grado di rilevarli tutti.

L'antivirus non è utile qui. Devi capire un po 'su come funziona il software antivirus e i suoi limiti. In parole povere, ecco come funziona. Se la società antivirus rileva un virus che infetta molte macchine, quindi analizza il virus, identifica una firma del virus (ad esempio, un estratto del suo codice) e lo inserisce nel suo motore. Successivamente, se il tuo computer viene infettato da una copia di quella particolare copia (la stessa identica che ha analizzato), il software antivirus rileverà la sua presenza attraverso questa firma. Di conseguenza, il software antivirus è utile principalmente solo contro i virus che si sono diffusi ampiamente. Il software antivirus esistente non rileverà codice dannoso in un'estensione non autorizzata per la tua webapp. Il software antivirus ha alcuni usi, ma è sostanzialmente inutile per il tuo particolare scenario.

Devi accettare che questo non è un problema che puoi risolvere scansionando il codice. Quindi, dovrai considerare qualche altro approccio. Quali sono le tue opzioni? Ce ne sono diversi:

  • Potresti rinunciare e abbracciare il caos. È possibile creare un sito pubblico per le estensioni, consentire agli utenti di valutare le estensioni e pubblicare/visualizzare recensioni. In questo modo, se uno sviluppatore pubblica un'estensione di bassa qualità che presenta errori o arresti anomali, gli utenti che la notano possono pubblicare una recensione negativa. (Naturalmente, se lo sviluppatore è dannoso e pubblica un'estensione malvagia, non c'è alcuna garanzia che qualcuno lo noterà mai - se sei fortunato, forse qualche utente noterà in qualche modo il codice dannoso e te lo segnalerà, ma è altrettanto probabile che nessuno se ne accorga mai. Questo è il rischio che prendi.)

    Questo è noto come avere un sistema di estensione aperto. Vedi, ad esempio, il Android Market o Google Chrome Extension Gallery o Userscripts.org (un sito di estensione Greasemonkey).

  • Potresti istituire una sorta di sistema di revisione, in cui gli esperti esaminano ogni estensione prima che venga pubblicata (o poco dopo la sua pubblicazione) sul sito di estensione pubblico. Se vuoi solo rilevare problemi di qualità, potrebbe essere sufficiente chiedere agli esperti di installare l'estensione e testarla, e magari eseguire uno strumento di ricerca dei bug di qualità del codice per cercare i problemi più comuni. Se si desidera catturare anche estensioni dannose, il revisore dovrà essere uno sviluppatore in grado di leggere il codice e leggere l'estensione per riga; questo è estremamente noioso e richiede molto tempo, ma non c'è davvero alcuna opzione migliore.

    Questo è noto come avere un sistema di estensione curato. Vedi, ad esempio, il Apple iOS App Store o il sito di estensione di Firefox (addons.mozilla.org) per alcuni esempi, anche se credo che si concentrino solo sulla qualità del codice e non sul rilevamento della malizia.

Indipendentemente dall'approccio adottato, le estensioni offerte da un singolo sito di estensioni pubbliche ospitano la versione autorevole dell'estensione. Potresti voler prendere varie misure per incoraggiare gli utenti a installare estensioni da quel sito e scoraggiarle dall'installare estensioni da altri siti (ad esempio, disabilitando di default l'installazione di estensioni da altre fonti e richiedendo all'utente di fare clic per autorizzare qualsiasi altro dominio che vogliono installare da, come fa Firefox). Qual è il vantaggio? Il vantaggio è che ciò garantisce che tutti i tuoi utenti ottengano la stessa copia dell'estensione. Previene gli attacchi, ad es. Laddove un sito Web dannoso utilizzi alcuni script per verificare se la versione del browser dell'utente e da dove proviene l'utente, e in base a ciò, decide se pubblicare codice dannoso o codice legittimo - tali tipi di attacchi fanno è più difficile rilevare la malizia, quindi fermarli è una buona cosa. Garantisce inoltre agli utenti i vantaggi di recensioni e valutazioni.

Dovresti anche considerare attentamente quali API sono esposte alle estensioni e quali no. Potresti considerare di esporre solo un sottoinsieme dell'API alle estensioni, in modo che le estensioni siano intrinsecamente limitate in ciò che possono fare, come un modo per limitare il danno. Ad esempio, il Chrome consente alle estensioni di interagire con il DOM della pagina Web e il sito Web, ma alle estensioni non è consentito eseguire codice nativo (ad esempio, installare ed eseguire un file .exe). questo tipo di cose aiuta la sicurezza. In alternativa, è possibile fornire un'API di base che evita le API a rischio più elevato e quindi richiedere qualsiasi estensione che richieda l'accesso a più dell'API di base deve ottenere l'approvazione dei moderatori prima di poter essere pubblicati nella sito pubblico.

Un'altra possibile difesa contro le estensioni dannose è l'introduzione di un sistema di autorizzazioni. Si identifica un insieme di autorizzazioni. L'estensione è richiesta per includere un manifest, che specifica il set di autorizzazioni necessarie. Quando l'utente installa l'autorizzazione, il sistema dovrebbe mostrare all'utente l'insieme di autorizzazioni richieste dall'estensione e cosa implicano tali autorizzazioni (ad esempio, quali rischi per la sicurezza/privacy comportano, quale accesso concedono all'estensione), consentendo all'utente di approvare le autorizzazioni e procedere con l'installazione o rifiutare le autorizzazioni e annullare l'installazione. Ciò offre agli utenti un maggiore controllo e visibilità sulle estensioni, riduce i rischi delle estensioni con errori (poiché le conseguenze di una vulnerabilità della sicurezza in un'estensione sono ora limitate solo alle autorizzazioni richieste, non a tutte le autorizzazioni) e possono rendere più evidenti le estensioni dannose ( perché devono richiedere determinate autorizzazioni per fare del male). Vedi, ad esempio, Android o Google Chrome per un esempio di questo tipo di cose.

6
D.W.

(Non tentare di implementare il proprio schema di risanamento. Data la complessità di JavaScipt, i servizi igienico-sanitari cucinati in casa sarebbero probabilmente insicuri. Utilizzare una soluzione esistente che è stata già ben controllata.)

Google Caja Compiler è uno strumento per creare HTML, CSS e JavaScript sicuro da incorporare nel tuo sito web.

Se ricordo bene, è stato usato per iGoogle, perché la semplice separazione del codice non attendibile in iframes presentava ancora dei difetti.

6
Bryan Field

Non so se questo può essere automatizzato facilmente, e sono d'accordo con @ jfriend00 e @slhck per quanto riguarda la difficoltà generale di vagliare con successo questi Javascripts. Detto questo, esiste almeno uno strumento che conosco che tenta di rilevare script dannosi.

Questo strumento è Wepawet , che è gestito dall'Università della California a Santa Barbara. Viene così descritto:

Wepawet è un framework per l'analisi delle minacce basate sul web. Wepawet è in grado di determinare se visitare una pagina Web provocherebbe un tentativo di compromettere l'ambiente del visitatore.

2
Andrew Lambert

IBM Appscan ha un modulo di analisi del codice statico chiamato " JavaScript Security Analyzer (JSA) ". Non è sicuramente gratuito, ma fornisce feedback sulle implicazioni di sicurezza del codice Javascript.

A parte JSA, non sono a conoscenza di altri strumenti di analisi del codice statico per cercare problemi di sicurezza, ma mi piacerebbe saperne di più. Forse se JLint/JHint aggiungessero alcune funzioni di sicurezza?

0
schroeder