Sichere iPhone App ↔ Serverkommunikation


14

Was wäre der beste Ansatz, um eine private Kommunikation zwischen meiner iOS-App und ihrer Serverkomponente zu erreichen? Ist es ausreichend, einen einzigen unveränderlichen „geheimen Schlüssel“ in der App-Quelle zu haben, oder muss ich irgendwie Generationen solcher „Handshake“ -Schlüssel dynamisch einrichten?

Der Server selbst hat keinen Zugriff auf vertrauliche Daten. Selbst wenn der Benutzer auf einige private Endpunkte zugreift, werden diese nicht weitergeleitet, aber ich möchte, dass diese vor der Öffentlichkeit verborgen bleiben. Grundsätzlich möchte ich alle Anfragen, die auf bestimmte Routen treffen, ignorieren, es sei denn, sie stammen von meiner iOS-App.

Die Serverkomponente wird auf RoR ausgeführt, sofern dies wichtig ist.

Antworten:


8

Sie können Verbindungen nur dann effektiv ablehnen, wenn Sie jedem Kunden einen privaten Schlüssel zur Verfügung stellen, den Sie individuell widerrufen können. Aber das ist wahrscheinlich übertrieben. Sie brauchen keine kugelsichere Lösung, wenn sich die meisten Leute nicht die Mühe machen, eine Kugel abzufeuern.

Es ist eine Sicherheitsfrage. Beschreiben wir also ein Bedrohungsmodell und Strategien zur Schadensbegrenzung.

Angenommen, Sie haben einen URL-Treffer, der für Sie spürbare Kosten verursachen kann (z. B. Verarbeitungskosten), und Sie möchten ihn sowohl vor einem einfachen DoS-Angriff als auch vor Nachahmer-Apps schützen.

Verwenden Sie SSL, um zu verhindern, dass die Verbindung einfach analysiert wird. Verwenden Sie eine nicht eindeutige Portnummer, eine Weiterleitungssequenz und einen Cookie-Austausch, um die Verbindung zu vereinfachen, bevor Sie den kostspieligen Teil der Anforderung ausführen. Verwenden Sie einen in Ihre App eingebauten Geheimcode, um dem Server mitzuteilen, dass er die Verbindung akzeptieren muss.

Jetzt kann niemand mehr die teuerste URL erlernen, indem er einfach einen Paket-Sniffer ausführt oder sich URL-ähnliche Zeichenfolgen in Ihrem Code ansieht. Ein potenzieller Angreifer muss Ihre App dekompilieren.

Sie können Ihren Code nicht wirklich davor schützen, dekompiliert und / oder unter einem Debugger ausgeführt zu werden. Der Angreifer lernt schließlich den geheimen Schlüssel und die Verbindungssequenz.

Sie bemerken, dass Sie unter Ihrer teuren URL Rouge-Anfragen erhalten: entweder in Form eines Angriffs oder in Form einer Nachahmer-App, die auf Ihren Dienst zugreifen muss, um ausgeführt zu werden, oder dass ein Exploit-Code öffentlich veröffentlicht wird. Sie können jedoch eine unechte Anfrage nicht von einer legitimen Anfrage unterscheiden.

Erstellen Sie ein kostenloses kleines Update für Ihre App mit einem anderen geheimen Schlüssel. Es sollte eine andere kostenintensive URL gefunden werden, die dieselben Daten wie die gefährdete kostenintensive URL enthält. Machen Sie die beiden URLs für einige Zeit zugänglich.

Beobachten Sie, wie Ihre Benutzerbasis auf die aktualisierte Version umschaltet. Drossle die kompromittierte teure URL und 404 es schließlich. Sie haben gerade eine Sicherheitslücke geschlossen, hoffentlich ohne zu viel zu verlieren. Zurück zu Punkt eins.

Haftungsausschluss: Ich bin kein Sicherheitsexperte.


Wenn der Benutzer die App hat, kann er kostspielige URLs auch über SSL ermitteln (der Client hat die volle Kontrolle über Zertifikate usw.). Dies lässt den Rest des Arguments außer Acht, um nicht zu erwähnen, dass dies das klassische Beispiel gegen Sicherheit durch Dunkelheit ist.
Aleemb

@aleemb: Auf jeden Fall können Sie die teure URL nicht vollständig geheim halten. Ein entschlossener Angreifer wird es entdecken. Der Punkt ist, diese Entdeckung auch kostspielig zu machen, so dass ein "Drehbuchkind" harte (er) Zeit und somit weniger Anreiz haben würde, sie auszugraben und auszunutzen und die Minderung zu ermöglichen. Wenn die Kosten für Ihre Schadensbegrenzung angemessen niedrig sind und die Kosten für die Entdeckung für den Angreifer im Vergleich zu den Gewinnen, die der Angreifer aus der Verwendung der kostspieligen URL ziehen kann, hoch sind, wird der Angriff sinnlos. Dies ist wiederum keine strenge Sicherheit.
9000

5

Sie haben ein klassisches Problem , das wirklich nicht gelöst werden kann.

Um sicherzustellen , dass einfache Privatsphäre (dh sicherstellen , dass Ihre Daten nicht im Transit geschnüffelt oder geändert werden) können Sie alles über SSL tun und geben Sie Ihren Server ein ordnungsgemäß ausgestellte Zertifikat von einer Zertifizierungsstelle, dass das iPhone erkennt.

Für die Autorisierung gibt es jedoch keine gute Lösung, die zu 100% garantiert, dass nur Ihre App auf die API zugreifen kann. Ihre vorgeschlagene Lösung würde funktionieren, außer:

  • Jeder, der Ihre App heruntergeladen hat, muss den privaten Schlüssel in seinem Besitz haben
  • Wenn sie es irgendwie schaffen, Ihre App zu entpacken und zu dekompilieren, haben sie den privaten Schlüssel im Klartext
  • Sobald sie den privaten Schlüssel im Klartext haben, können sie damit ihre eigenen böswilligen Anfragen signieren.

Daran führt kein Weg vorbei. Das heißt nicht, dass Sie diesen Ansatz nicht anwenden können, aber Sie müssen verstehen, dass er nicht narrensicher ist. Es ist genau dieses Problem, das DRM völlig unwirksam macht .


0

Dafür gibt es TLS und SSL . Entweder kann eine sichere Verbindung hergestellt werden, ohne dass ein fester geheimer Schlüssel erforderlich ist. Lesen Sie den Abschnitt Beschreibung auf der verlinkten Seite, um zu erfahren, wie sie dies tun.

Ein effektiver Weg, um TLS / SSL zu nutzen, ohne viel (irgendeinen) Aufwand zu betreiben, besteht darin, dass Ihr Server einen Webdienst implementiert, auf den der Client über das HTTPS-Protokoll zugreift. HTTPS ist nur HTTP über eine sichere Verbindung, und das URL-Ladesystem in iOS implementiert es für Sie.


Während HTTPS die Kommunikation vor dem Abhören verbirgt, verhindert es nicht, dass zufällige Clients eine Verbindung zu einem Endpunkt herstellen, es sei denn, der Server benötigt ein Client-Zertifikat. Dies kann in die App 'eingebunden' werden und erfordert etwas Wissen, um es zu extrahieren.
9000,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.