[Python] SignedImporter [was: Criptazione dei file sorgenti per evitare la manomissione]

lex mlist lexmlist a gmail.com
Dom 14 Nov 2010 14:00:43 CET


Il giorno 13 novembre 2010 22:49, Manlio Perillo
<manlio.perillo a gmail.com>ha scritto:

> Ecco un proof of concept, basato sul PEP 302:
> http://paste.pocoo.org/show/290997/
>
Eccomi,

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.

Premetto di aver lavorato sulla versione 3.0.1.
Ho scoperto leggendo la documentazione su 'site' [1] che l'import di
quest'ultimo e disattivabile passando l'opzione -S

Poi mi sono guardato per bene la PEP302 e il tuo esempio (per il quale ti
ringrazio).

Ho scaricato in seguito i sorgenti di Python3.0.1, e mi sono guardato il
meccanismo di import e la funzione Py_Initialize.

> Svantaggi
> =========
>
> Per disabilitare la verifica delle firme, all'utente basta (a scelta):
> * modificare la funzione __import__
> * rimuovere l'importer da sys.meta_path
>
> Ovviamente questo è un problema solo se permetti di importare moduli
> "untrusted"; ma il caricamento di un modulo untrusted fallirà comunque,
> con la politica di default (permetti solo l'import di moduli "noti" ed
> integri).
>
> L'unica precauzione è *disabilitare* gli hook eseguiti all'avvio
> dell'interprete, ad esempio il caricamento di site.py; questo perchè gli
> hook permettono di eseguire codice utente arbitrario *prima* che
> l'importer hook sia stato registrato (XXX check me).
>

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.
La funzione in oggetto si trova nel file 'pythonrun.c' [1].
Leggendola però si nota che la funzione '_PyImportHooks_Init' viene invocata
appena prima di importare 'site' e addirittura prima di creare __main__.

La funzione '_PyImportHooks_Init' si trova invece nel file sorgente
'import.c' [2].
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).

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.
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.

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.

Queste sono le due strade che mi sono venute in mente leggendomi quella
parte di codice sorgente CPython relativa all'import.
Adesso stò provando a lavorare sulla seconda strada, appena realizzo
qualcosa di usufruibile vi segnalo la patch cosi potrete provarla,
intanto sono aperto ad eventuali consigli/esperienze e analisi da voi che ne
sapete più di me :)

[1]
http://svn.python.org/view/*checkout*/python/trunk/Python/pythonrun.c?content-type=text%2Fplain
[2]
http://svn.python.org/view/*checkout*/python/trunk/Python/import.c?content-type=text%2Fplain

Ciao   Manlio
>
> Ciao ciao e buona giornata!
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20101114/f7f1ba8c/attachment.htm 


Maggiori informazioni sulla lista Python