MIT-Kurs "Computer Systems Security". Vorlesung 21: Datenverfolgung, 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
Vorlesung 21: „Tracking-Daten“ Teil 1 / Teil 2 / Teil 3

Student: Warum ist es einfach unmöglich, den Code zu scannen und nicht manuell zu überprüfen?

Professor: In der Praxis passiert genau das. Entwickler wissen, dass bei jeder Rückgabe des Interpreters bei der Rückgabe des Rückgabewerts ein spezieller Code verwendet wird, der system.arraycopy () automatisch den infizierten Systemwert zuweist, der ihm zugeordnet werden sollte.

Student: Richtig, aber was ist dann der manuelle Teil der Arbeit?

Professor: Der manuelle Teil besteht hauptsächlich darin, herauszufinden, wie die Richtlinien zur Durchführung von Audits aussehen sollten. Mit anderen Worten, wenn Sie sich nur Standard-TaintDroid oder Standard-Android ansehen, werden sie etwas für Sie tun, aber sie werden Taint nicht automatisch auf die richtige Weise zuweisen können. Daher muss jemand manuell eine Verfolgungsrichtlinie zuweisen.



In der Praxis scheint dies kein großes Problem zu sein. Wenn jedoch die Anzahl der Anwendungen, die maschinenorientierte Methoden verwenden, stetig zugenommen hat, können kleine Probleme auftreten.

Eine andere Art von Daten, über die Sie sich bei der Zuweisung einer Infektion Sorgen machen müssen, sind IPC-Nachrichten. IPC-Nachrichten werden im Wesentlichen als Arrays behandelt. Daher wird jede dieser Nachrichten mit einem einzigen gemeinsamen Makel verbunden sein, der die Vereinigung von Infektionen aller seiner Bestandteile darstellt.

Dies trägt zur Systemleistung bei, da für jede dieser Nachrichten nur ein Taint-Tag gespeichert werden muss. Im Extremfall wird der Infektionsgrad einfach neu bewertet, führt jedoch niemals zu einer Verringerung der Sicherheit. Das Schlimmste, was gleichzeitig passieren kann, ist, dass das Netzwerk keine Daten erhält, die ohne gefährliche Konsequenzen für die Privatsphäre dorthin gelangen könnten.

Wenn Sie also eine IPC-Nachricht erstellen, erhält diese den kombinierten Makel. Wenn Sie lesen, was Sie in dieser Nachricht erhalten haben, werden die extrahierten Daten von der Nachricht selbst infiziert, was sinnvoll ist. So werden IPC-Nachrichten behandelt.

Es lohnt sich auch, sich Gedanken darüber zu machen, wie die Datei verarbeitet wird. Daher erhält jede Datei ein Taint-Tag, und dieses Tag wird mit der Datei in ihren Metadaten auf einem stabilen Speichermedium wie einer SD-Speicherkarte gespeichert. Hier findet der gleiche konservative Ansatz zur Infektion statt wie in früheren Fällen. Die Hauptidee ist, dass die Anwendung Zugriff auf einige vertrauliche Daten erhält, z. B. den GPS-Standort, und diese Daten wahrscheinlich in eine Datei schreiben wird. Daher aktualisiert TaintDroid das Taint-Tag dieser Datei mit dem GPS-Flag. Danach wird die Anwendung geschlossen. Später kann eine andere Anwendung enthalten sein, die diese Datei liest.



Wenn er in die virtuelle Maschine und in die Anwendung gelangt, sieht TaintDroid, dass er dieses Flag hat, und daher haben alle Daten, die beim Lesen dieser Datei extrahiert werden, auch dieses GPS-Flag. Ich finde es ziemlich einfach.

Welche Dinge können wir aus Java-Sicht infizieren? Grundsätzlich gibt es fünf Arten von Java-Objekten, die Taint-Flags benötigen. Erstens sind dies lokale Variablen. Lokale Variablen, die in der Methode verwendet werden. Zurück zu den vorherigen Beispielen können wir annehmen, dass char c eine solche Variable ist.

