MIT-Kurs "Computer Systems Security". Vorlesung 20: Mobiltelefonsicherheit, Teil 2

Massachusetts Institute of Technology. Vorlesung # 6.858. "Sicherheit von Computersystemen." Nikolai Zeldovich, James Mickens. 2014 Jahr


Computer Systems Security ist ein Kurs zur Entwicklung und Implementierung sicherer Computersysteme. Die Vorträge behandeln Bedrohungsmodelle, Angriffe, die die Sicherheit gefährden, und Sicherheitstechniken, die auf jüngsten wissenschaftlichen Arbeiten basieren. Zu den Themen gehören Betriebssystemsicherheit, Funktionen, Informationsflussmanagement, Sprachsicherheit, Netzwerkprotokolle, Hardwaresicherheit und Sicherheit von Webanwendungen.

Vorlesung 1: „Einführung: Bedrohungsmodelle“ Teil 1 / Teil 2 / Teil 3
Vorlesung 2: „Kontrolle von Hackerangriffen“ Teil 1 / Teil 2 / Teil 3
Vorlesung 3: „Pufferüberläufe: Exploits und Schutz“ Teil 1 / Teil 2 / Teil 3
Vorlesung 4: „Trennung von Privilegien“ Teil 1 / Teil 2 / Teil 3
Vorlesung 5: „Woher kommen Sicherheitssysteme?“ Teil 1 / Teil 2
Vorlesung 6: „Chancen“ Teil 1 / Teil 2 / Teil 3
Vorlesung 7: „Native Client Sandbox“ Teil 1 / Teil 2 / Teil 3
Vorlesung 8: „Netzwerksicherheitsmodell“ Teil 1 / Teil 2 / Teil 3
Vorlesung 9: „Sicherheit von Webanwendungen“ Teil 1 / Teil 2 / Teil 3
Vorlesung 10: „Symbolische Ausführung“ Teil 1 / Teil 2 / Teil 3
Vorlesung 11: „Ur / Web-Programmiersprache“ Teil 1 / Teil 2 / Teil 3
Vorlesung 12: Netzwerksicherheit Teil 1 / Teil 2 / Teil 3
Vorlesung 13: „Netzwerkprotokolle“ Teil 1 / Teil 2 / Teil 3
Vorlesung 14: „SSL und HTTPS“ Teil 1 / Teil 2 / Teil 3
Vorlesung 15: „Medizinische Software“ Teil 1 / Teil 2 / Teil 3
Vorlesung 16: „Seitenkanalangriffe“ Teil 1 / Teil 2 / Teil 3
Vorlesung 17: „Benutzerauthentifizierung“ Teil 1 / Teil 2 / Teil 3
Vorlesung 18: „Privates Surfen im Internet“ Teil 1 / Teil 2 / Teil 3
Vorlesung 19: „Anonyme Netzwerke“ Teil 1 / Teil 2 / Teil 3
Vorlesung 20: „Sicherheit von Mobiltelefonen“ Teil 1 / Teil 2 / Teil 3

Bevor wir mit einer detaillierten Überprüfung des Systems beginnen, versuchen wir, eine interessante Sache herauszufinden: Warum haben diese Leute ein völlig neues modulares Design für Android-Anwendungen entwickelt? Es gibt Desktop-Anwendungen, es gibt Webanwendungen, warum mussten sie eine völlig neue Art des Schreibens von Software erfinden? In gewissem Sinne ist dies für den Entwickler verwirrend. Zum Beispiel bin ich es gewohnt, mein kleines Programm in C mit der Hauptfunktion zu schreiben, und jetzt schaue ich es mir an und sage: „Was zur Hölle? Was mache ich mit all dem? Ich muss vier Arten von Komponenten definieren und Absichten senden, anstatt C-Strukturen zu verwenden und Code in regulären Zeilen zu schreiben. “



