Ciao, Habr!
Oggi parlerò di ciò che io e i miei colleghi stiamo facendo da diversi mesi: le notifiche push per i messaggi mobili. Come già detto, nella nostra applicazione si pone grande attenzione alla sicurezza. Pertanto, abbiamo cercato di capire se le notifiche push hanno "debolezze" e, in caso affermativo, come possiamo mitigarle per aggiungere questa funzionalità utile al nostro servizio.
Pubblico la traduzione del nostro con alcune aggiunte personali. In esso ci sono i risultati dell'indagine e una spiegazione di come abbiamo risolto il problema.
Esploriamo la materia
Nella versione classica, le notifiche push rendono i messaggeri vulnerabili agli attacchi MITM (Man-in-the-middle, "Uomo nel mezzo"). Ad esempio, Google, Microsoft e la vecchia versione di iMessage inviano le chiavi di crittografia ai server Apple – sul server avviene l'autenticazione degli utenti e la decrittazione dell'intestazione del messaggio (o del suo contenuto).

Di conseguenza, c'è la possibilità di leggere le conversazioni accedendo al server delle notifiche push. Questo significa che qualsiasi crittografia delle conversazioni è inutile: le notifiche push lasceranno comunque la possibilità di lettura a terzi. Gli autori dell'articolo su Xaker.ru, dedicato ai metodi di crittografia dei messaggi, hanno discusso questa possibilità più dettagliatamente.
Se pensate che i server Apple e Google non permetteranno mai la fuga di chiavi di crittografia degli utenti, riflettete sul fatto che i loro dipendenti hanno accesso a questi server. E i dipendenti sono persone.
Nonostante tutte le vulnerabilità delle notifiche push, molti messaggeri "sicuri", tra cui Signal e Telegram, le utilizzano. Altrimenti, gli utenti sarebbero costretti a monitorare manualmente i nuovi messaggi, controllando continuamente l'app. Questo è piuttosto scomodo, e i messaggeri concorrenti avrebbero un vantaggio.
Paranoia e buon senso
Nel nostro progetto ci siamo dedicati a questo problema un paio di mesi fa. Avevamo bisogno di creare un'opzione per le notifiche push per essere competitivi. Ma allo stesso tempo, non possiamo lasciarci sfuggire la sicurezza, perché qualsiasi fuga di dati compromettersi la fiducia nel progetto.
Tuttavia, abbiamo già un'importante vantaggio: il nostro messaggero è decentralizzato (i dati sono archiviati nella blockchain), e i dipendenti non hanno accesso agli account. Le chiavi di crittografia appartengono solo agli utenti, e le chiavi pubbliche dei contatti sono disponibili nella blockchain, per proteggere contro gli attacchi MITM.
Nella prima versione delle notifiche push abbiamo deciso di essere estremamente cauti e non trasmettere affatto il testo del messaggio. Il servizio di push riceveva dalla nodo solo un segnale sul fatto che il messaggio fosse stato ricevuto. Pertanto, l'utente vedeva la notifica “È arrivato un nuovo messaggio”. Era possibile leggerlo solo all'interno del messenger.

.
Dopo abbiamo scoperto che nell'ultima versione delle notifiche di Apple ci sono nuovi elementi di sicurezza. Essi UNNotificationServiceExtension, che consente agli sviluppatori di inviare dati delle notifiche completamente crittografati tramite APNS. Successivamente, l'applicazione sul dispositivo dell'utente finale esegue la decrittazione (o scarica dati aggiuntivi) e mostra la notifica. Questa è stata la base per la seconda versione delle notifiche push.
Ora abbiamo sviluppato la seconda versione delle notifiche push per iOS, che consente di visualizzare il testo del messaggio senza compromettere la sicurezza. Nella nuova concezione, la logica è la seguente:
- Il servizio di push invia una notifica push con il numero della transazione (il messaggio crittografato può essere molto grande e la dimensione delle notifiche è molto limitata)
- Il dispositivo, al ricevimento della notifica, attiva il nostro NotificationServiceExtension — un microapplicazione che richiede dalla nodo la transazione per id, la decrittografa usando la passphrase memorizzata e restituisce al sistema una nuova notifica. La passphrase è conservata in un archivio sicuro.
- Il sistema mostra una notifica con il messaggio decrittografato o la traduzione.
- Le chiavi non lasciano mai il sistema, così come il messaggio in chiaro. Il servizio di push non ha la possibilità di decrittografare il messaggio.

Questa versione l'abbiamo accettata come operativa e implementata nell'ultimo aggiornamento dell'app per iOS.
Coloro che sono interessati agli aspetti tecnici possono guardare il codice sorgente: .
Fonte: habr.com
