esecuzione sicura di codice arbitrario

0

Ho un programma che può ricevere codice da un utente come input (questa domanda è indipendente dalla lingua, sebbene io sia principalmente interessato alle risposte per Java e Python). Di solito, questo codice sarà utile, ma non ho la garanzia che l'utente non stia commettendo un errore o che abbia fornito deliberatamente codice dannoso.

Voglio essere in grado di eseguire questo codice in modo sicuro, cioè senza effetti collaterali dannosi se risulta essere difettoso o dannoso.

Più in particolare:

  • l'utente specifica che il codice di input deve operare su alcuni oggetti presenti nel programma principale (il programma che ottiene il codice dall'utente e lo esegue). In modo ottimale, dovrebbe essere in grado di accedere direttamente a questi oggetti, ma anche inviarli al programma figlio tramite un protocollo di comunicazione o un file va bene.

  • allo stesso modo, il codice dovrebbe generare un output che viene ritrasmesso al programma padre.

  • l'utente può specificare se consentire al codice di accedere a qualsiasi altro dato, se dovrebbe essere consentito leggere o scrivere su file e se deve avere accesso a qualsiasi altra interfaccia o metodo operativo.

  • è possibile specificare un runtime massimo al termine del quale il codice verrà interrotto se non ha ancora completato l'esecuzione.

  • il programma principale e il codice da eseguire potrebbero essere lingue diverse. Si può presumere che i programmi necessari per compilare ed eseguire il codice specificato siano installati e disponibili per il programma principale. Se le lingue sono diverse, supponiamo che un certo formato standard come JSON possa essere usato per trasmettere i dati (o esiste un modo per farlo in modo più efficiente?)

Penso che questo dovrebbe essere fattibile con una macchina virtuale. Tuttavia, la velocità è una preoccupazione e voglio essere in grado di eseguire molti blocchi di codice rapidamente, in modo che la creazione e la distruzione di una VM per ciascuno di essi possa essere proibitiva.

Un'altra opzione è la creazione di una sandbox, che ad es. Java può fare, ma per quanto ne so solo per l'esecuzione di un altro codice Java. Non riesco a trovare una soluzione per farlo con le lingue arbitrarie.

Per quali lingue funziona bene, per cui è difficile?

È più semplice su alcuni SO che su altri?

    
posta Florian Dietz 18.06.2017 - 15:34
fonte

1 risposta

3

Come si fa notare, la Java Virtual Machine è in grado di sandboxing. Nota che questo si applica non solo ai programmi scritti in Java ma anche ai programmi scritti in qualsiasi lingua per cui è disponibile un'implementazione JVM.

Fortunatamente per il tuo caso d'uso, si tratta di un'implementazione basata su JVM di Python, Jython . Finché il codice Python che vuoi eseguire è compatibile con Jython, puoi usarlo in una sandbox JVM e tutto dovrebbe essere OK.

In caso contrario, se stai lavorando su un sistema simile a Unix, puoi usare un chroot jail isola un processo python (o qualsiasi altra lingua) dal tuo sistema.

Dovresti essere consapevole che entrambi questi approcci si basano sulla sicurezza di sistemi complessi che presenteranno dei difetti. In particolare, dovresti monitorare in modo produttivo i tuoi sistemi in cerca di segni di sfruttamento e assicurarti che tutte le patch siano installate prontamente.

    
risposta data 18.06.2017 - 17:29
fonte

Leggi altre domande sui tag