Was sind die Vor- und Nachteile bestehender Anwendungsmodelle? Wir haben Desktop- und Internetanwendungen. Warum benötigen wir einen dritten Anwendungstyp?
Student: aber das Modell hat sich komplett geändert, oder? Ich denke, Sie sollten Entwicklern von Desktop-Anwendungen weniger vertrauen als Entwicklern von Anwendungen für mobile Geräte. Darüber hinaus haben Sie im Vergleich zur Anzahl der erfahrenen Benutzer von Computeranwendungen mehr erfahrene Benutzer, und sie möchten eine ganze Reihe isolierter Anwendungen voneinander verwenden.

Professor: Möglicherweise. Denken Sie also, dass wir bei Desktop-Anwendungen ihren Entwicklern nicht zu sehr vertrauen sollten?

Student: Natürlich, weil es immer einen erfahreneren Sohn oder Cousin gibt, der Ihnen bei der Lösung von Problemen mit Computerprogrammen hilft, aber beim Telefon sieht es anders aus.

Professor: Es ist natürlich cool, dass Telefone keinen Cousin brauchen, der sich um sie kümmert. Unter Sicherheitsgesichtspunkten weisen Computerprogramme jedoch eine charakteristische Eigenschaft auf: Die Installation einer neuen Anwendung auf einem Computer kann ein ziemlich zeitaufwändiger Prozess sein. Möglicherweise ist dies nicht ganz richtig, da Sie jederzeit auf die ausführbare Datei klicken und die Installation starten können, aber ich glaube nicht, dass Benutzer regelmäßig Desktop-Anwendungen installieren. Schließlich haben Sie in der Regel einen festen Satz von Software, die Sie ausführen.

In diesem Sinne ist eine Besonderheit von Webanwendungen der einfache Start. Sie gehen einfach zur Site und müssen nichts weiter tun, als auf den Link zu klicken. Jetzt befinden Sie sich bereits auf einer neuen Site unter der Kontrolle einer neuen Anwendung. Das ist also eine ziemlich gute Eigenschaft einer Webanwendung.



Ein schlechtes Merkmal von Computeranwendungen ist das Fehlen einer Anwendungsisolation. Möglicherweise liegt dies in gewisser Weise daran, dass Sie bei der Installation einer solchen Anwendung vollständig auf alles vertrauen, was sich auf Ihrem Computer befindet. Tatsächlich gibt es keine Isolation zwischen der Anwendung, die Sie auf Ihrem Laptop installieren, und anderen Programmen oder Daten, die bereits vorhanden sind, während bei der Webanwendung eine angemessene Isolation besteht. Solange Sie der gleichen Ursprungsrichtlinie vertrauen, sind Sie sicher. Daher ist es sicher genug, auf eine beliebige Website zu gehen und deren Anwendung zu verwenden. Wenn diese Anwendung die Schwachstellen in Ihrem Browser nicht ausnutzt, wird der Betrieb von Websites, die in anderen Browser-Registerkarten geöffnet sind, nicht beeinträchtigt.



Webanwendungen scheinen immer noch in einer besseren Position zu sein, da sie einfach zu verwenden und isoliert sind. Warum verwenden diese Leute keine Android-Web-Apps?

Student: Webanwendungen scheinen ein Betriebssystem zu enthalten, dh es gibt beispielsweise ein Firefox-Betriebssystem, bei dem es sich im Wesentlichen um ein mobiles Internet-Betriebssystem handelt.

Professor: sicher. Sie behaupten, dass diese Leute tatsächlich falsch liegen. Sie sollten kein neues Android-Betriebssystem erstellen, sondern einfach einen riesigen Webbrowser für Ihr Telefon erstellen.

Student: Zumindest hat Mozilla gezeigt, dass dies möglich ist.

Professor: Nun, das ist ziemlich fair. Zumindest ist es klüger, Webanwendungen zu erstellen als Desktop-Systeme, zumindest für das Telefon.

