2011-09-16 10 views
33

Quali sono le opzioni per l'esecuzione (probabilmente dannosa) degli script inviati dall'utente in node.js, in modo sicuro? Cioè in un ambiente che impedisce al codice di accedere a dati sensibili e API?Come eseguire gli script inviati dall'utente in modo sicuro in una sandbox node.js?

è un punto di partenza allettante ... ma sembra che ci siano known issues lì.

Il sandbox module sembra interessante, ma utilizza anche runInNewContext() quindi sono un po 'diffidente.

+0

Si consiglia di utilizzare 'vm' perché fa parte del nodo core. E poiché il nodo core tende a correggere i bug, supponiamo che il problema venga risolto. – Raynos

+0

@Raynos non è un bug. I documenti dicono che è inteso solo per codice noto. – thejh

+0

@thejh - true, ma l'API si presta alla ragionevole credenza che il codice sia in esecuzione in un contesto completamente diverso, implicando che detto codice non dovrebbe essere in grado di accedere al contesto corrente. E mi aspetto che l'intento * dell'API sia esattamente quello: fornire una sandbox in cui eseguire gli script. Quindi ... Penso che un caso abbastanza forte possa essere fatto che questo è semplicemente un bug ben documentato. :) – broofa

risposta

29

È necessario eseguire sempre codice non affidabile in un processo separato, che è esattamente ciò che fa il modulo sandbox. Un motivo semplice è che congela il nodo.

Si avvia creando un processo separato, che in seguito invierà il risultato serializzato a JSON sul suo stdout. Il processo genitore continua a essere eseguito indipendentemente da ciò che fa il bambino e può attivare un timeout.

Il codice non attendibile viene quindi inserito in una chiusura con strict mode (nel normale JavaScript, è possibile utilizzare arguments.callee.caller per accedere ai dati esterni all'ambito). Infine, viene inviato un oggetto global molto limitato per impedire l'accesso all'API del nodo. Il codice non affidabile può eseguire solo calcoli di base e non ha accesso a file o socket.

Mentre si dovrebbe leggere il codice di sandbox come fonte di ispirazione, non mi consiglia di usarlo come è:

  • Il codice è vecchio e non è stato aggiornato per 7 mesi.
  • Il modulo Processo figlio nel nodo fornisce già la maggior parte delle funzionalità necessarie, in particolare child_process.fork().
  • Il canale IPC fornito da child_process.fork probabilmente ha prestazioni migliori.

Per una maggiore sicurezza, è possibile anche considerare l'utilizzo di setuid-sandbox. È il codice utilizzato da Google Chrome per impedire ai processi di tabulazione di accedere al file system. Dovresti creare un modulo nativo, ma questo example sembra semplice.

+3

I metodi nel modulo 'vm' ora supportano un parametro' timeout' che ti permette di eseguire tranquillamente 'while (true) {}'. Ovviamente non affronta i problemi di sicurezza, ma affronta loop infiniti. –

+0

@AndrewPaprocki Puoi collegarti ai documenti in cui viene visualizzato il timeout? –

+0

@RobFox questo è in v0.11, http://nodejs.org/docs/v0.11.13/api/vm.html –

8

C'è a newer module on github called vm2 che risolve alcuni di questi problemi, specialmente nelle applicazioni Node.JS. Forse questo aiuterà altri a trovarlo, come ho appena fatto.

Problemi correlati