Quantcast
Channel: KEIN PFUSCH, BITTE!
Viewing all articles
Browse latest Browse all 561

GPG-BODY

$
0
0
Mentre Grillo si radicalizza sempre di piu', come previsto, vorrei dire due parole su questo piccolo pezzo di codice che sta venendo scaricato con una certa attenzione , crescente.Ho accennato a questo software che mi sono messo a scrivere - pur non essendo uno sviluppatore - ma non ho mai spiegato bene cosa io mi proponga di fare, perche' e per chi. Essenzialmente ho scritto quel software quando mi sono chiesto cosa impedisse che, almeno in teoria , qualcuno entri nella mia email (o in quella di mia moglie) e ci tiri fuori tutto mettendolo in pubblico.

Forse voi tutti conoscete GPG (la versione GPL di PGP): se entrambi i capi della comunicazione via email hanno installato GPG e un software come Enigmail, che permette a Thunderbird di usarlo con facilita', e' possibile criptare il corpo delle mail in modo da renderlo illeggibile da chiunque non abbia le chiavi private dei due capi.

Se lo avete installato, pero', avrete notato come pochissimi di quelli che conoscete lo usino, e quindi il requisito di sicurezza (normalmente preso sottogamba sino a quando non ti bucano la casella o un tuo dipendente, il sistemista, legge la tua email) , e quasi nessuno voglia , per quanto consigliato da voi, sottoporsi alla relativa disciplina.

Cosi' la mia idea e' di installare le chiavi pubbliche del destinatario sul server di destinazione, e di crittare i messaggi avendo cura di rispettare lo standard SMIME, in modo che avendo un Thunderbird con Enigmail, TUTTI i messaggi che scaricate siano crittati per voi.

Questo non vi protegge E2E, anche se una corporate condividendo gli stessi keyserver potrebbe farlo, ma protegge un ulteriore tratto: il dipendente che entri legalmente nel server o chi vi entri illegalmente nella casella di posta non puo' farci niente.  Se lo usate sul portatile, chi vi rubi il portatile viene in possesso delle chiavi private, ma non della passphrase, il che e' sempre un ostacolo "grossino" se avete scelto bene una passphrase robusta.

Andiamo all'implementazione e all'evoluzione del codice:




Le versioni 1.0.X

La prima implementazione realizzava lo use case standard, avendo in mente gli RFC e assumendo the tutti li rispettassero. Sembrava funzionare bene, ma poi ho deciso di fare un pochino di QA+ test automation.

Ho scaricato una storia di 9000 email da gmail, li ho passati a spazzola  invocando un lettore di mail crittate con pgp, e ho visto una quantita' di errori attorno al 25%. Si trattava di server exchange di Microsoft, che usano \0x0D\0x0A al post di \0x0D , quel carattere che vi appare come ^M quando usate un editor linux su un file di windows, insomma.

Inoltre, Microsoft Exchange sembra essere abbastanza "Corner Case" sulla scrittura di header mime, nel senso che non viola le regole, ma diciamo che le elude con una certa astuzia. Cosi' ho dovuto aggiungere codice per supportare anche Exchange.

Supportato Exchange, ho deciso di ripetere l'esperimento con circa 3000 email lavorative. Esse contengono posta inviata con diverse versioni di Exchange, visto che le corporate lo usano, Lotus Notes, Communigate ed altri software in uso tra le aziende. Il 5% di errori era dovuto proprio a differenti comportamenti di diversi MTA non-Exchange, il rimanente 20% era dovuto ad Exchange.

Con la versione 1.0.5 sono riuscito ad ottenere codice che funzioni sul 100% di 12.000 messaggi usati come test. Quindi, ritengo la 1.0.5 matura per la produzione.  Si tratta quindi dell'ultima release della branch 1.0.X.

Le versioni 2.0.X

Se la versione 1.0.5 funziona ed e' stabile, il codice fa schifo. Ero focalizzato sul reverse engineering degli MTA, per trovare un algoritmo adatto , stabile, che funzionasse sempre, qualsiasi merda si usasse per inviare le email, e alla fine l'ho ottenuto.

Il guaio e' che il codice non e' davvero C++ 2011. Ovvero le istruzioni, le classi std , gli iteratori lo sono ma e' tutto un piattone di spaghetti dentro main(). Cosi' se dovessi aggiungere funzionalita' ogni modifica sarebbe rischiosa. Per questo 1.0.5 e' l'ultima versione scritta con questa logica, quella del cosa ma non del "come". Mi interessava un s/mime robusto e l'ho avuto, ma adesso finisce li'.