Student: Da Sie über eine Webanwendung telefonieren, müssen Sie eine völlig neue API erstellen, um die Webanwendungsoberfläche mit dem Telefon zu kommunizieren.

Professor: sicher. Daher haben Webanwendungen eine Einschränkung, die behoben werden kann: das Fehlen einer API für einige mobile Geräte. Es gibt jedoch weniger solche Anwendungen. Beispielsweise für eine Kamera oder einen GPS-Navigator fügen sie Webanwendungen langsam, aber dennoch die entsprechende Schnittstelle hinzu. In Webanwendungen gibt es jedoch wahrscheinlich noch keine API zum Tätigen von Anrufen, Senden von SMS-Nachrichten und dergleichen.

Ein weiterer Nachteil von Webanwendungen ist die Unfähigkeit, einen eingeschränkten Zugriff auf andere Anwendungen herzustellen. Wir haben über implizite Absichten in Android gesprochen, wo man einfach sagen könnte: „Ich möchte dieses JPEG-Bild sehen, aber wer weiß, welche Anwendung es öffnen wird? Entweder möchte ich diese PDF-Datei anzeigen oder dieses Foto mit meinem Freund teilen, den ich gerade mit meiner Kamera aufgenommen habe, aber ich weiß nicht, welche E-Mail-Anwendung verwendet wird. " Bitten wir also einfach den Link-Monitor, mir ein E-Mail-Programm zu suchen, das dieses Foto senden wird. Auf einem Android-Gerät ist dies einfach, bei Webanwendungen treten jedoch große Schwierigkeiten auf, da jede Interaktion mit einer bestimmten URL verknüpft werden muss.



Wenn Sie also nicht wissen, welchen PDF-Viewer jemand verwendet, wissen Sie nicht, mit welcher URL Sie Ihre Datei anzeigen können.

Student: Vielleicht ist ein Nachteil von Webanwendungen, dass JavaScript sehr schwer zu lesen ist?

Professor: Ja, es ist eine weitere Unannehmlichkeit, dass sie alle in JavaScript geschrieben sind. Möglicherweise ist dies in Bezug auf die Leistung nicht sehr gut, es kann schwierig sein zu verstehen, was das Programm tut, es kann schwierig sein, effizient zu kompilieren und so weiter.

Kommen wir zurück zu Computerprogrammen. Eine nützliche Funktion von Desktop-Anwendungen ist die Möglichkeit, Dateien gemeinsam zu nutzen. Alle Ihre Dateien sind in jeder Anwendung verfügbar, da Sie sie nur freigeben. Auf diese Weise haben Sie einfachen Zugriff auf alle auf dem Computer verfügbaren Daten.



Was in Android etwas schwierig zu implementieren ist, ist in Computeranwendungen einfach zu tun. Wenn ich bei Desktop-Betriebssystemen eine Software kompilieren möchte, führe ich MAKE, GCC und möglicherweise einige andere Programme aus, und alle arbeiten mit demselben C-Quellcode im selben Verzeichnis. Dies ist in Android viel schwieriger, wo die Daten der Hauptanwendung zugeordnet sind, die vom Inhaltsanbieter gespeichert wird. Sie müssen also daran basteln, indem Sie zuerst das Quellcode-Repository verwenden und dann den C-Compiler, das MAKE-Programm, den Assembler und mehr installieren. Es ist viel schwieriger, sie zur Zusammenarbeit zu bewegen.

Dies kann unter Umgehung einiger Einschränkungen von Android erfolgen, ist jedoch auf jeden Fall komplizierter als auf Desktop-Systemen.

Student: Ich denke, dass die Optimierung von Webanwendungen ziemlich schwierig ist, da sie durch die Verwendung von RAM und Rechenleistung begrenzt sind.

