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

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

Heute werden wir über Android-Sicherheit sprechen. Sie können sich das als interessantes Beispiel für ein System vorstellen, das in erster Linie auf Sicherheit ausgelegt ist. Es ist möglich, dass Android-Entwickler im Gegensatz zu vielen der bisher untersuchten Systeme wie Unix oder Webbrowsern, bei denen die Sicherheit in den meisten Fällen nach der Erstellung des Systems „verschraubt“ wurde und sich das Design nicht auf diese Probleme konzentrierte, anfangs sehr interessiert waren besorgt über bestimmte Angriffsklassen und Anwendungskonstrukte.



Sie haben eine bessere Möglichkeit gefunden, Android-Apps zu strukturieren, mit denen wir Sicherheitsrichtlinien besser durchsetzen können. Das Coolste ist, dass dies ein ziemlich weit verbreitetes System ist, im Gegensatz zu einigen Forschungsarbeiten, die nur eine neue Architektur bieten können. Dieses System wird tatsächlich in der Praxis verwendet, und es gibt immer mehr Geräte, die das Android-Betriebssystem verwenden.

Heute werden wir darüber sprechen, wie einige Dinge geklappt haben oder fehlgeschlagen sind. Wir werden überlegen, welche Teile des Designs sie für wichtig hielten und was sie vermissten und was das Ergebnis in der Praxis ist. Das ist ziemlich interessant. In gewisser Weise haben die Entwickler die vorhandenen Systeme verwendet, über die wir gesprochen haben, sodass Android auf UNIX basiert. Tatsächlich ist es nur der Linux-Kernel, der auf dem gesamten Telefon ausgeführt wird.

In vielerlei Hinsicht verwenden sie einige der bekannten Mechanismen, an die Sie sich aus Lab 2 erinnern, wo Sie Benutzer-IDs, Unix-Gruppen und andere Dinge verwendet haben, um Anwendungen voneinander zu trennen. Bei Android haben sie jedoch eine völlig andere Art, Benutzer-IDs und Dateiberechtigungen festzulegen als in einem typischen Linux-System.

Lassen Sie uns zunächst diskutieren, wie stark die Bedrohung hier ist. Was stört diese Leute am Telefon? Was ist hier los? Wovor wollen sie sich schützen? Was ist ein Bedrohungsmodell in einem mobilen Gerät?



Student: Anwendungen, die schädlich sein könnten?

Professor: Ja, sie befürchten, dass die Anwendungen, die auf dem Telefon installiert werden können, böswillig sind. Ich denke, dass es offen gesagt bösartige Anwendungen gibt, mit denen Sie die Kontrolle über Sie erlangen oder Ihre persönlichen Daten stehlen können. Sie sollten sich also um Ihre Daten und um Dinge kümmern, die Geld kosten - SMS-Nachrichten, Telefonanrufe, Internetverbindung und so weiter.

Auf der rechten Seite befinden sich also die Dinge, die Sie auf Ihrem Telefon schützen möchten, und auf der linken Seite befinden sich Dinge, die dazu führen können, dass sie anders funktionieren. Da es bösartige Anwendungen gibt, möchten die Android-Benutzer nicht, dass Benutzer Anwendungen installieren können, die von Entwicklern geschrieben wurden, von denen Google noch nie gehört hat. Darüber hinaus können solche Anwendungen schädlich sein, nicht weil der Entwickler dies wollte, sondern weil er einfach vergessen hat, etwas zu tun. Und es wäre schön, diesen Leuten bei der Erstellung sicherer Anwendungen zu helfen, da der Anwendungsentwickler häufig kein Experte auf dem Gebiet der Sicherheitslücken ist, die dann von einem Angreifer in seiner Anwendung verwendet werden können.



