2009-08-28 7 views
16

Sto utilizzando javax.scripting per aggiungere supporto per l'esecuzione di JavaScript JavaScript caricati dall'utente sul lato server. Ovviamente voglio proteggere quegli script!Come posso proteggere gli script con javax.scripting?

Rhino, in proprio, dispone di un framework per la protezione degli script in fase di esecuzione. La documentazione per javax.scripting, tuttavia, non menziona la sicurezza, le autorizzazioni o le classi restrittive disponibili per lo script. Quindi questo è solo un enorme buco nell'API javax.scripting che non offre un framework per proteggere gli script che esegue?

Non voglio utilizzare Rhino direttamente perché inizialmente l'ho provato, ma ho avuto alcuni problemi nell'esporre le istanze di Java allo script in esecuzione. Il framework javax.scripting lo ha reso (che utilizza Rhino sotto il cofano) ha reso questi script di esecuzione banali e anche semplificati in un server multi-thread.

Desidero elencare in white list le classi Java a cui è possibile accedere/creare un'istanza all'interno dello script in esecuzione. Qualcuno può indicarmi un esempio o una documentazione su come ottenere ciò?

risposta

18

Si scopre che javax.scripting non offre un quadro di sicurezza. Dopo alcune ricerche ho trovato un documento nella cache di Google che suggeriva di provare a utilizzare il framework Java doPrivilegedAction ma dopo alcuni esperimenti, non sono riuscito a ottenere questo per impedire agli script di aprire socket o accedere al filesystem.

Dopo aver posto questa domanda ho scoperto che era stato precedentemente chiesto in StackOverflow: How can you run Javascript using Rhino for Java in a sandbox? In quella pagina, indica erroneamente che il Rhino incluso nel JDK6 ha già risolto la sicurezza. Come ho indicato, sono stato in grado di aprire socket e altre azioni dannose dallo script.

Alla fine ho abbandonato javax.scripting e incorporato Rhino direttamente. Con la costruzione di un costume ContextFactory che è anche un ClassShutter sono stato in grado di ottenere due risultati facilmente:

  1. Restringe l'ora di esecuzione dello script ad un limite massimo di tempo
  2. limita l'accesso di classe a quelli che ho white list, che è in pratica java.lang.* e alcune classi selezionate nella gerarchia del mio server.

CodeUtopia (che non riesco a collegare a causa, come nuovo utente, non mi è permesso di collegare a più pagine in un unico post, ma è legato in altri post StackOverflow) è stato prezioso nel descrivere l'architettura ClassShutter e la pagina API ContextFactory di Rhino descrivono come creare un oggetto personalizzato ContextFactory.

2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ descrive un modo per sandbox rhino e javax.scripting utilizza Rhino come motore di script JS in modo che sia possibile utilizzare quanto sopra, sebbene i nomi dei pacchetti possano essere diversi.

Ho lavorato a un'app Java che aveva bisogno di Rhino per gli script. L'app avrebbe dovuto eseguire codice JavaScript non attendibile da terze parti, quindi ho dovuto trovare per bloccare l'accesso a tutti i metodi Java , eccetto quelli che volevo. Questo non sarebbe un problema se lo fosse un modo semplice per disabilitare LiveConnect - la funzionalità di Rhino che fornisce l'accesso java agli script - ma non c'è nulla di simile a .

Tuttavia, dopo un sacco di scavo in giro, ho finalmente trovato un modo per fare questo senza troppi hacking. In infatti, può essere fatto semplicemente estendendo alcune delle classi di Rhino e usando i setter forniti per sovrascrivere alcuni di quelli predefiniti.

0

FYI, questo è ora possibile nella nuova implementazione Java 8 di javax.scripting che utilizza un nuovo motore chiamato Nashorn. Vedi Secure Nashorn JS Execution

Problemi correlati