Daher müssen wir diesen Elementen Flags zuweisen. Der zweite Typ sind die Argumente der Method-Methode method, sie müssen auch Infektionsflags haben. Beide Dinge befinden sich auf dem Stapel, daher muss TaintDroid den Zweck der Flags und vieles mehr für diese Art von Objekten verfolgen.
Wir müssen auch Instanzfeldern von Objektinstanzfeldern Flags zuweisen. Stellen Sie sich vor, es gibt ein bestimmtes Objekt C, es ist ein Kreis, und ich möchte seinen Radius kennen. Wir haben also das Feld c.radius, und wir müssen die Infektionsinformationen für jedes dieser Felder zuordnen: mit und Radius.
Der vierte Typ des Java-Objekts sind die statischen Klassenfelder der statischen Klassenfelder, für die ebenfalls fehlerhafte Informationen erforderlich sind. Es kann so etwas wie circle.property sein, dh eine Beschreibung der Eigenschaften des Kreises, für die wir dem Taint einige Informationen zuweisen.

Der fünfte Typ sind Arrays-Arrays, über die wir bereits gesprochen haben, und wir weisen dem gesamten Array eine gemeinsame Infektionsinformation zu.

Die Grundidee beim Implementieren von Taint-Flags für diese Arten von Java-Objekten besteht darin, zu versuchen, Taint-Flags für eine Variable neben der Variablen selbst zu speichern.



Nehmen wir an, wir haben eine ganzzahlige Variable, und wir möchten damit eine Art Verschmutzung verursachen. Wir möchten versuchen, diesen Status so nahe wie möglich an der Variablen zu halten, möglicherweise aus Gründen, um einen effizienten Cache-Betrieb auf Prozessorebene sicherzustellen. Wenn wir uns sehr weit von dieser Variablen entfernt halten, kann dies zu Problemen führen, da der Interpreter, nachdem er den Speicherwert für diese tatsächliche Java-Variable überprüft hat, die Informationen über ihre Infektion so schnell wie möglich kennenlernen möchte.

Wenn wir uns die Move-Op-Operation ansehen, stellen wir fest, dass an diesen Stellen im Code dst und src, wenn der Interpreter die Werte berücksichtigt, auch die entsprechenden Taint-Infektionen berücksichtigt werden.

Wenn Sie diese Dinge so nah wie möglich beieinander platzieren, versuchen Sie, eine effizientere Nutzung des Caches sicherzustellen. Das ist ziemlich einfach. Wenn Sie sich ansehen, was Entwickler für die Argumente der Methoden und lokalen Variablen tun, die auf dem Stapel leben, können Sie sehen, dass sie im Wesentlichen die Taint-Flags neben dem Ort hervorheben, an dem sich die Variablen befinden.

Angenommen, wir haben eine Lieblingssache an unseren Vorlesungen, ein Stapeldiagramm, das Sie wahrscheinlich bald hassen werden, wenn Sie es häufig erwähnen. Lassen Sie die lokale Variable 0 in unserem Stapel liegen, dann speichert TaintDroid ein Tag über die Infektion dieser Variablen direkt darunter im Speicher. Wenn Sie als nächstes eine andere Variable haben, befindet sich deren Tag auch direkt darunter und so weiter. Es ist ziemlich einfach. All diese Dinge befinden sich in derselben Cache-Zeile, wodurch der Zugriff auf den Speicher kostengünstiger wird.



Student: Ich frage mich, wie Sie ein Flag für ein gesamtes Array und verschiedene Flags für jede Eigenschaft eines Objekts haben können. Was ist, wenn eine der Methoden des Objekts auf die in seinen Eigenschaften gespeicherten Daten zugreifen kann? Das wäre ... weißt du was ich meine?

Professor: Fragen Sie nach dem Grund für die Anwendung einer solchen Richtlinie?

Student: Ja, über den Grund für die Verwendung einer solchen Richtlinie.

Professor: Ich denke, dies wird getan, um die Effektivität der Implementierung sicherzustellen. Es gibt wahrscheinlich andere Regeln - zum Beispiel geben sie nicht die Länge des Datenarrays an, da ein Informationsverlust möglich ist, und erweitern daher die Infektion nicht auf diesen Indikator. Daher denke ich, dass einige Entscheidungen nur aus Gründen der Effizienz getroffen werden. Im Prinzip gibt es nichts, was den Zugriff auf jedes Element des Arrays behindern würde, um anzuzeigen, dass das Objekt auf der linken Seite nur von bestimmten Elementen befleckt wird.