Da Android weit verbreitet ist, können wir Schwachstellenberichte anzeigen. Es gibt eine CVE-Datenbank, die viele Schwachstellen in Betriebssystemen katalogisiert, und das ist tatsächlich interessant. Natürlich gibt es dort Android-Fehlermeldungen, von denen Sie viele in Vorträgen kennengelernt haben. Pufferüberläufe sind in einigen Teilen von Android immer noch möglich, es gibt eine schlechte Auswahl an Standard-Kryptosystemen, die Leute vergessen, den Zufallszahlengenerator zu initialisieren und vorhersagbare Schlüssel zu erstellen. All dies geschieht immer noch, da die Software vor keinem der bekannten Probleme sicher ist.

Das Interessante ist, dass diese Probleme anscheinend isoliert sind und von Zeit zu Zeit auftreten. Im Großen und Ganzen können sie beseitigt werden, und das System bleibt nach Behebung dieser Fehler ziemlich sicher. Das Android-Design funktioniert also in vielerlei Hinsicht recht gut. Daher werden wir später genauer untersuchen, welche Teile des Entwurfs besser und welche schlechter funktionieren. Im Allgemeinen ist dies jedoch eine ziemlich durchdachte Softwarelösung oder zumindest durchdachter als die Desktop-Unix-Anwendungen, die Sie bisher gesehen haben.

Eine Möglichkeit, herauszufinden, wie Sie Daten und verschiedene Dienste, die Sie Geld kosten können, vor schädlichen Anwendungen schützen können, besteht darin, zunächst zu verstehen, wie die Anwendung für das Android-System aussieht. Anschließend wird erläutert, wie verschiedene Berechtigungen oder Berechtigungen in dieser Anwendung konfiguriert und angewendet werden. Android-Anwendungen unterscheiden sich stark von dem, was Sie bisher in Desktop-Anwendungen oder Internet-Anwendungen gesehen haben.

Anstatt den unteilbaren Teil des Codes mit der Hauptfunktion zu komponieren, die Sie ausführen möchten, sind Android-Anwendungen modularer. Bei Verwendung von Android können Sie eine Anwendung als eine Reihe von Komponenten präsentieren. Der Vorlesungsartikel beschreibt 4 Arten von Komponenten, die das Android-Framework dem Entwickler zur Verfügung stellt. Die erste Komponente ist Aktivität oder Aktivität. Dies ist eine Sache, die die Benutzeroberfläche darstellt und es dem Benutzer ermöglicht, mit der Anwendung zu interagieren, Informationen für ihn anzuzeigen und Tastenanschläge von ihm zu erhalten usw.

Aus Sicherheitsgründen hat Aktivität eine interessante Eigenschaft: Benutzereingaben werden jeweils auf eine Aktion reduziert. Das Android-Framework garantiert tatsächlich, dass jeweils nur eine Art von Aktivität möglich ist. Wenn Sie also eine Bankanwendung ausführen, funktioniert im Hintergrund keine Anwendung, um den PIN-Code der Bankanwendung durch Touch-Klicks abzufangen. Das Framework sieht daher die Verwendung einiger Sicherheitsfunktionen für Benutzereingaben vor. Aktivität ist somit eine Komponente der Benutzeroberfläche.

Drei weitere Arten von Komponenten unterstützen die Anwendungslogik bei der Interaktion mit anderen Komponenten. Die zweite Komponente heißt also Service oder Service. Diese Dinge funktionieren im Hintergrund. Beispielsweise haben Sie möglicherweise einen Dienst, der Ihren Standort verfolgt, wie in der Anwendung, die diese Typen im Artikel beschreiben. Möglicherweise verfügen Sie über Dienste, die im Hintergrund Informationen aus dem Netzwerk abrufen usw.
Die dritte Komponente ist die Komponente des Inhaltsanbieters, des Inhaltsanbieters. Es kann als SQL-Datenbank dargestellt werden, in der Sie mehrere Tabellen mit einem Schema usw. definieren können. Sie können mit allen in dieser Anwendung gespeicherten Daten auf SQL-Abfragen zugreifen. Mit dieser Komponente können Sie den Zugriff auf die Datenbank steuern und angeben, wer darauf zugreifen darf.
In „Android“ gibt es noch etwas Ungewöhnliches, das es in anderen Systemen nicht gibt. Dies ist die vierte Komponente - Rundfunkempfänger oder Rundfunkempfänger. Es wird verwendet, um Nachrichten von anderen Teilen des Systems zu empfangen. Daher werden wir darüber sprechen, wie Anwendungen in Bezug auf Nachrichten miteinander interagieren.