Professor: Ja, die Prinzipien zur Optimierung von Webanwendungen und Desktopanwendungen sind unterschiedlich. Ich glaube, dass der Nachteil von Webanwendungen, zumindest zu der Zeit, als sie Android entwarfen, darin bestand, dass das Offline-Starten der Webanwendung sehr schwierig war. Wenn Ihr Telefon ein schwaches Netzwerksignal empfängt, ist es schwierig, einige Anwendungen zu starten, insbesondere wenn einige ihrer Teile aus dem Cache gefallen sind. Ich denke jedoch, wie Sie bemerkt haben, dass Webanwendungen Android zwar langsam „einholen“, indem sie die aktuellen Einschränkungen beseitigen. Es ist daher durchaus möglich, dass Webanwendungen als vernünftiges Modell für die Einführung einer neuen Telefonbetriebsplattform dienen. Aber vor fünf Jahren waren sie dafür nicht gut genug.

Aber trotz der bestehenden Mängel wird es jetzt viel einfacher sein, Webanwendungen in die von Android besetzte Nische zu „schieben“, als ein neues mobiles Betriebssystem von Grund auf neu zu entwickeln. Daher denke ich, dass wir immer noch über die Erfolge von Android sprechen können, obwohl Sie es heute vielleicht vorziehen würden, dies nicht so zu tun.
Ich denke, dass in Bezug auf die Isolation die Sicherheit des Android-Systems viel höher ist. Wie bereits erwähnt, verlässt sich Android auf den Linux-Kernel, um Anwendungen voneinander zu isolieren. Die Android-Plattform legt tatsächlich Benutzer-IDs fest, sodass diese App1 die UID 1001, App 2 die UID 1002 und der Link-Monitor, der normalerweise über Root-Berechtigungen verfügt, die UID 0 hat. Daher ist der Linux-Kernel maßgeblich dafür verantwortlich Trennung von Anwendungen voneinander.



Grundsätzlich erfolgt die Interaktion zwischen Benutzer-IDs durch Absichtsabsichten. Es gibt viel mehr Nuancen darüber, wie der Linux-Kernel Anwendungen mithilfe der UID steuert. Wir werden etwas später darauf eingehen.

Eine interessante Frage: Warum haben sich diese Leute für Java entschieden? Welche Rolle spielt Java in Android? Warum wird es überhaupt gebraucht? Wenn wir alle Anwendungen in C anstelle von Java oder beispielsweise Assembler schreiben, kann dann etwas kaputt gehen?

Schüler: Wenn Sie Schwachstellen haben, kann die Verwendung dieser Sprachen zu einer Verzerrung der für das System wichtigen Indikatoren führen.

Professor: Ja, dies kann passieren, zum Beispiel kann ein Pufferüberlauf in der Anwendung auftreten. Was sonst?

Student: Es kann zu Verwechslungen mit Berechtigungen kommen.

Professor: Mit welchen Berechtigungen?

Student: mit wie Latenz, Latenz.

Professor: Schauen wir uns das genauer an. Wie bereits erwähnt, überprüft der Link-Monitor die Tags für uns und speichert im Android-System eine Liste aller installierten Anwendungen sowie Tags, die all diesen Anwendungen entsprechen. Sie möchten also wahrscheinlich nicht, dass der Link-Monitor Fehler macht, egal in welcher Sprache er geschrieben ist. Ein Link-Monitor in einer typsicheren Sprache ist daher eine gute Lösung. Ich mag Java, weil es eine typsichere Sprache mit guten Funktionen ist. Aber selbst wenn die Anwendung in C geschrieben wurde und Pufferüberläufe darin auftraten, konnte sie die Beschriftungen im Verbindungsmonitor nicht beschädigen. Das wäre also kein großes Problem.

Student: Vielleicht gibt es eine Art System, das den in C geschriebenen Code beschädigen kann?

Professor: Ja, daher wäre es im Prinzip schön, Anwendungen zu vermeiden, die direkt mit dem Linux-Kernel sprechen. In Android ist dies nicht der Fall. Android-Anwendungen können bei Bedarf beliebige Systemaufrufe tätigen. Aus Leistungsgründen können Anwendungen keine beliebigen Komponenten beeinflussen, die in C oder Assembler geschrieben wurden, weshalb einige Spiele in Java "sprechen".

Student: Ich denke, dass dies in gewisser Weise eine Gelegenheit ist, das gesamte für Java geschriebene Material zu verwenden, dh die Entwickler von Android wollten die Erstellung von Anwendungen für Entwickler vereinfachen. Und eine der einfachsten Möglichkeiten, dies zu tun, besteht darin, die umfangreichen Java-Bibliotheken zu nutzen.

Professor: Möglicherweise. Ich denke, einer der Hauptgründe für die Verwendung von Java ist die Benutzerfreundlichkeit. Sie befassten sich wahrscheinlich mehr mit der Programmierung und der einfachen Entwicklung, da Java wenig mit Sicherheit zu tun hat.

Eine andere Sache, die hier einen Platz hat, im Gegensatz zu iPnone. Das iPhone-Betriebssystem ist ebenfalls einfach zu entwickeln, verwendet jedoch C, und wenn Sie es versuchen, können Sie einen Pufferüberlauf verursachen. Darüber hinaus gibt es eine Spezifität für ein bestimmtes Gerät, sodass möglicherweise nicht alle über dieselben Bibliotheken verfügen. Ich denke, dass der Hauptgrund, warum Android-Entwickler sich für Java entschieden haben, darin besteht, dass sie die Eigenschaften der Geräte, auf denen dieses Betriebssystem funktioniert, zunächst nicht kannten. Zum Beispiel wussten die Entwickler des iPhone mit Sicherheit, dass sie einen ARM-Prozessor in ihrem Telefon haben werden, und haben die Software mit diesem speziellen Modell vorkompiliert. Und dieser Ansatz ist effektiver, da der Batterieverbrauch für das Telefon von großer Bedeutung ist.



Die Tatsache, dass die Leute von Android Java verwenden, ist wahrscheinlich weniger effizient in Bezug auf Energieeinsparung oder Prozessorleistung, da es mit der JRE und so weiter zusammenhängt. Aber dann gibt es den Vorteil, das Betriebssystem auf Geräte mit unterschiedlichen Architekturen zu portieren. Wenn Sie Telefone mit MIPS-, ARM- oder x86-Prozessoren haben, kann die Java-Anwendung daher auf allen drei Geräten ausgeführt werden. Android-Entwickler wollten, dass ihre Plattform auf allen Geräten und Telefonen verwendet werden kann. Dies ist wahrscheinlich der Hauptgrund, warum sie die Sicherheit für die Verwendung von Java geopfert haben.

Es stellt sich heraus, dass die Java-Laufzeitumgebung keine besonderen Sicherheitsvorteile für Anwendungen bietet, sondern nur eine praktische Sache für Entwickler und Benutzer ist. Unter dem Gesichtspunkt der Isolation hängt jedoch im Wesentlichen alles vom Kernel und dem Verbindungsmonitor ab, der den Betrieb von Anwendungen steuert.

Student: Führt eine einfache Entwicklung nicht zu einer gewissen Anwendungssicherheit? In der Tat gibt es beim Schreiben eines C-Referenzmonitors viel mehr Möglichkeiten, Fehler zu machen.

Professor: Ja, Sie haben absolut Recht! Eigentlich hätte ich nicht sagen sollen, dass einfache Entwicklung nichts mit Sicherheit zu tun hat. Das ist völlig dumm, weil Sie es so einfach machen wollen, wie den richtigen Code zu schreiben. In gewisser Weise bietet ein System, für das Sie problemlos den richtigen Code schreiben können, mehr Sicherheit. In gewissem Sinne gehen Sie zu Recht davon aus, dass die Android-Entwickler Fehler beim Schreiben von Code vermeiden wollten, sodass Sie ihn nicht in der komplexen C-Sprache schreiben wollten. Und ich weiß nicht, warum Apple bei der Entwicklung seines Betriebssystems C als Programmiersprache gewählt hat.