Es ist jedoch nicht klar, ob dies korrekt ist, denn wenn Sie anscheinend etwas in das Array einfügen, sollte dieses Ding etwas über dieses Array wissen. Daher denke ich, dass Entwickler eine Kombination beider Richtlinien verwenden. Da Sie zu konservativ sind, sollten Sie nicht zulassen, dass Daten verloren gehen, die Sie schützen möchten. Um jedoch Zugriff auf das Array zu erhalten, müssen Sie etwas darüber wissen. Und wenn Sie etwas über etwas lernen müssen, bedeutet dies normalerweise, dass Sie Taint verwenden.

Dies ist also das Grundschema, mit dem alle diese Informationen nebeneinander gespeichert werden. Man kann sich vorstellen, dass dies auch für Klassenfelder und für Objektfelder geschieht. Wenn Sie eine Klasse deklarieren, haben Sie einen Steckplatzspeicher für eine bestimmte Variable, und direkt neben diesem Steckplatz befinden sich fehlerhafte Informationen für diese Variable. Ich denke, das alles ist ziemlich vernünftig.

Dies ist das Prinzip von TaintDroid. Wenn das System initialisiert wird oder zu anderen Zeiten während des Systembetriebs, überprüft TaintDroid alle Quellen potenziell infizierter Informationen und weist jedem dieser Dinge ein Flag zu - GPS-Sensor, Kamera usw. Während das Programm ausgeführt wird, werden vertrauliche Informationen aus diesen Quellen extrahiert. Anschließend prüft der Interpreter alle Arten von Funktionen gemäß der im Artikel angegebenen Tabelle, um herauszufinden, wie sich eine schädliche Infektion im gesamten System ausbreiten lässt.

Das Interessanteste passiert, wenn Daten versuchen, in das System einzudringen. TaintDroid kann Netzwerkschnittstellen steuern und alles sehen, was versucht, durch sie hindurchzugehen. Er sucht nach Taint-Tags, und wenn die Daten, die versuchen, in das Netzwerk einzudringen, eines oder mehrere dieser Flags haben, ist es ihnen untersagt, das Netzwerk zu verwenden. Was in diesem Moment passiert, hängt tatsächlich von der Anwendung ab.



Beispielsweise kann TaintDroid dem Benutzer eine Warnung anzeigen, die besagt, dass jemand versucht, Daten über seinen Standort an die Seite zu senden. Es ist möglich, dass TaintDroid integrierte Richtlinien enthält, die es der Anwendung ermöglichen, auf das Netzwerk zuzugreifen, aber gleichzeitig alle vertraulichen Daten zurücksetzt, die übertragen werden sollen, und so weiter. In dem Artikel wird dieser Mechanismus nicht ausreichend detailliert beschrieben, da sich die Autoren hauptsächlich mit dem Problem des „Verlusts“ von Daten in das Netzwerk befassten.

In einem Abschnitt des Artikels mit dem Titel „Evaluierung“ werden einige der Aspekte erläutert, die bei der Untersuchung der Funktionsweise des Systems auftreten. Die Autoren des Artikels stellten daher fest, dass Android-Anwendungen versuchen, Daten auf eine Weise zu extrahieren, die für den Benutzer unsichtbar ist. Angenommen, sie versuchen, Ihren Standort für Werbung zu verwenden, senden Ihre Nummer an einen Remote-Server und so weiter. Es ist wichtig zu beachten, dass diese Anwendungen das Android-Sicherheitsmodell in der Regel nicht in dem Sinne „brechen“, dass der Benutzer ihnen den Zugriff auf das Netzwerk oder die Verwendung der Kontaktliste erlauben muss. Die Anwendungen sehen jedoch in der EULA-Lizenzvereinbarung nicht vor, dass sie beabsichtigen, eine Telefonnummer an einen Silk Road 8-Server oder ähnliches zu senden. Tatsächlich ist dies ein Betrug und irreführende Benutzer über die wahren Absichten der Anwendung, denn wenn sie diese EULA-Anforderungen sehen und wissen, womit sie behaftet sind, können sie darüber nachdenken, ob sie eine solche Anwendung auf ihrem Smartphone installieren sollen oder nicht.