Dies ist also eine sehr logische Vorstellung davon, was Android-Anwendungen sind. In Wirklichkeit sind dies jedoch nur Java-Klassen oder Java-Code, der von einem Entwickler geschrieben wurde.

Es gibt nur eine bestimmte Standardschnittstelle, die Sie für Aktivitäten, Dienste, den Rundfunkempfänger und den Inhaltsanbieter implementieren, und es ist klar, dass dies nur Java-Code ist. Alle im Rechteck platzierten Komponenten sind nur eine Java-Laufzeit, die auf Ihrem Telefon ausgeführt wird. Es handelt sich lediglich um einen einzelnen Linux-Kernelprozess, der auf Ihrem Telefon ausgeführt wird. Alle diese Komponenten sind verschiedene Klassen oder Codeteile, die im Java-Laufzeitprozess ausgeführt werden. Hier erfahren Sie, wie es auf traditionelle, für Sie verständlichere Prozesse reduziert werden kann.

Eine andere Sache, die mit der Anwendung interagiert, wird als Manifest bezeichnet. Der Code für alle Komponenten wird vom Anwendungsentwickler geschrieben oder kompiliert. Daneben gibt es jedoch auch ein Manifest im System, das sich außerhalb der Anwendungskomponenten befindet. Es handelt sich um Text oder eine XML-Datei, die alle diese Komponenten beschreibt und beschreibt, wie andere Teile des Systems mit den Komponenten dieser Anwendung interagieren sollen.



Dieses Manifest spricht insbesondere von den sogenannten Lables-Labels, über die wir in einer Sekunde sprechen werden, die die Berechtigungen dieser Anwendung in Bezug auf das, was sie tun darf, und auch die Einschränkungen bestimmen, wer sonst mit verschiedenen Komponenten davon interagieren kann Anwendungen. Möchten Sie fragen, wie es funktioniert?

Student: Ist das Etikett etwas, das definiert, dass diese Anwendung keinen Anruf tätigen kann oder dass diese Anwendung eine Nachricht senden kann?

Professor: Ja, diese Zeichen legen fest, ob diese Anwendung einen Anruf tätigen, SMS senden oder das Internet nutzen kann. Es gibt zwei Arten von Etiketten, ich werde sie hier zeichnen. Jede Anwendung verfügt über eine Liste von Beschriftungen, die die Berechtigungen der Anwendung beschreiben. Dies ist so etwas wie die Berechtigung, eine Telefonnummer zu wählen, die Internetverbindung zu aktivieren und so weiter. Später werde ich Ihnen sagen, wie sie funktionieren.

Dies sind also die Berechtigungen, über die die Anwendung verfügt. Darüber hinaus können Sie einzelnen Komponenten Beschriftungen hinzufügen, die dort eine andere Bedeutung haben - dies sind Berechtigungen für eine bestimmte Anwendung. Wenn Sie eine Komponente mit einer Beschriftung haben, muss für die Interaktion mit jeder anderen Komponente auch eine entsprechende Beschriftung vorhanden sein.
Beispielsweise verfügen Sie möglicherweise über ein Tag mit der Berechtigung "Freunde anzeigen", mit dem Sie den Standort Ihrer Freunde anzeigen können. Dies ist ein Privileg, über das eine Anwendung möglicherweise verfügt. Um dieses Privileg sicherzustellen, müssen Sie dieses Etikett an eine bestimmte Komponente anhängen, in diesem Fall an die Content Provider-Komponente, an deren Datenbank, in der Informationen zum Standort Ihrer Freunde enthalten sind. Und jetzt muss jeder, der auf diese Datenbank zugreifen möchte, die gleiche Bezeichnung in seinen Berechtigungen haben.



