<div class="gmail_quote">Il giorno 13 novembre 2010 22:49, Manlio Perillo <span dir="ltr">&lt;<a href="mailto:manlio.perillo@gmail.com">manlio.perillo@gmail.com</a>&gt;</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 &#39;site&#39; [1] che l&#39;import di quest&#39;ultimo e disattivabile passando l&#39;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&#39;utente basta (a scelta):<br>
* modificare la funzione __import__<br>
* rimuovere l&#39;importer da sys.meta_path<br>
<br>
Ovviamente questo è un problema solo se permetti di importare moduli<br>
&quot;untrusted&quot;; ma il caricamento di un modulo untrusted fallirà comunque,<br>
con la politica di default (permetti solo l&#39;import di moduli &quot;noti&quot; ed<br>
integri).<br>
<br>
L&#39;unica precauzione è *disabilitare* gli hook eseguiti all&#39;avvio<br>
dell&#39;interprete, ad esempio il caricamento di site.py; questo perchè gli<br>
hook permettono di eseguire codice utente arbitrario *prima* che<br>
l&#39;importer hook sia stato registrato (XXX check me).<br></blockquote><div><br>Volendo evitare ogni volta l&#39;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 &#39;Py_Initialize&#39; 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 &#39;pythonrun.c&#39; [1].<br>Leggendola però si nota che la funzione &#39;_PyImportHooks_Init&#39; viene invocata appena prima di importare &#39;site&#39; e addirittura prima di creare __main__.<br>
<br>La funzione &#39;_PyImportHooks_Init&#39; si trova invece nel file sorgente &#39;import.c&#39; [2].<br>Questa è parecchio più interessante e permette di importare direttamente il SignedImporter (viene usata default per importare il modulo&#39; zipimport&#39;), 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 &#39;.py&#39; dovendo però importare anche &#39;site&#39; e gli altri import necessari, posticipando quindi una parte di inizializzazione dell&#39;interprete.<br>
La seconda strada invece è fattibile modificando appunto l&#39;import hook iniziale, caricando il modulo che contiene il SignedImporter (l&#39;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&#39;interprete altrimenti non lo trova.<br>
<br>Per aumentare la sicurezza, nel secondo caso, sarebbe necessario operare diversamente da come fanno per &#39;zipimport&#39; perchè, in quel caso in assenza del modulo in questione, non causa alcun errore, puliscono l&#39;errore, e in caso sia definita la variabile d&#39;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&#39;errore e terminare l&#39;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&#39;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>