<div class="gmail_quote">Il giorno 13 novembre 2010 22:49, Manlio Perillo <span dir="ltr"><<a href="mailto:manlio.perillo@gmail.com">manlio.perillo@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">
</div>Ecco un proof of concept, basato sul PEP 302:<br>
<a href="http://paste.pocoo.org/show/290997/" target="_blank">http://paste.pocoo.org/show/290997/</a><br></blockquote><div>Eccomi,<br><br>Manlio ti chiedo scusa se non ho risposto subito ma ho preferito un attimo leggermi la PEP302, studiarmi il tuo proof e fare qualche prova di mio.<br>
<br>Premetto di aver lavorato sulla versione 3.0.1.<br>Ho scoperto leggendo la documentazione su 'site' [1] che l'import di quest'ultimo e disattivabile passando l'opzione -S<br><br>Poi mi sono guardato per bene la PEP302 e il tuo esempio (per il quale ti ringrazio).<br>
<br>Ho scaricato in seguito i sorgenti di Python3.0.1, e mi sono guardato il meccanismo di import e la funzione Py_Initialize.<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Svantaggi<br>
=========<br>
<br>
Per disabilitare la verifica delle firme, all'utente basta (a scelta):<br>
* modificare la funzione __import__<br>
* rimuovere l'importer da sys.meta_path<br>
<br>
Ovviamente questo è un problema solo se permetti di importare moduli<br>
"untrusted"; ma il caricamento di un modulo untrusted fallirà comunque,<br>
con la politica di default (permetti solo l'import di moduli "noti" ed<br>
integri).<br>
<br>
L'unica precauzione è *disabilitare* gli hook eseguiti all'avvio<br>
dell'interprete, ad esempio il caricamento di site.py; questo perchè gli<br>
hook permettono di eseguire codice utente arbitrario *prima* che<br>
l'importer hook sia stato registrato (XXX check me).<br></blockquote><div><br>Volendo evitare ogni volta l'opzione -S, e potendo usare una versione modificata (non pesantemente, solo per permettere di prevenire gli auto-import iniziali), una soluzione sarebbe quella di modificare la funzione 'Py_Initialize' disabilitando tutti gli import automatici, e quindi, permettendo di registrare subito il tuo SignedImporter, poi si importano eventualmente i file site.py ed altri necessari al corretto funzionamento e/o preparazione dei dati necessari a runtime.<br>
La funzione in oggetto si trova nel file 'pythonrun.c' [1].<br>Leggendola però si nota che la funzione '_PyImportHooks_Init' viene invocata appena prima di importare 'site' e addirittura prima di creare __main__.<br>
<br>La funzione '_PyImportHooks_Init' si trova invece nel file sorgente 'import.c' [2].<br>Questa è parecchio più interessante e permette di importare direttamente il SignedImporter (viene usata default per importare il modulo' zipimport'), di registrarlo in sys.meta_path e quindi di anteporre il tuo metodo di importazione persino a site.py (che quindi potrà essere verificato tramite hash).<br>
<br>Le strade che ho trovato fino ad ora sono quindi due, nel primo caso puoi fare tutto direttamente anche da file '.py' dovendo però importare anche 'site' e gli altri import necessari, posticipando quindi una parte di inizializzazione dell'interprete.<br>
La seconda strada invece è fattibile modificando appunto l'import hook iniziale, caricando il modulo che contiene il SignedImporter (l'hash in questo caso deve essere verificato però da C, poi ci penserà il modulo stesso a farlo per gli altri). In questo caso devi distribuire anche il modulo signedimporter.py però con l'interprete altrimenti non lo trova.<br>
<br>Per aumentare la sicurezza, nel secondo caso, sarebbe necessario operare diversamente da come fanno per 'zipimport' perchè, in quel caso in assenza del modulo in questione, non causa alcun errore, puliscono l'errore, e in caso sia definita la variabile d'ambiente PYTHONVERBOSE mostra su stderr il messaggio di errore, ma continua per i fatti suoi. Nel nostro caso invece sarebbe opportuno, in assenza del signedimporter , di segnalare l'errore e terminare l'esecuzione altrimenti si perde il senso di tutto il lavoro fatto.<br>
<br>Queste sono le due strade che mi sono venute in mente leggendomi quella parte di codice sorgente CPython relativa all'import.<br>Adesso stò provando a lavorare sulla seconda strada, appena realizzo qualcosa di usufruibile vi segnalo la patch cosi potrete provarla,<br>
intanto sono aperto ad eventuali consigli/esperienze e analisi da voi che ne sapete più di me :)<br><br>[1] <a href="http://svn.python.org/view/*checkout*/python/trunk/Python/pythonrun.c?content-type=text%2Fplain">http://svn.python.org/view/*checkout*/python/trunk/Python/pythonrun.c?content-type=text%2Fplain</a><br>
[2] <a href="http://svn.python.org/view/*checkout*/python/trunk/Python/import.c?content-type=text%2Fplain">http://svn.python.org/view/*checkout*/python/trunk/Python/import.c?content-type=text%2Fplain</a> <br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">
Ciao Manlio<br><br></div></blockquote><div>Ciao ciao e buona giornata! <br></div></div><br>