So legen Sie Berechtigungen fest. Sie können es sich unter Unix als Benutzer-IDs oder Gruppen-IDs vorstellen, mit Ausnahme von beliebigen Zeichenfolgen, die sie etwas flexibler machen. Das heißt, Ihnen werden diese IDs nie ausgehen und Sie müssen sich keine Sorgen machen, dass jemand sie vermisst.

Es stellt sich heraus, dass die Entwickler von Android den Umfang dieser Labels nicht besonders sorgfältig festgelegt haben. Sie können zwei Anwendungen verwenden, die dasselbe beschriften. Somit werden diese Bezeichnungen teilweise von der Anwendung definiert. Angenommen, Sie haben zwei Anwendungen auf Ihrem Telefon - Facebook und Google+. Beide erklären, dass sie eine neue Berechtigungszeile für die Funktion "Freunde anzeigen" im sozialen Netzwerk wünschen. Sie sagen: "Kein Problem, das ist die gleiche Zeile."

In Wirklichkeit ist diese Zeile mit der Etikettenliste natürlich viel länger als ich gezeichnet habe. Es gibt eine Domäne im Java-Anwendungsstil, die den Kleinbuchstaben des Labels definiert. Die von mir gemalte DIALPERM-Aufrufberechtigung sieht beispielsweise wie folgt aus: com.google.android.dialperm. Aber grob gesagt sind dies die Zeilen, die in Berechtigungen erscheinen. Wenn Sie also gut gemeinte Anwendungen haben, stehen diese nicht in Konflikt mit diesen Berechtigungszeilen.

Es stellt sich jedoch heraus, dass im Android-Betriebssystem leider nichts die Anwendung zu einem solchen Verhalten zwingt, was zu potenziellen Problemen führt. Ich weiß nicht, warum sie nicht repariert wurden. Wir werden sehen, was passiert, wenn zwei Anwendungen mit Markennamen in Konflikt stehen.

So sieht die Anwendung aus: Es handelt sich um eine Reihe von Java-Programmen, die Komponenten bilden, ein Manifest, das die Berechtigungen für Anwendungen beschreibt, und die erforderlichen Einschränkungen für alle Komponenten. Die Interaktion zwischen den Anwendungen erfolgt mit dem von den Entwicklern von Android erfundenen Objekt Intent - Intention. Absicht ist eine strukturierte Nachricht, und in einer Sekunde werden wir sehen, wie sie verwendet wird. Im Moment möchte ich sagen, dass Intent drei wichtige Dinge hat. Natürlich enthält die Absicht andere Felder, aber das Wichtigste ist der Name der Komponentenkomponente, an die Sie eine Nachricht senden möchten. Darauf folgt die Aktion Aktion, die die Komponente ausführen muss, und die Datendaten zusammen mit dem MIME-Typ, den Sie an die andere Komponente senden möchten.



Als abstraktes Beispiel können Sie sich vorstellen, dass diese Komponente com.android.dialer / Dial lautet. So wird der Name der Komponente in Android angegeben. Dies ist eine Art Java-Domänenname. Com.android.dialer ist also der Name der gesamten Anwendung, an die Sie die Absicht senden möchten, und durch einen Schrägstrich schreiben Sie den Namen der Komponente der Zielanwendung, an die Sie diese Nachricht senden - / Dial. Auf diese Weise benennen Sie die spezifische Komponente, an die die Nachricht adressiert ist. Aktion stellt eine bestimmte Reihe von Aktionen dar, die wie android.intend.Dial aussehen können.

Dies ist eine vordefinierte Zeichenfolge, die Anwendungen in das Aktionsfeld Aktion einfügen, wenn der Telefonwähler eine bestimmte Nummer anrufen soll. Wenn Sie beispielsweise ein Dokument auf dem Telefon anzeigen möchten, fügen Sie im Feld Aktion eine Aktionszeile wie android.intend.ViewDoc ein. Dies teilt der empfangenden Komponente mit, dass Sie sich nur den angerufenen Kontakt ansehen möchten, bevor Sie seine Telefonnummer wählen.
Schließlich sind die Datendaten im Grunde eine beliebige URL oder die URL der Daten, die Sie mit dieser Nachricht senden möchten. Dies kann eine Telefonnummer oder eine HTTP-URL sein, die Sie anzeigen oder öffnen möchten, oder andere Anwendungen, die durch eine URL im System angezeigt werden.



