Come faccio a sandbox utente JS senza utilizzare una VM, un transpiler o un'API basata sulla whitelist?

7

Ho svolto le mie ricerche e ci sono alcuni modi efficaci per JS di sandbox, ovvero:

  • Utilizzare un JS VM che esegue il JS utilizzando un modulo sandbox di js, come VM.js
  • Utilizza un transpiler come Google Caja, che aggiunge ulteriori controlli per conservare determinati invarianti e non consente specifici codepath
  • Utilizza un dominio incrociato (e / o sandbox ed) iframe , potenzialmente anche con un WebWorker, ad es. imprigionato

Sfortunatamente, nessuno di questi funziona bene fuori dagli schemi per la mia applicazione. Sto cercando di creare un'alternativa jsperf.com (cioè un sistema di benchmarking JS basato sul web), quindi i primi due sono fuori, poiché influenzerebbero le prestazioni del codice fornito dall'utente, che invalida completamente qualsiasi risultato di benchmarking.

Il jailed è più vicino, ma non è una grande alternativa perché A) il suo approccio solo whitelist è così restrittivo che il mio sito non sarebbe in grado di testare le prestazioni di molte funzionalità del web (operazioni DOM, IndexedDb, WebWorkers , LocalStorage, ecc.) Senza un sacco di whitelist che non sono nemmeno sicuro funzionerebbe e B) Non sono sicuro di quanto sia ben mantenuto (e quindi sicuro) viene data la poca attività sul suo repository GitHub.

Qual è il sistema più permissivo (in termini di vicinanza alla pubblicazione in modalità non controllata) che posso tranquillamente utilizzare per eseguire il JS fornito dall'utente per il benchmarking? È sufficiente una percentuale di sandbox% co_de sufficiente affinché i benchmark possano almeno accedere a alcuni DOM e ad altre API Web? Il WebWorker è davvero necessario? Cosa fanno jsfiddle e simili?

    
posta 0x24a537r9 01.09.2016 - 07:28
fonte

1 risposta

1

La definizione di ingegneria software di una sandbox è un ambiente di esecuzione con vincoli di sicurezza specifici mantenuti. Ciò significa che il JavaScript dell'utente non dovrebbe essere in grado di sfruttare o influenzare il codice JavaScript della pagina Web contenente.

Un'implementazione iframe non sarà né

  • Garantire che le condizioni di runtime del codice sandbox siano le stesse di quelle eseguite in un documento indipendente, né
  • Accertati che il documento genitore non subisca alcun impatto e che sia eventualmente danneggiato dal codice sandbox.

Se il controllo della rete e del server Web è sufficiente, è possibile stabilire un'indipendenza abbastanza sicura e un ambiente di esecuzione autentico consentendo a un utente autenticato tramite HTTPS di fornire JavaScript sandboxato a siti o siti secondari completamente indipendenti. L'utilizzo di sottodomini può ridurre il costo di questo approccio. Potrebbe essere necessario utilizzare l'hacking target = '_ blank' che alcuni considerano una violazione del modello www.

Per fare attenzione a non creare buchi di sicurezza con questa disposizione, ci sono alcuni consigli.

  • Utilizza una include sul lato server che acquisisce con precisione il codice sandbox.
  • Stringa attentamente tutti gli accessi alla directory del server web.
  • Convalida la sintassi del JavaScript.
risposta data 26.01.2017 - 04:30
fonte

Leggi altre domande sui tag