Sto cercando di creare un gioco di programmazione in cui i programmi forniti dagli utenti competono in simulazioni di battaglie, da utilizzare come strumento per insegnare e praticare la programmazione. (Sarà probabilmente una simulazione robot basata su turni, ma ai fini di questa domanda, potrebbe anche essere stata una partita a scacchi o dama.) Uno dei componenti principali dell'implementazione di questo gioco sarà quello di fornire un meccanismo per eseguire i generati dagli utenti codice contro i dati di gioco per determinare i movimenti del proprio bot.
So che il consiglio tipico è "Ovunque possibile, non eseguire codice non attendibile" e capisco da dove viene. Nel mio caso attuale, però, sarebbe la funzionalità principale dell'applicazione che vorrei realizzare, se possibile. So che dovrò prendere alcune precauzioni per garantire che il codice fornito dall'utente non causi danni. La configurazione ideale, da quello che posso dire, lo imporrebbe:
- Il codice utente legge lo stato del gioco da STDIN
- Il codice utente scrive generato sposta in STDOUT
- Il codice utente è isolato dal sistema host
- Il codice utente è isolato l'uno dall'altro
- Il codice utente è limitato nelle risorse che può consumare (CPU, memoria, disco)
- Il codice utente non può accedere alla rete
Il mio caso d'uso non sembra unico. Se mai, immagino che uno dei seguenti tipi di app abbia requisiti simili:
- la maggior parte dei giochi di programmazione
- giudici online di programmazione competitiva
- "Prova il linguaggio di programmazione X"
- concorsi AI di gioco
Tuttavia, ho cercato su Google, ma non sono riuscito a trovare alcuna implementazione di riferimento che sembrasse attendibile. La maggior parte delle app di cui sopra sono closed-source e forse per una buona ragione.
Considerati i requisiti, immagino di aver bisogno di una soluzione di isolamento / virtualizzazione / containerizzazione, anche se onestamente non sono sicuro di quale fornire le garanzie necessarie.
Quali sono le migliori pratiche attuali in merito al sandboxing per il codice fornito dall'utente? Qualcuno ha qualche informazione o riferimento a fonti affidabili?