Il blueprint della versione 2.0 e' proprio quello di portare il codice attuale in una forma ad oggetti, in modo da renderlo manutebinibile, e di rendere piu' semplice l'aggiunta di use cases, inoltre occorre pensare alla dat integrity e consolidare le condizioni di uscita, in modo che se qualcosa va storto venga restituita sempre l'email originale. Questo avviene gia', ma richiede una serie di punti di uscita sparsi qui e la', e non e' un approccio transazionale.

Il blueprint completo per la 2.0 e' quindi:

  • Adesso che l'algoritmo e' robusto, Trasformate GPG-Body in un vero codice ad oggetti.
  • Gestire la trasformazione del messaggio con una macchina a stati deterministica, in modo da poter aggiungere stati (ovvero funzionalita').
  • Unendo le due cose, ottenere un sistema transazionale, ove se qualcosa va storto si ritorna allo stato iniziale.
Cosi' la 1.0.5 e' stata forkata e il primo branch si chiama 2.0.1. Sono lo stesso codice, solo che 1.0.5 e' la fine di una serie che aveva come blueprint ottenere un algoritmo robusto e funzionante , mentre la 2.0.1 ha un altro blueprint.  Se il passaggio vi sfugge, studiate i numeri reali e chiedetevi quale sia la parentela tra 0.9 periodico e 1 nel campo dei reali.

Le difficolta' e gli utenti.

Quando diffondevo gpg-body solo mediante una tarball, esso veniva scaricato da sysadmin capaci di scaricarla e compilarla e installarla. Non ho avuto particolari problemi con loro, se non le segnalazioni di problemi (i bachi di cui parlo sopra).

Poi, pero',  per avere la comodita' del commit+push e quella di una build automatica, ho portato tutto su launchpad e ho creato dei PPA per ubuntu. Anche perche' google sta per impedire agli utenti di usare la funzione di download sul servizio "code", per cui non sara' piu' possibile far scaricare la tarball da li'.

Fatto questo, sono iniziati i problemi con l'approccio Ubuntu a Linux, ovvero "non devi capire per fare". Ora, "fai senza capire" e' un approccio disastroso, e sono iniziati i problemi.

Alcuni hanno notato che se passano solo il recipient a gpg quando lo usano dentro un MTA , non funzioni se si usano virtual users. Certo che no. Essendo invocato dall' MTA, esso gira con un utente assegnato dall' MTA stesso: se non esiste un sottostante utente locale, gpg non sapra' dove prendere le chiavi. In quel caso, o usate un keyserver oppure usare le opzioni --keyring file e  --options file .

Dovete pero' capire che diavolo stiate facendo: nella documentazione ho scritto chiaramente che ogni parametro passiate a gpg-body finira' in pasto a gpg (tranne  -o  e --output , perche' lasciar redirigere l'output di un oggetto che diventa root quando mandate email a root non mi piace proprio)  . Se ho scritto questo nella documentazione, e le cose stanno cosi',  dovrete proprio sapere che diavolo passate al comando.

L'approccio "fai apt-get install qualcosa e funziona tutto, non devi capire" e' un approccio del cazzo. Non posso accusare Ubuntu di questo perche' Ubuntu non vieta a nessuno di studiare , ma esso si e' diffuso troppo tra i sysadmin.

La mia posizione e' che siete dei sysadmin: o capite quel che fate, o vi ficcate le manine altrove.

Un altro punto e' che gpg-body scrive in /tmp

Si, lo fa. Ma ci scrive solo roba criptata da gpg, e la cancella subito dopo, quindi i files durano pochi millisecondi. Su un server avrete molta RAM, e quella che non usate viene usata (in Linux e in molti Unix) come cache per il filesystem, quindi non vi rallenta. Ma avere in ram SIA il messaggio email (diciamo 10 MB di massimo?) che la sua copia criptata significava , per server con molto traffico, un overhead inutile. Il comando in se' e' grande 16KB, non vedo perche' duplicare MB di ram. Peraltro, su Solaris il tmpfileszstem e' di default gia' in RAM, quando non swappato. Non vedo il problema, visto che come ho detto il file temporaneo contiene il messaggio gia' criptato: andra' comunque nella vostra casella postale, esattamente identico. E la casella e' un file sul filesystem, quando non un record su un database.

Un'altra cosa che ho scritto e' che gpgbody lavora tra standard input e standard output, gli errori vanno sullo standard error. CHi ha programmato in C e ha studiato Unix sa che significhi, ma a quanto pare c'e' chi usa pipes e redirezioni senza sapere che diavolo stia facendo. E' ovvio che se redirigete "2" sullo standard output, avrete i messaggi di errore dentro le email.

Allo stesso modo, se anche la vostra shell permettesse di passare nella riga di comando dei caratteri come "<" , ">", "|" etc, senza espanderli, gpg-body non lo accetterebbe ne' li passerebbe al sottostante gpg. Non accetto che un comando che puo' teoricamente acquisire la personalita' del superutente quando si invia posta a root   possa venire arbitrariamente rediretto su un file qualsiasi o su un comando qualsiasi. Teoricamente dovrebbe essere la shell a fare questi controlli, ma per sicurezza gpg-body non accetta roba simile. Magari vi poteva tornare comoda, lo so. Ma e' una porcheria.

Vexata quaestio: ma oltre che per ricevere , posso crittare l'email sul destinatario anche nella coda di invio del server? Attualmente, quando pgp_body non trova una chiave esce restituendo l'input cosi' com'era. Anche se non ho collaudato la cosa a dovere, se due organizzazioni condividono un keyserver possono inserire (pensando a Postfix) il comando in master.cf e fargli effettivamente criptare il traffico in uscita. Quando gpg-body riceve un messaggio gia' criptato, infatti, non lo cripta la seconda volta: il server di destinazione , se usa gpg_body, lo lasciera' in pace.

Non ho pero' testato specificatamente questa opzione, che necessita di un controllo pesante delle condizioni di uscita, (dove pesante=transazionale) quindi o lo testate voi (e mi fate sapere), oppure lo fate a vostro rischio. Se lo dovessi fare io, semplicemente farei passare la posta in uscita per gpg_body solo quando va verso server che sappiamo usare gli stessi keyserver. Man transport (su postfix) per chi vuole sapere come.

Quali sono i rischi?

Il rischio e' che qualcuno abbia installato una volta, per provare, tanti anni fa una chiave pubblica (valida in eterno, of course) e poi, dopo aver formattato e riformattato, abbia perso le sue chiavi. In tal caso, state rendendo illeggibile la sua posta. Il rischio puo' essere mitigato creando una chiave per il server e aggiungendo una opzione --encrypt-to , facendo "Encrypt to self", in modo che il sysadmin possa comunque aiutare il malcapitato in caso di emergenza.(Anche se e' colpa sua, quindi di per se' dovrebbe soffrire ed espiare il suo peccato di non aver revocato le chiavi sui server pubblici).

Altra domanda che mi viene posta: ma ci sara' anche una versione che de-cripta , cosi' eventualmente si potra' installare sui server la chiave privata? CI sono, sembra persone che non usano e non vogliono usare Thunderbird e Enigmail.

La risposta e' che una simile utilita' e' un indebolimento della sicurezza notevole, anche perche' richiederebbe di lasciare sul server un database di passphrase, e non scrivero' nessuna porcheria del genere. Risolvere questo problema fa parte del blueprint della 3.0: poiche' tutti i programmi di email mainstream, anche dove non sia installato  gpg o Enigmail, supportano S/MIME con chiavi RSA standard, la versione 3.0.X uscira' in due versioni, una con gpg e una con openssl.

Quella con openssl usera' chiavi identiche a quelle richieste da Outlook , ma anche Thunderbird, e anche i client per i dispositivi mobili, ove gpg e' raro e poco implementato. In questo modo bastera' avere il client di posta elettronica e le chiavi installate per leggere tutto senza dover installare ulteriore software o dover cambiare programma.

L'ultima domanda che mi e' stata posta e': posso partecipare?

La risposta e' che "se vi conosco" si. So che diversi enti non amano la mia idea, perche' sequestrando un server con la scusa che UNA email e' criminale non possono piu' leggere TUTTA la email ivi contenuta. E so che hanno una gran voglia di infilarci delle backdoor.

Sebbene il codice da sorvegliare sia poco, non ho intenzione di andare in paranoia ogni volta che uno scrive codice usando una scrittura poco familiare per me.

Quindi, se vi conosco e mi fido abbastanza e' ok: fatevi un account su launchpad e vi aggiungo.  Aspettate solo che il software sia splittato in classi, cosi' non si fanno ancora piu' spaghetti e sia possibile la manutenzione.

Altrimenti no, grazie.

Ah, giusto: come mai lo sto facendo e pubblicizzando specialmente in Italia? Perche' avete gia' un serio problema di insicurezza delle comunicazioni, di spionaggio della posta elettronica, di "informatori" che portano la vostra posta in caserma da dentro le aziende, di investigatori privati che pagano i sysadmin per portare fuori la posta, di impiegati precari che leggono la posta nei server che amministrano, e una polizia/magistratura che se ne fotte dei vostri diritti costituzionali. Ne avete bisogno.

Puo' bastare?

Uriel

Viewing all articles
Browse latest Browse all 561

Trending Articles