Student: Es kann davon ausgegangen werden, dass dies nicht funktioniert, selbst wenn sie diese Anforderungen in die Lizenzvereinbarung aufnehmen, da die Leute normalerweise keine EULA lesen.

Professor: Dies ist eine sehr vernünftige Annahme, da selbst Informatiker die Lizenzvereinbarung nicht immer überprüfen. Eine solche Ehrlichkeit bei EULA wäre jedoch immer noch von Vorteil, da es Leute gibt, die die Lizenzvereinbarung wirklich lesen. Sie gehen jedoch zu Recht davon aus, dass Benutzer nicht eine Reihe von Seiten lesen, die in Kleinbuchstaben geschrieben sind. Klicken Sie einfach auf "Zustimmen" und installieren Sie die Anwendung.

Ich denke also, dass die Regeln für die Weitergabe von Informationen durch das System recht einfach sind. Wie bereits erwähnt, bewegt sich Taint einfach von der rechten Seite zur linken Seite. Manchmal können diese Regeln für die Bewegung des Informationsflusses jedoch zu widersprüchlichen Ergebnissen führen.
Stellen Sie sich vor, eine Anwendung implementiert eine eigene Klasse verknüpfter Listen. Wir haben eine einfache Klasse namens ListNode, sie hat ein Objektfeld für Objektdaten und ein ListNode-nächstes Objekt, das die nächste Liste darstellt.

Angenommen, die Anwendung weist dem Objektdatenfeld infizierte Daten zu - vertrauliche Informationen, die von einem GPS-Sensor oder etwas anderem empfangen wurden. Die Frage ist, wenn wir die Länge dieser Liste berechnen, sollte sie infiziert sein? Sie werden erstaunt sein, dass die Antwort auf die Antwort auf die Frage "Nein" lautet. Dies wird dadurch erklärt, wie TaintDroid und einige dieser Systeme den Informationsfluss bestimmen. Schauen wir uns an, was es bedeutet, einen Knoten zu einer verknüpften Liste hinzuzufügen.

Das Hinzufügen eines Knotens besteht aus 3 Schritten. Als erstes wählen Sie einen neuen Listenknoten aus, der die Daten enthält, die Sie hinzufügen möchten - Alloc ListNode. Der zweite Schritt besteht darin, diesem neuen Knoten ein Datenfeld zuzuweisen. Und das dritte, was Sie tun, ist eine Art Patch für ListNode neben, um die Knoten in einer Liste zusammenzuführen - dies ist der "nächste" ptr-Zeiger.



Interessanterweise bezieht sich der dritte Schritt überhaupt nicht auf das Datenfeld, sondern berücksichtigt nur den nächsten Wert. Sobald die Objektdaten infiziert sind, beginnen wir mit der Berechnung der Länge der Liste, beginnend mit einem Kopfknoten, gehen alle „nächsten“ ptr-Zeiger durch und zählen nur, wie viele Zeiger übergeben wurden. Der Zählalgorithmus berührt also keine infizierten Daten.

Interessanterweise führt dies nicht zur Generierung eines infizierten Werts, wenn Sie eine verknüpfte Liste haben, die mit infizierten Daten gefüllt ist und dann deren Länge berechnet. Dies mag ein wenig unlogisch erscheinen, obwohl wir unter Berücksichtigung von Arrays bereits gesagt haben, dass die Länge des Arrays auch keinen Makel enthält. Es gibt den gleichen Grund. Gegen Ende der Vorlesung werden wir diskutieren, wie Sie eine Sprache verwenden können, mit der Sie als Programmierer Ihre eigenen Infektionsarten bestimmen können, und dann können Sie Ihre eigenen Richtlinien für solche Dinge entwickeln.
Eine gute Funktion von TaintDroid ist, dass Sie als Entwickler nichts kennzeichnen müssen, TaintDroid erledigt dies für Sie. Er notiert alle vertraulichen Dinge, die eine Informationsquelle sein können, und alle Dinge, die eine „Senke“ von Informationen sein können, sodass Sie als Entwickler bereit sind, zu arbeiten. Wenn Sie jedoch das Hinzufügen von Knoten steuern möchten, müssen Sie möglicherweise einige Richtlinien selbst erstellen.
Wie wirkt sich TaintDroid auf die Systemleistung aus? Bestehende Gemeinkosten scheinen eigentlich ziemlich vernünftig zu sein. Der Speicheraufwand besteht darin, alle Infektions-Tags zu speichern. Die Prozessorlast besteht hauptsächlich aus dem Ziel, der Verteilung und der Überprüfung dieser Infektionen, und es sollte beachtet werden, dass die Verwendung der virtuellen Dalvik-Maschine eine zusätzliche Arbeit ist. Wenn wir uns also die Quelle und diese 32-Bit-Infektionsinformationen ansehen, führen wir Operationen aus, die wir bereits in Betracht gezogen haben. Dies ist Rechenaufwand.

