L'esecuzione limitata è l'infrastruttura base in Python che permette l'isolamento di codice affidabile e inaffidabile. L'infrastruttura si basa sul concetto per cui il codice Python affidabile (il supervisore) possa creare una ``cella di contenimento'' (o ambiente) con permessi limitati ed eseguire il codice inaffidabile all'interno di questa cella. Il codice inaffidabile non può uscire dalla sua cella e può iteragire con le risorse di sistema sensibili solamente attraverso le interfacce definite e gestite dal supervisore. Il termine ``esecuzione limitata'' viene preferito al termine ``Python sicuro'' poiché la vera sicurezza è difficile da definire e viene determinata dalla maniera in cui viene creato l'ambiente limitato. Notate che gli ambienti limitati possono venire annidati, con le celle interne in grado di creare sotto celle con privilegi minori, mai maggiori.
Un aspetto interessante del modello di esecuzione limitata di Python è che l'interfaccia presentata al codice inaffidabile generalmente possiede gli stessi nomi di quella presentata al codice affidabile. Perciò non è necessario conoscere interfacce speciali per scrivere codice da utilizzare in un ambiente limitato. Poiché l'esatta natura della cella di contenimento viene definita dal supervisore, si possono imporre differenti restrizioni, a seconda dall'applicazione. Per esempio, può essere ritenuto ``sicuro'' per il codice inaffidabile leggere qualunque file in una directory specifica, ma mai scrivere un file. In questo caso, il supervisore può ridefinire la funzione built-in open() in modo che sollevi un'eccezione ogniqualvolta il parametro mode sia 'w'. Può anche effettuare un'operazione tipo chroot() sul parametro filename, in modo che la root sia sempre relativa ad alcune aree ``ingabbiate'' sicure del filesystem. In questo caso, il codice inaffidabile vedrebbe ancora nel suo ambiente una funzione built-in open(), con la stessa interfaccia di chiamata. Anche le semantiche sarebbero identiche, sollevando l'eccezione IOError nel caso il supervisore determini l'utilizzo di un parametro non permesso.
Il run-time di Python determina se un particolare blocco di codice venga eseguito
in modalità di esecuzione limitata in base all'identità dell'oggetto __builtins__
nelle sue variabili globali: se questo è (il dizionario de)
il modulo standard __builtin__, il codice viene ritenuto come non
limitato, altrimenti viene considerato come limitato.
Il codice Python eseguito in modalità limitata deve affronare un certo numero di restrizioni disegnate per prevenire la sua fuga dalla cella di contenimento. Per esempio, l'attributo funzione func_globals e l'attributo di istanza e classe __dict__ non sono disponibili.
Sono due i moduli che forniscono la struttura per impostare gli ambienti di esecuzione limitata:
rexec | Infrastruttura di base per l'esecuzione limitata. | |
Bastion | Fornire un accesso limitato agli oggetti. |
Vedete anche: