Bonjour, Habr!
Aujourd'hui, je vais parler de ce que mes collègues et moi faisons depuis plusieurs mois: les notifications push pour les messageries instantanées mobiles. Comme je l'ai dit, dans notre demande, l'accent est mis sur la sécurité. Par conséquent, nous avons découvert si les notifications push présentent des «faiblesses» et, dans l'affirmative, comment pouvons-nous les mettre à niveau afin d'ajouter cette option utile à notre service.
Je publie une traduction de notre
article avec Medium avec quelques ajouts de moi-même. Il contient les résultats de «l'enquête» et une histoire sur la façon dont le problème a été résolu.
Explorez le matériel
Dans le modèle classique, les notifications push rendent les messagers vulnérables aux attaques MITM (Man-in-the-middle, Man in the Middle). Par exemple, avec Google, Microsoft et dans l'ancienne version d'iMessage, l'application envoie des clés de chiffrement aux serveurs Apple - les utilisateurs sont authentifiés sur le serveur et l'en-tête du message (ou son contenu) est déchiffré.

Par conséquent, il est possible de lire la correspondance en accédant au serveur de notifications push. Et cela signifie que tout cryptage de la correspondance est inutile: les notifications push laisseront toujours une possibilité de lecture par des tiers. Les auteurs de l'article
«Encrypt Wisely» sur Xaker.ru, consacré aux méthodes de chiffrement des messages, ont discuté de cette possibilité plus en détail.
Si vous pensez qu'Apple et les serveurs de Google ne permettront pas une fuite à 100% des clés de chiffrement des utilisateurs, pensez que leurs employés y ont accès. Et les employés sont des gens.
Avec toutes les vulnérabilités du push, de nombreux messagers "sûrs", dont Signal et Telegram, les utilisent. Sinon, les utilisateurs devront surveiller "manuellement" les nouveaux messages en entrant constamment dans l'application. Ce qui est très gênant, et les messagers concurrents bénéficieront d'un avantage.
Paranoïa et bon sens
Dans notre projet, nous avons abordé ce problème il y a plusieurs mois. Nous devions faire des notifications push une option pour être compétitif. Mais en même temps, ne faites pas de trou dans la sécurité, car toute fuite de données saperait la crédibilité du projet.
Cependant, nous avons déjà un avantage important: notre messager est décentralisé (les données sont stockées sur la blockchain), tandis que les employés n'ont pas accès aux comptes. Seuls les utilisateurs ont des clés de chiffrement et les clés publiques de l'interlocuteur sont disponibles sur la blockchain pour se protéger contre les attaques MITM.
Dans la première version du push, nous avons décidé de jouer le plus prudemment possible et de ne pas transmettre du tout le texte du message. Le service push reçu du nœud n'est pas le texte du message, mais seulement un signal sur le fait de sa réception. Par conséquent, l'utilisateur a vu la notification «Un nouveau message est arrivé». Il était possible de le lire uniquement dans le messager.
Comment ça a marché: vidéo .
Après cela, nous avons appris que la dernière version des notifications d'Apple a de nouvelles fonctionnalités de sécurité. Ils ont
publié l' UNNotificationServiceExtension, qui permet aux développeurs d'envoyer des données de notification entièrement cryptées via APNS. Ensuite, l'application sur l'appareil de l'utilisateur final déchiffre (ou télécharge des données supplémentaires) et affiche une notification. Nous l'avons pris comme base de la deuxième version du push.
Nous avons maintenant développé la deuxième version des notifications push pour iOS, qui vous permet d'afficher le texte des messages sans risque pour la sécurité. Dans le nouveau concept, la logique ressemble à ceci:
- Le service push envoie une notification push avec un numéro de transaction (le message crypté peut être très volumineux et la taille des notifications est très limitée)
- Dès réception d'une notification, l'appareil démarre notre NotificationServiceExtension - une micro-application qui demande une transaction au nœud par identifiant, la déchiffre à l'aide de la phrase secrète enregistrée et donne au système une nouvelle notification. La phrase secrète est stockée dans un entrepôt sécurisé.
- Le système affiche une notification avec un message déchiffré ou une traduction.
- Les touches ne vont nulle part, tout comme un message en texte brut. Le service push n'a pas la capacité de décrypter le message.

Nous avons pris cette version comme fonctionnelle et l'avons implémentée dans la dernière mise à jour de l'application iOS.
Les personnes intéressées par le côté technique peuvent voir le code source:
github.com/Adamant-im/adamant-notificationService .