Diese Gemeinkosten scheinen ziemlich moderat zu sein. Laut den Autoren des Artikels erfordert das Speichern von Taint-Tags 3% bis 5% zusätzlichen Speicher, das ist also nicht so schlimm. Die Prozessorlast ist etwas höher und kann zwischen 3% und 29% der Rechenleistung erreichen. Dies liegt an der Tatsache, dass der Interpreter bei jeder Ausführung der Schleife diese Tags überprüfen und die entsprechenden Operationen ausführen muss. Obwohl dies nur bitweise Operationen sind, müssen sie ständig ausgeführt werden. Dies ist auch bei einer Auslastung von 29% nicht schlecht, da Entwickler aus dem Silicon Valley ständig darüber sprechen, dass moderne Telefone Quad-Core-Prozessoren benötigen. Das einzige Problem kann mit dem Akku auftreten, denn selbst wenn Sie zusätzliche Prozessorkerne haben, ist es unwahrscheinlich, dass Sie ein heißes Telefon in der Tasche haben möchten, das beim Berechnen dieser Dinge zu „explodieren“ beginnt. Aber wenn Ihre Batterie von solchen Berechnungen nicht besonders betroffen ist, ist nicht alles so schlecht.



Dies war also ein Überblick über die Arbeit von TaintDroid. Hast du eine Frage?

Student: Markierst du nur das, was die ganze Zeit da ist? Oder ist jede Variable markiert?

Professor: Alles ist markiert, also hindert Sie theoretisch nichts daran, Informationen über die Infektion für Dinge zu geben, die überhaupt keine Infektion haben. Ich denke, sobald etwas mindestens ein bisschen schmutzig wird, müssen Sie so etwas wie ein dynamisches Änderungslayout erstellen. Wenn ein lokaler Parameter im Stapel infiziert ist, wählen Sie den gesamten Stapel aus, der jetzt als infiziert markiert ist. taint, , , - , , . , , - . TaintDroid . Dalvik.

– taint x86 ARM? , , , , , , Java . ?

, , , . , , , , , Java- - . x86, , , , , , .
, taint , , , . .



, x86 — . . , - x86, . , , , P, , , !

, taint x86. , , , AD, , .
-, , . -, , . , , , .

, . , . , , , . , « » Taint Explosion.
, , . , Dungeons and Dragons, .

, , - - . , , , .
, - esp esb. , .



, x86, , esp. , , . , , , ebp, , , . , , , taint .

, Linux . , . , - .

: ? , .

: . x86, , . , . Bochs – IBM PC, 86. TaintBochs, x86 . x86, , . , . , , , , , , - .

54:10

MIT-Kurs "Computer Systems Security". Vorlesung 21: Datenverfolgung, Teil 3


Die Vollversion des Kurses finden Sie hier .

Vielen Dank für Ihren Aufenthalt bei uns. Gefällt dir unser Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung aufgeben oder Ihren Freunden empfehlen, einen Rabatt von 30% für Habr-Benutzer auf ein einzigartiges Analogon von Einstiegsservern, das wir für Sie erfunden haben: Die ganze Wahrheit über VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s von $ 20 oder wie teilt man den Server? (Optionen sind mit RAID1 und RAID10, bis zu 24 Kernen und bis zu 40 GB DDR4 verfügbar).

VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s bis Januar kostenlos, wenn Sie für einen Zeitraum von sechs Monaten bezahlen, können Sie hier bestellen .

Dell R730xd 2 mal günstiger? Nur wir haben 2 x Intel Dodeca-Core Xeon E5-2650v4 128 GB DDR4 6 x 480 GB SSD 1 Gbit / s 100 TV von 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/de433378/


All Articles