--- title: 'Cable: un servizio Signal federato' author: - torn | [torn@autistici.org](torn@autistici.org) - gine | [gine@ventuordici.org](gine@ventuordici.org) date: Hackmeeting 0x14 --- Val di Susa --- ## Perché Signal ### PGP/GPG Classico sistema a chiave pubblica. * Offre: * Riservatezzaa * Autenticazione ed integrità * Ma non ammette: * Forward secrecy * Deniable encryption ### Off-the-Record (OTR) * Offre: * Riservatezza * Autenticazione * Forward secrecy (chiavi effimere) * Deniability ### OTR Three-step-ratchet ![Three step ratchet](images/threestepratchet.png) ### Limitazioni di OTR * Complessità: usa DSA * La *plausible deniability* richiede di disseminare le chiavi MAC usate * *Deniability* comunque limitata * Non adatto a comunicazioni asincrone * Necessita che i messaggi arrivino in ordine ### OTR e comunicazioni asincrone * Per mandare un messaggio è necessario prima completare uno scambio di chiavi * Non avviene se il destinatario è offline * Quando il destinatario torna online il miettente potrebbe non esserlo più * Il sistema funziona bene solo se entrambi hanno il client aperto contemporaneamente ### Double Ratchet Algorithm * Dopo uno scambio di chiavi iniziale, genera e mantiene delle chiavi effimere a vita breve * Quando possibile scambia le chiavi usando DH * Altrimenti genera il nuovo materiale crittografico con una funzione di derivazione ### Prekeys * Alla registrazione il client genera 100 "prekey" e le comunica al server * Un altro client può iniziare una sessione usando una di queste prekey, anche se il destinatario è offline * Una prekey è usata solo una volta * La conversarione può iniziare in modo completamente asincrono ### Scambio chiavi alla OTR ![OTR Current](images/otr-current.png) ### Triple Diffie-Hellman handshake ![OTR Simplified](images/otr-simplified.png) ### Proprietà (da Wikipedia) The protocol provides confidentiality, integrity, authentication, destination validation, forward secrecy, backward secrecy, causality preservation, message unlinkability, message repudiation, participation repudiation, and asynchronicity. ### Proprietà 2 (da Wikipedia) The group chat protocol is a combination of a pairwise double ratchet and multicast encryption. In addition to the properties provided by the one-to-one protocol, the group chat protocol provides speaker consistency, out-of-order resilience, dropped message resilience, computational equality, trust equality, subgroup messaging, as well as contractible and expandable membership. ### Progetti derivati * Wire (protocollo Proteus) * OMEMO (XMPP) * OLM (Matrix) * Proprietari: Viber, WhatsApp, Facebook Messenger (secret conversations), Google Allo (incognito mode) ### Su XMPP/OMEMO XMPP+OMEMO funziona, usiamolo! Però: * Usabilità * Autenticazione sul numero di telefono * La frammentazione è un problema * Supporto per (video)chiamate WebRTC * Diverso tipo di utenza * **Evidenza sperimentale!** ### L'abbiamo fatto perché possiamo! ## Perché non Signal? ### Problemi di Signal * Il servizio è centralizzato * Dipende da servizi commerciali (Twilio, Amazon, Google, Apple) * Il client ha dipendenze proprietario (librerie Google) * Moxie ha altre priorità * Non è un *silver bullet* (vedi: trojan di stato) ### La federazione in Signal * Server e client supportano nativamente la federazione * Il servizio è stato federaton con CyanogenMod da dicembre 2013 a gennaio 2016 (WhisperPush) * Moxie: [Reflections: The ecosystem is moving](https://whispersystems.org/blog/the-ecosystem-is-moving/) * Moxie non intende federare * Implementazione parziale nei client non-mobile ## Infrastruttura del servizio ### Lato server: * Signal-Server * Redis, PostgreSQL * Twilio (alternative?) * Servizi Push Google e Apple * Amazon S3 (attachment) * Server STUN/TURN (WebRTC) ### Notifiche e consegna messaggi Da alcuni mesi il client Android funziona senza Google Play Services, mantenendo una connessione (WebSocket) attiva verso il server. L'APK ufficiale contiene comunque le librerie Google. ### Federazione Una rete di server Signal federati è una rete "chiusa", alla IRC, non aperta tipo SMTP o XMPP. Questo ha vantaggi e svantaggi. Un vantaggio: meno problemi di frammentazione. Gli utenti si registrano su uno specifico server, il quale sa che altri utenti esistono e in che server. Fa da relay. ### Liberazione del Server * Servizi push: disabilitati. Le notifiche avvengono solo tramite WebSocket * Endpoint S3 reso configurabile, in modo da poter usare un qualsiasi servizio compatibili con S3 * Server STUN/TURN: CoTURN [https://github.com/CableIM/Cable-Server](https://github.com/CableIM/Cable-Server) `$ git diff ows/master` ### Liberazione del Client * Rimosse tutte le librerie Google (viene persa la funzione "Send my location") * Modificata la configurazione (URL, certificati) * Tutto il resto funziona, anche le chiamate! * [https://github.com/CableIM/Cable-Android](https://github.com/CableIM/Cable-Android) ### Altre modifiche al client Interfaccia di selezione del server (gine) Default più stringenti ## Configurazione di un server ### Requisiti Serve una macchina (virtuale) dedicata, in quanto alcuni servizi (in particolare i db) sono complessi da rendere sicuri. Serve un IP pubblico, non per forza dedicato. Molta pazienza: non c'è documentazione. Incandenza, HM0x13. ### Server di HacklabBO * Debian Stretch * PostgreSQL 9.6 * Redis * OpenJDK 8 * Cable-Server * S3: Minio ([https://minio.io/](https://minio.io/)) * Apache / nginx * STUN/TURN: CoTURN * Twilio ### Federare due server * L'autenticazione avviene con certificato e password * Le directory di utenti vanno sincronizzate periodicamente * L'implementazione non è raffinata come il resto... * Vedi: [file di configurazione](staging-obfuscated.conf) ## Conclusioni ### TODO * Federare due server * Mailing list di gestione della rete federata * Pubblicare l'app su F-Droid * Documentazione * Fare un'icona decente ### Piani futuri e idee Registrazione con email o con identificativo univoco casuale [https://github.com/WhisperSystems/Signal-Android/issues/1085](https://github.com/WhisperSystems/Signal-Android/issues/1085) Eliminare tutta la parte di telefonia standard e SMS Integrazione con Tor Client per iPhone ### Codice [https://github.com/CableIM/](https://github.com/CableIM/) Signal-Android: GPLv3 Signal-Server: AGPLv3 ### Repository F-Droid [https://fdroid.cable.im/](https://fdroid.cable.im/) Fingerprint: 4C:C3:E0:6E:72:67:4E:77:98:60:0B:AD:1B:92:D7:D6 23:71:07:A9:F4:DD:0A:04:4E:60:5E:CC:01:60:FA:21