Hallo, Habr!
Heute möchte ich Ihnen von einem Projekt erzählen, an dem mein Team und ich seit mehreren Monaten arbeiten: den Push-Benachrichtigungen für mobile Messenger. Wie bereits erwähnt, legen wir in unserer App großen Wert auf Sicherheit. Daher haben wir untersucht, ob es bei Push-Benachrichtigungen "Schwachstellen" gibt und wenn ja, wie wir diese beheben können, um diese nützliche Funktion in unseren Service aufzunehmen.
Ich veröffentliche die Übersetzung unseres mit einigen Ergänzungen von mir. Darin finden Sie die Ergebnisse unserer "Untersuchung" und wie wir das Problem gelöst haben.
Wir untersuchen die Materie
In der klassischen Modellierung machen Push-Benachrichtigungen Messenger anfällig für MITM-Angriffe (Man-in-the-Middle). Zum Beispiel versenden Google, Microsoft und die alte Version von iMessage Verschlüsselungsschlüssel an die Server von Apple — auf dem Server erfolgt die Authentifizierung der Benutzer und die Entschlüsselung des Nachrichtenheaders (oder seines Inhalts).

Das bedeutet, es besteht die Möglichkeit, auf die Konversation zuzugreifen, wenn man den Server der Push-Benachrichtigungen erreicht. Das heißt, dass jede Verschlüsselung der Konversation nutzlos ist: Push-Benachrichtigungen lassen dennoch die Möglichkeit für Dritte, den Inhalt zu lesen. Diese Möglichkeit wurde ausführlicher von den Autoren des Artikels diskutiert. auf Xaker.ru, das sich mit Methoden zur Nachrichtenverschlüsselung beschäftigt.
Wenn Sie denken, dass die Server von Apple und Google zu 100 % keine Schlüssel für die Benutzerverschlüsselung leaken werden, denken Sie daran, dass ihre Mitarbeiter Zugriff darauf haben. Und Mitarbeiter sind Menschen.
Trotz aller Schwachstellen bei Push-Benachrichtigungen nutzen viele „sichere“ Messenger, einschließlich Signal und Telegram, diese. Andernfalls müssten die Benutzer neue Nachrichten „manuell“ überwachen, indem sie ständig die App öffnen, was sehr unpraktisch ist, und Wettbewerber von Messengern würden einen Vorteil erlangen.
Paranoia und gesunder Menschenverstand
In unserem Projekt haben wir uns vor einigen Monaten intensiv mit dieser Frage beschäftigt. Wir mussten die Funktion von Push-Benachrichtigungen implementieren, um wettbewerbsfähig zu bleiben. Dabei durften wir jedoch kein Sicherheitsrisiko eingehen, denn jede Datenpanne könnte das Vertrauen in das Projekt untergraben.
Wir haben jedoch bereits einen wichtigen Vorteil: Unser Messenger ist dezentralisiert (Daten werden in der Blockchain gespeichert), und Mitarbeiter haben keinen Zugang zu den Konten. Die Verschlüsselungsschlüssel sind nur für die Benutzer zugänglich, während die öffentlichen Schlüssel der Gesprächspartner in der Blockchain verfügbar sind, um vor MITM-Angriffen zu schützen.
In der ersten Version der Push-Benachrichtigungen haben wir uns entschieden, auf Nummer sicher zu gehen und überhaupt keinen Nachrichtentext zu übermitteln. Der Push-Service erhielt von der Node nicht den Text der Nachricht, sondern lediglich das Signal über den Empfang. Daher sah der Benutzer die Benachrichtigung „Eine neue Nachricht ist eingetroffen“. Lesen konnte man sie nur im Messenger.

.
Nach diesem Schritt haben wir erfahren, dass es in der neuesten Version der Benachrichtigungen von Apple neue Schutzmaßnahmen gibt. Diese UNNotificationServiceExtension, die es Entwicklern ermöglicht, vollständig verschlüsselte Benachrichtigungsdaten über APNS zu senden. Anschließend entschlüsselt die Anwendung auf dem Gerät des Endbenutzers (oder lädt zusätzliche Daten herunter) und zeigt die Benachrichtigung an. Diese Grundlage haben wir für die zweite Version der Push-Benachrichtigungen genommen.
Jetzt haben wir die zweite Version der Push-Benachrichtigungen für iOS entwickelt, die es ermöglicht, den Nachrichtentext ohne Sicherheitsbedrohung anzuzeigen. In der neuen Konzeption sieht die Logik folgendermaßen aus:
- Der Push-Service sendet eine Push-Benachrichtigung mit der Transaktionsnummer (die verschlüsselte Nachricht kann sehr groß sein, und die Größe der Benachrichtigungen ist stark begrenzt).
- Das Gerät löst bei Erhalt einer Benachrichtigung unseren NotificationServiceExtension aus – ein Mikro-App, das bei der Node eine Transaktion per ID anfordert, mit dem gespeicherten Passwort entschlüsselt und der Software eine neue Benachrichtigung übergibt. Das Passwort wird in einem sicheren Speicher aufbewahrt.
- Das System zeigt eine Benachrichtigung mit der entschlüsselten Nachricht oder deren Übersetzung an.
- Die Schlüssel verlassen nie das System, ebenso wenig wie die Klartextnachricht. Der Push-Dienst hat keine Möglichkeit, die Nachricht zu entschlüsseln.

Diese Version haben wir als stabil erachtet und mit dem letzten Update der iOS-App implementiert.
Technisch Interessierte können den Quellcode einsehen: .
Quelle: habr.com
