Esecuzione sicura di codice Python non attendibile

4

Ho visto un paio di altri post su persone che tentano di eseguire codice immesso dall'utente non attendibile in un'istruzione eval o exec. La mia implementazione controlla il codice in anticipo per eventuali istruzioni di importazione, assicura che non ci siano builtin nell'istruzione exec e cancelli tutte le variabili globali. Ho anche inserito dei controlli per l'uso di __ nel codice per assicurarmi che gli utenti non possano inserire codice pericoloso in questo modo

Questo risolve il problema, o ci sono altri modi in cui gli utenti possono importare moduli pericolosi e rompere la shell o fare del male?

    
posta adammoyle 12.04.2018 - 02:30
fonte

2 risposte

2

Python non ha un modello di sicurezza che ti permette di eseguire in sicurezza il codice non fidato all'interno del tuo programma. Persino nei linguaggi che hanno modelli di sicurezza di questo tipo (come Java) ci sono innumerevoli bug che rendono discutibile l'uso di questo modello di sicurezza.

Esistono due approcci ragionevoli a questo problema di sicurezza:

  • usa le funzionalità di sicurezza del sistema operativo, ad es. seccomp / capabilities / namespaces in Linux.

  • non consentono il codice senza limitazioni, ma interpretano invece un linguaggio specifico del dominio o parametrizzano il tuo input con un semplice modello di dati. Per molti domini problematici, la configurazione al posto del codice è un approccio ragionevole. Potrebbe anche essere possibile includere una macchina virtuale sandboxed, ad es. un ambiente JavaScript.

La terza soluzione è probabilmente la più realistica: adattare il modello di sicurezza dell'applicazione alla realtà in cui verrà eseguito il codice che non hai scritto. Per esempio. se gli utenti eseguono il tuo software da soli, tutti i plug-in che scrivono sono il loro problema. Questo va bene, purché tu possa documentare questa possibilità.

Si noti che il solo fatto di non consentire importazioni non è utile se si forniscono oggetti definiti dall'utente al codice non attendibile. Utilizzando il reflection, è spesso possibile accedere a qualsiasi variabile dal modulo in cui è stata definita, incluso un set completo di builtin o altri moduli già importati.

    
risposta data 12.04.2018 - 09:29
fonte
1

La cosa più vicina è probabilmente la funzione sandbox di PyPy: link

Ciò non impedisce tuttavia l'esaurimento delle risorse, che potresti ulteriormente limitare con gli strumenti menzionati.

    
risposta data 18.05.2018 - 10:09
fonte

Leggi altre domande sui tag