Erste Regel der App-Sicherheit: Jeder Computer, auf den ein Angreifer uneingeschränkten physischen oder elektronischen Zugriff erhält, gehört jetzt Ihrem Angreifer, unabhängig davon, wo er sich tatsächlich befindet oder was Sie dafür bezahlt haben.
Zweite Regel der App-Sicherheit: Jede Software, die die physischen Grenzen verlässt, in die ein Angreifer nicht eindringen kann, gehört jetzt Ihrem Angreifer, unabhängig davon, wie viel Zeit Sie mit dem Codieren verbracht haben.
Dritte Regel: Alle Informationen, die dieselben physischen Grenzen verlassen, in die ein Angreifer nicht eindringen kann, gehören jetzt Ihrem Angreifer, egal wie wertvoll sie für Sie sind.
Die Grundlagen der Sicherheit der Informationstechnologie basieren auf diesen drei Grundprinzipien. Der einzige wirklich sichere Computer ist der, der in einem Safe in einem Farraday-Käfig oder in einem Stahlkäfig eingeschlossen ist. Es gibt Computer, die den größten Teil ihrer Lebensdauer in diesem Zustand verbringen. Einmal im Jahr (oder weniger) generieren sie die privaten Schlüssel für vertrauenswürdige Root-Zertifizierungsstellen (vor einer Vielzahl von Zeugen mit Kameras, die jeden Zentimeter des Raums aufzeichnen, in dem sie sich befinden).
In diesen Umgebungen werden die meisten Computer nicht mehr verwendet. Sie sind physisch im Freien und über einen drahtlosen Funkkanal mit dem Internet verbunden. Kurz gesagt, sie sind anfällig, ebenso wie ihre Software. Ihnen ist daher nicht zu trauen. Es gibt bestimmte Dinge, die Computer und ihre Software wissen oder tun müssen, um nützlich zu sein, aber es muss darauf geachtet werden, dass sie niemals genug wissen oder tun können, um Schäden zu verursachen (zumindest keine dauerhaften Schäden außerhalb der Grenzen dieser einzelnen Maschine) ).
Du wusstest das alles schon; Aus diesem Grund versuchen Sie, den Code Ihrer Anwendung zu schützen. Aber darin liegt das erste Problem; Verschleierungswerkzeuge können den Code zu einem Chaos für einen Menschen machen, der versucht, ihn zu durchsuchen, aber das Programm muss noch ausgeführt werden. Das bedeutet, dass der tatsächliche Logikfluss der App und die von ihr verwendeten Daten von der Verschleierung nicht betroffen sind. Bei ein wenig Hartnäckigkeit kann ein Angreifer den Code einfach verschleiern, und dies ist in bestimmten Fällen nicht einmal erforderlich, in denen das, was er betrachtet, nichts anderes sein kann als das, wonach er sucht.
Stattdessen sollten Sie versuchen sicherzustellen, dass ein Angreifer mit Ihrem Code nichts anfangen kann, egal wie einfach es für ihn ist, eine eindeutige Kopie davon zu erhalten. Das heißt, keine fest codierten Geheimnisse, da diese Geheimnisse nicht geheim sind, sobald der Code das Gebäude verlässt, in dem Sie ihn entwickelt haben.
Diese von Ihnen fest codierten Schlüsselwerte sollten vollständig aus dem Quellcode der Anwendung entfernt werden. Stattdessen sollten sie sich an einem von drei Orten befinden. flüchtiger Speicher auf dem Gerät, der für einen Angreifer schwieriger (aber immer noch nicht unmöglich) ist, eine Offline-Kopie von zu erhalten; permanent auf dem Servercluster, auf den Sie mit eiserner Faust zugreifen können; oder in einem zweiten Datenspeicher, der nicht mit Ihrem Gerät oder Ihren Servern zusammenhängt, z. B. einer physischen Karte oder in den Speichern Ihres Benutzers (was bedeutet, dass er sich möglicherweise im flüchtigen Speicher befindet, aber nicht lange dauern muss).
Betrachten Sie das folgende Schema. Der Benutzer gibt seine Anmeldeinformationen für die App aus dem Speicher in das Gerät ein. Sie müssen leider darauf vertrauen, dass das Gerät des Benutzers nicht bereits durch einen Keylogger oder Trojaner gefährdet ist. Das Beste, was Sie in dieser Hinsicht tun können, ist die Implementierung einer Multi-Faktor-Sicherheit, indem Sie sich schwer zu fälschende Identifizierungsinformationen über die vom Benutzer verwendeten Geräte (MAC / IP, IMEI usw.) merken und mindestens einen zusätzlichen Kanal bereitstellen Damit kann ein Anmeldeversuch auf einem unbekannten Gerät überprüft werden.
Die eingegebenen Anmeldeinformationen werden von der Client-Software (unter Verwendung eines sicheren Hashs) verschleiert und die Anmeldeinformationen im Klartext verworfen. Sie haben ihren Zweck erfüllt. Die verschleierten Anmeldeinformationen werden über einen sicheren Kanal an den zertifikatsauthentifizierten Server gesendet, der sie erneut hasht , um die Daten zu erstellen, die zur Überprüfung der Gültigkeit der Anmeldung verwendet werden. Auf diese Weise weiß der Client nie, was tatsächlich mit dem Datenbankwert verglichen wird, der App-Server kennt nie die Klartext-Anmeldeinformationen, die hinter dem stehen, was er zur Validierung erhält, der Datenserver weiß nie, wie die Daten, die er zur Validierung speichert, erzeugt werden, und ein Mann in Die Mitte sieht nur Kauderwelsch, selbst wenn der sichere Kanal kompromittiert wurde.
Nach der Überprüfung sendet der Server ein Token über den Kanal zurück. Das Token ist nur innerhalb der sicheren Sitzung nützlich, besteht entweder aus zufälligem Rauschen oder einer verschlüsselten (und damit überprüfbaren) Kopie der Sitzungskennungen, und die Clientanwendung muss dieses Token im Rahmen einer Anforderung auf demselben Kanal an den Server senden etwas zu tun. Die Client-Anwendung wird dies viele Male tun, da sie nichts mit Geld, sensiblen Daten oder anderen Dingen tun kann, die für sich selbst schädlich sein könnten. Stattdessen muss der Server aufgefordert werden, diese Aufgabe auszuführen. Die Clientanwendung schreibt niemals vertrauliche Informationen in den persistenten Speicher des Geräts selbst, zumindest nicht im Klartext. Der Client kann den Server über den sicheren Kanal nach einem symmetrischen Schlüssel fragen, um alle lokalen Daten zu verschlüsseln, an die sich der Server erinnert. In einer späteren Sitzung kann der Client den Server nach demselben Schlüssel fragen, um die Daten für die Verwendung im flüchtigen Speicher zu entschlüsseln. Diese Daten werden auch nicht die einzige Kopie sein. Alles, was der Client speichert, sollte auch in irgendeiner Form an den Server übertragen werden.
Dies macht Ihre Anwendung offensichtlich stark vom Internetzugang abhängig. Das Client-Gerät kann keine seiner Grundfunktionen ausführen, ohne eine ordnungsgemäße Verbindung zum Server und dessen Authentifizierung herzustellen. Eigentlich nicht anders als Facebook.
Nun, der Computer, den der Angreifer haben möchte, ist Ihr Server, denn er und nicht die Client-App / das Client-Gerät können ihm Geld einbringen oder anderen Menschen Schmerzen bereiten. Das ist ok; Sie bekommen viel mehr Geld, wenn Sie Geld und Mühe ausgeben, um den Server zu sichern, als wenn Sie versuchen, alle Clients zu sichern. Der Server kann sich hinter allen Arten von Firewalls und anderen elektronischen Sicherheitsvorkehrungen befinden und kann außerdem physisch hinter Stahl-, Beton-, Schlüsselkarten- / Pin-Zugriff und 24-Stunden-Videoüberwachung gesichert werden. Ihr Angreifer müsste in der Tat sehr ausgefeilt sein, um direkt auf den Server zugreifen zu können, und Sie würden (sollten) sofort davon erfahren.
Das Beste, was ein Angreifer tun kann, ist, das Telefon und die Anmeldeinformationen eines Benutzers zu stehlen und sich mit den eingeschränkten Rechten des Clients beim Server anzumelden. In diesem Fall sollte der legitime Benutzer wie beim Verlust einer Kreditkarte angewiesen werden, eine 800-Nummer anzurufen (vorzugsweise leicht zu merken, und nicht auf der Rückseite einer Karte, die er in seiner Handtasche, Brieftasche oder Aktentasche tragen könnte neben dem mobilen Gerät gestohlen) von jedem Telefon, auf das sie zugreifen können und das sie direkt mit Ihrem Kundendienst verbindet. Sie geben an, dass ihr Telefon gestohlen wurde, geben eine grundlegende eindeutige Kennung an und das Konto ist gesperrt. Alle Transaktionen, die der Angreifer möglicherweise verarbeiten konnte, werden zurückgesetzt, und der Angreifer befindet sich wieder auf dem ersten Platz.