Da eine solche Auswahl ein Pufferüberlaufproblem in der Anwendung verursacht und diese Anwendung von großer Bedeutung ist, ist sie möglicherweise anfällig. Nicht in Bezug auf die Kompromittierung anderer Anwendungen, aber Sie möchten dennoch nicht, dass Ihre Bankanwendung in C geschrieben wird.



Student: Link Monitor in Java oder C geschrieben?

Professor: In Android ist der Link-Monitor hauptsächlich in Java geschrieben. Es gibt jedoch einige "Hooks", um mit externen Schnittstellen und Anwendungen unter Verwendung von nativem Code zu kommunizieren. Der größte Teil der Logik ist jedoch in Java geschrieben. Das ist also eigentlich ein ziemlich sicherer Plan.

Versuchen wir nun herauszufinden, wofür die Anwendungs-UIDs noch verwendet werden, außer dass Anwendungen in Bezug auf die von ihnen initiierten Prozesse voneinander getrennt werden. Der Hauptgrund für die Verwendung der UID besteht darin, die Möglichkeit zu schaffen, den Zugriff auf gemeinsam genutzte Ressourcen gemeinsam zu nutzen und Daten im System auszutauschen.

Wir haben bereits einen Mechanismus dafür gesehen - das Senden von Absichten an den Verbindungsmonitor. Aber unter Android gibt es Unmengen von Dingen, die nicht mit der Absicht des Link-Monitors erledigt werden. Wahrscheinlich wird aus Leistungsgründen nicht alles über Intent gesendet. Sie möchten den Verbindungsmonitor nicht für jeden Vorgang aufrufen, den Sie auf dem System ausführen. Zunächst geht es um den Zugriff auf das Internet. Wenn Sie auf einem Gerät mit Android auf das Internet zugreifen möchten, öffnen Sie einfach den Socket, genau wie in jeder Standard-Linux-Anwendung. Eine Anwendung kann den Kernel einfach fragen: "Ich benötige einen Socket, weil ich eine Verbindung zu diesem Computer herstellen möchte." Auf diese Weise wird auf das Internet zugegriffen.

Als nächstes sollte der Zugriff auf Wechselmedien vermerkt werden. SD-, . , , , , , . , . , , Android . , , GPS-, .



«» Android, Linux, /dev/camera. Linux, , , . , - , , Java. C Assembler, Linux, . Java , Java-.

: , , - , ?

: , ! , . ? , №2, ID . Android UID GID , . , . , , , - «android.permission.internet», , .



, . , , , . — Linux Android. , - , - , , Linux. Android GID 3003, . , , . , - . Android - , . , GID UID .

SD-. GID, SD-, , . , . , SD- GID SD-.
, , Android.



, , , . , SQL -, , . — UID , , .

, , , GPS, . GID, . , , dev/camera - GID, , , GID .

, , №2, , UID GID , - .

, SD-? , SD-? , SD- , , . ?

: , , , , .

: . , Android , . , SD- . , , SD- . , Android , , , FAT, - . , , - .

: , ?

: , . , , . , , , , . , .



— , , ? , , DIALPERM, INTERNET, FRIENDVIEW?

: , , ?

: , , , . , , . , . Android , iOS, , iPhone , , , SMS-, JPEG . .

– , , . . , Android , , . , - «», , , , , OK. , , .

, , , Android , — , . , , , . Android, 4.3, , , . , . , , , , . , , API, , .

55:10

MIT « ». 20: « », 3


.

, . ? ? , 30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps , .

Dell R730xd 2 ? 2 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! . c Dell R730xd 5-2650 v4 9000 ?

Source: https://habr.com/ru/post/de432618/


All Articles