Auf diese Weise senden Sie Nachrichten, die über das System gesendet werden, mithilfe der Android-Laufzeit selbst, die sich unter all diesen Anwendungen befindet. Somit kann die Android-Laufzeit als Kreuzung zwischen Anwendungen und dem Kernel wahrgenommen werden. Dies ist nicht ganz richtig, aber wir werden versuchen, ein Bild zu zeichnen, um zu verdeutlichen, wie die Architektur dieser Sache aussieht.

Angenommen, wir haben eine Anwendung, die auf Android ausgeführt wird, und eine andere Anwendung. Diese Rechtecke sind App1 und App2, und jedes repräsentiert das, was im oberen Bild gezeigt wird - Komponenten, Manifest, Beschriftungen.



Dies sind alles Prozesse, die auf dem Linux-Kernel ausgeführt werden, wodurch ein gewisses Maß an Isolation zwischen Anwendungen gewährleistet wird. Es gibt auch das, was der Vorlesungsartikel den Referenzmonitor nennt. Er wird alle absichtlichen Interaktionen zwischen verschiedenen Anwendungen vermitteln. Wenn Anhang 1 eine Nachricht an Anhang 2 senden möchte, sendet er daher zuerst eine Nachricht an den Verbindungsmonitor.
Wenn Sie also alle Absichtsabsichten an Android senden, erstellen Sie eine dieser Absichtsnachrichten und leiten sie über einen Kanal an diesen Referenzmonitor weiter.



Das Android-System verfügt über eine eigene Implementierung von Kanälen zum Senden solcher Absichten, die als Binder oder Bundle bezeichnet wird. Jede Android-Anwendung wird nach Vereinbarung Binder öffnen und eine Verbindung zu einem Link-Monitor herstellen, damit sie Absichten von dieser Anwendung empfangen und Nachrichten an diese Anwendung senden kann.

In unserem Fall, wenn Anhang 1 Absicht für Anhang 2 in den Verbindungsmonitor schreibt, findet der Verbindungsmonitor zuerst heraus, wohin diese Absicht gehen soll, und sendet sie dann an Anhang 2. Dann kann Anhang 2 eine Aktion auslösen, eine Nachricht empfangen oder eine Anforderung ausführen SQL für Anwendung 1.



: – Reference Monitor?

: , — , . , , , RM, ? ? , 1. ?

: , - , , .

: , . , , , . , , . . , 2?

: , PKI. .

: , , . , , , , RM , App 1. PKI . . , , , . , , . , ?

: , , .

: . , «» , . , , , . , Labels. ?

: , , . , , , , « ».

: , , . , RM , . , - . .

, 2 , . – , . , , , . .

, . , . — , , . , , , . , , - .

Android , , , , . , , , «» . , Google Voice, VoIP, Skype , . : « , - ». , , — , PDF JPEG .



. , PDF , , . RM .

: « , , , , ». , , .

: ?

: . , , . , , . , , .

Android RPC. , , Bind intent, , : « ». , , .



, - , , Bind intent.

: , ?

: , 2. , , 2. , - .

, 2 bind, - , . , , .



, , , , Service, . , , .
: , , . , .

: , , , . . , bind. RPC , .

, . , , RM . , RPC , , , , , RPC .

, , RPC, RPC, RPC .

27:40

MIT « ». 20: « », 2


.

, . ? ? , 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 x Intel Dodeca-Core Xeon E5-2650v4 128 GB DDR4 6 x 480 GB SSD 1 Gbit / s 100 TV ab 249 US-Dollar in den Niederlanden und den USA! Lesen Sie mehr über den Aufbau eines Infrastrukturgebäudes. Klasse mit Dell R730xd E5-2650 v4 Servern für 9.000 Euro für einen Cent?

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


All Articles