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.