17. Esecuzione limitata

In Python 2.3 questi moduli sono stati disabilitati a seguito di alcuni problemi di sicurezza conosciuti e non facilmente sistemabili. I moduli vengono ancora qui documentati per aiutare la lettura di vecchio codice che utilizza i moduli rexec e Bastion.

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:

Grail Home Page
Grail, un browser Internet scritto in Python, utilizza questi moduli per supportare gli applet Python. Maggiori informazioni sull'uso della modalità di esecuzione limitata di Python in Grail è disponibile sul sito web.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.