MIT-Kurs "Computer Systems Security". Vorlesung 6: Chancen, 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

Teilnehmerin: Können wir daraus schließen, dass jede Gelegenheit einen Prozess hat?

Professor: Ich bezweifle es. Sie können so viele Prozesse haben, wie Sie möchten, für eine Möglichkeit können mehrere Prozesse existieren. Einfach ausgedrückt, Sie benötigen nicht unbedingt einen separaten Prozess für jede Gelegenheit. Weil es einen fort1- Prozess gibt, der viele Dateien öffnen und viele Funktionen an die privilegierte Komponente von fort übergeben kann .



Der Grund, warum Sie glauben, dass Sie für jede Gelegenheit, mit der wir uns befassen, einen separaten Prozess benötigen, betrifft diese seltsame Wechselwirkung zwischen Funktionen und externen Berechtigungen.

Weil fort1 ein externes Privileg hat. Und was wir tun, ist im Grunde, dieses externe Privileg in diesem Fort1- Prozess in Fähigkeit umzuwandeln . Wenn Sie also mehrere verschiedene Arten von externen Berechtigungen oder verschiedene Berechtigungen haben, die Sie mit Vorsicht verwenden möchten, möchten Sie wahrscheinlich einen separaten Prozess, der über diese Berechtigungen verfügt. Wenn Sie einen bestimmten Satz von Berechtigungen verwenden möchten, werden Sie den entsprechenden Prozess zur Durchführung der Trennung auffordern. Wenn dies erfolgreich ist, werden Sie den Prozess auffordern , Capability an Sie zurückzugeben.

Tatsächlich gab es ein solches Design des Betriebssystems, das vollständig auf Funktionen basierte und keine externen Berechtigungen hatte. Und das ist cool, aber für den Einsatz in einem realen System nicht sehr praktisch. Es stellt sich heraus, dass Sie in Wirklichkeit weniger externe Berechtigungen als vielmehr die Möglichkeit wünschen, ein Objekt zu benennen und jemandem von diesem Objekt zu erzählen, ohne die Rechte auf dieses Objekt zu übertragen.

Vielleicht weiß ich nicht, welche Privilegien Sie in Bezug auf ein allgemeines Dokument haben, aber ich möchte Sie darüber informieren, dass wir dieses allgemeine Dokument haben. Wenn Sie es lesen können, lesen Sie es. Wenn Sie es hineinschreiben, schreiben Sie. Ich möchte aber keine Rechte daran übertragen. Ich möchte dir nur sagen: "Hey, dieses Ding, probier es aus!" Dies ist also eine Unannehmlichkeit in der Welt der Möglichkeiten, da Sie wirklich gezwungen sind, niemals über Objekte zu sprechen, ohne Rechte an diesem Objekt zu übertragen.

Daher ist es wichtig, dies zu wissen und diese Funktion in einigen Teilen des Systems zu verwenden, sich jedoch nicht darauf zu verlassen, dass dies die Lösung für die Sicherheit des Systems darstellt.



Zielgruppe: Angenommen, der Prozess verfügt über die Funktionen, die ihm von einem anderen Prozess zugewiesen wurden. Es stellt sich jedoch heraus, dass er in Bezug auf ein Objekt bereits über hervorragende Funktionen verfügt. Kann ein Prozess sie vergleichen, um sicherzustellen, dass sie dasselbe Objekt berühren? Oder wird er die großen Chancen nutzen?

Professor: Tatsache ist, dass der Prozess Fähigkeiten nicht implizit verwendet, daher ist dies eine sehr nützliche Eigenschaft von Fähigkeiten. Sie müssen auf jeden Fall angeben, welche der Optionen Sie verwenden. Denken Sie also an einen Dateideskriptor. Angenommen, ich gebe Ihnen einen offenen Dateideskriptor für eine Datei, der schreibgeschützt ist. Dann gibt Ihnen jemand anderes eine weitere Möglichkeit für andere Dateien, einschließlich dieser Datei. Mit einer neuen Funktion können Sie Dateien lesen und schreiben.

Wenn Sie in diesem Fall versuchen, in die erste Datei zu schreiben, ist dies zweifellos erfolgreich, da ein zusätzlicher Dateideskriptor dafür geöffnet wird, der nicht nur das Lesen, sondern auch das Schreiben ermöglicht. Das ist also eine coole Sache, wenn Sie keine zusätzlichen externen Berechtigungen benötigen. Sie haben einfach alle diese Möglichkeiten, weil die Leute solche Bibliotheken tatsächlich gebaut haben und im Prinzip Ihre Fähigkeiten für Sie verwalten. Sie sammeln sie irgendwie. Und wenn sie versuchen, eine Operation durchzuführen, suchen sie nach Möglichkeiten und finden diejenigen, die sie funktionieren lassen.

Dadurch kehren Sie zur externen Kontrolle der Umgebungsbehörde zurück, die Sie vermeiden wollten. Ein positives Merkmal der Möglichkeiten ist, dass es sich um ein Software-Design handelt, das Ihr Leben vereinfacht. Dies ist bei Sicherheitslösungen ungewöhnlich. Diese Eigenschaft erleichtert Ihnen das Schreiben von Code, der auf die Berechtigungen verweist, die Sie aus Sicherheitsgründen verwenden möchten. Und das ist ziemlich einfach, Code zu schreiben.
Die Fähigkeit kann jedoch andere Probleme lösen. Daher treten häufig Probleme bei der Verwaltung von Berechtigungen auf, wenn Sie nicht vertrauenswürdigen Code ausführen müssen. Weil Sie wirklich kontrollieren möchten, welche Berechtigungen Sie gewähren, da sonst die Gefahr besteht, dass von Ihnen bereitgestellte Berechtigungen missbraucht werden. Und dies ist eine etwas andere Sichtweise, aus der sich die Autoren des Artikels über Capsicum Möglichkeiten nähern. Sie sind sich natürlich des Problems der externen Autorität bewusst, aber dies ist ein etwas anderes Problem, das Sie lösen können oder nicht. Aber im Grunde kümmern sie sich darum, dass sie eine wirklich große privilegierte Anwendung haben, und sie befürchten, dass es Fehler in verschiedenen Teilen des Quellcodes dieser Anwendung geben wird. Daher möchten sie die Berechtigungen der verschiedenen Komponenten dieser Anwendung reduzieren.

In diesem Sinne ist die Geschichte OKWS sehr ähnlich. Wenn Sie also eine große Anwendung haben, teilen Sie sie in Komponenten auf und beschränken die Berechtigungen für jede Komponente. Dies ist in OKWS sicherlich sinnvoll. Gibt es andere Situationen, in denen Sie möglicherweise Bedenken haben, Berechtigungen zu teilen? Ich denke, dass sie in ihrem Artikel Beispiele beschreiben, die ich versuchen sollte, zum Beispiel tcpdump und andere Anwendungen auszuführen, die Netzwerkdaten analysieren. Warum sind sie so besorgt über Anwendungen, die Netzwerkeingaben analysieren? Was passiert in tcpdump ? Was ist der Grund für ihre Paranoia?

Zielgruppe: Ein Angreifer kann steuern, was gesendet wird und was aufgerufen wird, um beispielsweise Pakete auszuführen.

Professor: Ja, sie kümmern sich wirklich um Angriffe dieser Art und darum, ob der Angreifer die Eingabedaten wirklich kontrollieren kann? Weil es ziemlich problematisch ist, wenn Sie C- Code schreiben, der Datenstrukturen verarbeiten soll. Offensichtlich werden Sie viele Zeiger manipulieren, indem Sie Bytes in Arrays kopieren, die Speicher zuweisen. Gleichzeitig kann es leicht zu Fehlern bei der Speicherverwaltung kommen, die zu katastrophalen Folgen führen.

Dies ist der Grund, warum sie beschlossen haben, die Arbeit ihres Netzwerkprotokolls und anderer Dinge in der Sandbox zu erkennen.



Ein weiteres Beispiel für die reale Welt, in der die Freigabe von Berechtigungen erforderlich ist, ist Ihr Browser. Möglicherweise möchten Sie Ihr Flash-Plugin, Ihre Java- Erweiterung oder etwas anderes isolieren. Weil sie ein weites Feld für Angriffe darstellen, die ziemlich aggressiv eingesetzt werden.

Das scheint also ein kluger Plan zu sein. Wenn Sie beispielsweise eine Software schreiben, möchten Sie das Verhalten der Komponenten in der Sandbox überprüfen. Im Allgemeinen bezieht sich dies auf das, was Sie aus dem Internet heruntergeladen haben und mit weniger Berechtigungen ausführen möchten. Passt der von Capsicum angebotene Isolationsstil dazu ? Ich könnte einen zufälligen Bildschirmschoner oder ein Spiel aus dem Internet herunterladen. Und ich möchte sie auf meinem Computer ausführen, aber stellen Sie zuerst sicher, dass sie nicht alles ruinieren, was ich habe. Würden Sie dafür Capsicum verwenden ?

Zielgruppe: Sie können ein Sandbox-Programm schreiben, in dem Sie Capsicum verwenden .

Professor: richtig. Wie würden Sie es verwenden? Nun, Sie würden einfach mit dem Befehl cap_enter in den Sandbox-Modus wechseln und dann das Programm ausführen. Erwarten Sie, dass dies funktioniert? Ich denke, es wird ein Problem geben. Dies hängt mit der Tatsache zusammen, dass das Programm möglicherweise nicht versucht, die gemeinsam genutzte Bibliothek zu öffnen, wenn es nicht erwartet, dass es von Capsicum isoliert wird. Dies ist jedoch nicht möglich, da es so etwas wie / lib / ... nicht öffnen kann, da dies nicht der Fall ist im Capability- Modus erlaubt.

Daher sollten diese Sandbox-Methoden für die Dinge verwendet werden, für die der Entwickler vorausgesehen hat, dass sie in diesem Modus ausgeführt werden können. Es gibt wahrscheinlich andere Sandbox-Methoden, die für unveränderten Code verwendet werden können, aber dann können sich die Anforderungen geringfügig ändern. Daher sind die Entwickler von Capsicum nicht sehr besorgt über die Abwärtskompatibilität. Wenn wir Dateien anders öffnen müssen, werden wir sie anders öffnen. Wenn Sie jedoch den vorhandenen Code belassen möchten, benötigen Sie etwas mehr, z. B. eine vollwertige virtuelle Maschine, damit Sie den Code darin ausführen können. Dies wirft die Frage auf: Sollten wir virtuelle Maschinen für die Capsicum- Sandbox verwenden?

Zielgruppe: In diesem Fall ist ein Speicherüberlauf möglich.

Professor: Ja, das ist es. Aber was ist, wenn uns das Gedächtnis egal ist? Virtuelle Maschinen sind also wahrscheinlich sehr gut und verbrauchen nicht viel Speicher. Aus welchem ​​anderen Grund sollten wir VM in Capsicum nicht verwenden?

Zielgruppe: Es ist schwierig, die Netzwerkaktivität zu steuern.

Professor: Richtig! Es ist schwierig zu steuern, was im Netzwerk geschieht, da Sie entweder der virtuellen Maschine keinen Zugriff auf das Netzwerk gewähren oder eine Verbindung zum Netzwerk über den NAT- Modus oder über die Vorschau oder VMWare herstellen . Aber dann kann Ihre Sandbox auf das gesamte Internet zugreifen. Daher müssen Sie das Netzwerk detaillierter verwalten, indem Sie möglicherweise Firewall-Regeln für die virtuelle Maschine festlegen usw. Das ist nicht so gut.

Aber was ist, wenn Sie sich nicht für das Netzwerk interessieren? Angenommen, Sie haben nur eine Art Video. Was ist, wenn Sie ein einfaches Video verarbeiten oder tcpdump analysieren ? In diesem Fall starten Sie einfach die virtuelle Maschine, sie beginnt mit dem Parsen Ihrer tcpdump- Pakete und wirft Sie nach der Präsentation zurück, die tcpdump an den Benutzer schreiben möchte, da keine echte Netzwerk-E / A vorhanden ist. Gibt es einen anderen Grund?



Zielgruppe: Weil der Aufwand für die Initialisierung immer noch hoch ist.

Professor: Ja, dies kann der anfängliche Aufwand beim Starten einer virtuellen Maschine sein, der die Leistung verringert. So ist es wahr.

Teilnehmerin: Nun, vielleicht möchten Sie immer noch Rechte an einer Datenbank und dergleichen haben.

Professor: Ja. Im Allgemeinen bedeutet dies jedoch, dass Sie über echte Daten verfügen, mit denen Sie arbeiten, und dass es wirklich schwierig ist, diese zu trennen. Daher sind virtuelle Maschinen in der Tat ein viel größerer Freigabemechanismus, aufgrund dessen Sie Dinge nicht einfach freigeben können. Dies ist also gut für Situationen, in denen Sie ein vollständig isoliertes Programm haben, das Sie ausführen möchten, und gleichzeitig keine Dateien, Verzeichnisse und Prozesse freigeben und diese einfach separat arbeiten lassen möchten.

Das ist also großartig. Dies ist wahrscheinlich in gewisser Weise eine stärkere Isolation als die von Capsicum , da es weniger Möglichkeiten gibt, dass etwas schief geht. Diese Isolierung ist jedoch in vielen Situationen nicht anwendbar, wenn Sie Capsicum verwenden möchten. Denn in Capsicum können Sie Dateien mithilfe der Funktionen der Sandbox mit großer Genauigkeit austauschen.

Nehmen wir also tcpdump und sehen, warum es schwierig ist, es mit dem Unix- Mechanismus zu isolieren. Wenn Sie sich erinnern, funktioniert tcpdump in Capsicum so, dass es einige spezielle Sockets öffnet und dann die Parsing-Logik für Netzwerkpakete ausführt, wonach sie auf Benutzerterminals gedruckt wird. Was wird also für eine Unix- basierte tcpdump- Sandbox benötigt? Sind Ihre Privilegien begrenzt? Das Problem mit Unix ist, dass die einzige Möglichkeit, Berechtigungen wirklich zu ändern, darin besteht, die Eingabe in der Entscheidungsfunktion zu ändern, die entscheidet, ob Sie wirklich auf ein Objekt zugreifen können oder nicht. Und das einzige, was Sie wirklich ändern können, sind die Privilegien des Prozesses. Dies bedeutet, dass der Prozess die UID an eine andere Person senden kann.

Sie können auch die Berechtigungen für verschiedene Objekte auf Ihrem System ändern. Tatsächlich können Sie beide Lösungen verwenden.

Wenn Sie tcpdump in der Sandbox isolieren möchten, müssen Sie wahrscheinlich eine zusätzliche Benutzer-ID auswählen und während der Arbeit zu dieser wechseln. Dies ist jedoch kein idealer Plan, da Sie nicht mehrere Instanzen von tcpdump unter derselben Benutzer- ID ausführen werden. Wenn ich eine tcpdump- Instanz kompromittiere, bedeutet dies nicht, dass ich einem Angreifer erlauben möchte, diesen Faktor zur Steuerung anderer tcpdump- Instanzen zu verwenden, die auf meinem Computer ausgeführt werden. Dies ist möglicherweise eine schlechte Entscheidung, in diesem Fall uid zu verwenden.

Ein weiteres Problem besteht darin, dass Sie unter Unix über Root-Rechte verfügen müssen, um die Benutzer-ID, die Berechtigungen, den Prozess oder etwas anderes zu ändern oder sie auf etwas anderes umzustellen. Das ist auch schlecht.

Ein weiteres Problem ist, dass unabhängig von Ihrer ID Open-Access-Dateien vorhanden sein können. Ihr System verfügt möglicherweise über eine ganze Gruppe lesbarer oder beschreibbarer Dateien, z. B. eine Kennwortdatei. Unabhängig von Ihrer ID kann der Prozess dieses Kennwort weiterhin lesen. Das ist also auch nicht sehr schön.

Um eine Sandbox unter Unix zu organisieren, sollten Sie wahrscheinlich beides tun: Ändern Sie die UID und überprüfen Sie sorgfältig die Berechtigungen für alle Objekte, um sicherzustellen, dass Sie keine nicht isolierten geöffneten Dateien haben, die von einem Hacker überschrieben oder gelesen werden können. Ich denke, dass Sie dabei einen anderen Mechanismus erhalten, den Sie verwenden können. Wenn Sie es bis zum Ende einreichen, können Probleme beim Freigeben von Dateien oder Verzeichnissen auftreten.

Nun wollen wir sehen, wie Capsicum versucht, dieses Problem zu lösen. Sobald wir in den "Sandbox" -Modus wechseln, ist hier alles nur über Opportunities verfügbar. Wenn Sie nicht über Capability verfügen, können Sie daher einfach nicht auf Objekte zugreifen.

Diese Leute im Artikel machen eine große Wette auf den globalen Namespace. Was ist dieser globale Namespace und warum sind sie so besorgt darüber?

Ihr Dateisystem selbst ist eine Art leuchtendes Beispiel für einen globalen Namespace. Sie können einen Schrägstrich schreiben und jede gewünschte Datei dahinter auflisten. Gehen Sie zum Beispiel zu jemandem im Home-Verzeichnis, zum Beispiel / home / nickolai / ... Warum ist das schlecht? Warum sind sie gegen den globalen Namespace in Capsicum ? Was meinen Sie?



Zielgruppe: Wenn Sie die falschen Berechtigungen haben, können Sie bei Verwendung von Berechtigungen in Schwierigkeiten geraten.

Professor: Ja. Das Problem ist, dass es immer noch Unix ist . Daher gibt es immer noch reguläre Dateiberechtigungen. Wenn Sie also wirklich einen Prozess in der Sandbox isolieren möchten, können Sie möglicherweise nichts im System lesen oder schreiben. Wenn Sie es jedoch schaffen, eine beschreibbare Datei im Home-Verzeichnis eines dummen Benutzers zu finden, ist dies für den Sandbox-Client eher unangenehm.

Im Allgemeinen bestand ihre Idee darin, alle Objekte des Prozesses genau aufzulisten. Weil Sie einfach alle Features in einer Dateideskriptortabelle oder an einer anderen Stelle auflisten können, an der die Features für Sie gespeichert sind. Und dies ist das einzige, was der Prozess berühren kann.

Wenn Sie jedoch Zugriff auf den globalen Namespace haben, ist dies möglicherweise nicht möglich. Denn selbst wenn Sie nur über eine begrenzte Anzahl von Funktionen verfügen, können Sie die Zeile mit einem Schrägstrich beginnen und eine neue Datei schreiben, und Sie werden nie wissen, auf welche Operationen oder Objekte dieser Prozess zugreifen kann.

Aus diesem Grund sind sie so besorgt über den globalen Namespace, weil dies ihrem Ziel widerspricht, alles genau zu steuern, auf das der Sandbox-Prozess Zugriff haben sollte. Auf diese Weise versuchten sie, globale Namespaces mit vielen Kerneländerungen in FreeBSD zu entfernen . In ihrem Fall musste der Kernel sicherstellen, dass alle Vorgänge einige Funktionen durchlaufen, nämlich den Dateideskriptor.

Lassen Sie uns prüfen, ob wir wirklich Kerneländerungen benötigen. Was ist, wenn wir es einfach in der Bibliothek machen? Immerhin implementieren wir Capsicum , das bereits eine Bibliothek hat. Wir ändern lediglich alle diese Funktionen, z. B. "Öffnen, Lesen, Schreiben", um ausschließlich Capability- Funktionen zu verwenden. Dann durchlaufen alle Vorgänge einige Funktionen, suchen sie in der Dateitabelle und so weiter. Wird das funktionieren?



Zielgruppe: Sie können den Syscall- Systemaufruf jederzeit ausführen .

Professor: Ja. Das Problem ist, dass der Kernel eine Reihe von Systemaufrufen akzeptiert hat. Selbst wenn Sie eine gute Bibliothek implementieren, wird die Möglichkeit nicht verhindert, dass ein fehlerhafter oder kompromittierter Prozess einen Systemaufruf direkt ausführt. Deshalb muss man den Kern irgendwie stärken.

Im Compiler befindet sich das Bedrohungsmodell nicht im kompromittierten Compilerprozess und nicht in willkürlichem Code, sondern in der Nachlässigkeit des Programmierers. Wenn sich der Programmentwickler also nicht irrt und das Richtige tut, reicht die Bibliothek wahrscheinlich aus.

, , , . - , .

? — , cap_enter . , cap_enter ? , ?

, , . , , , . cap_enter , open () , openat .

Unix- , , open , openat , , , — : openat (dirfd,“name) . openat «name» , .



, Capability open , , , . . - ? -, ? , – . , ?

: , .

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

, , , , , . , , .. , , , . ?

. ? , Unix PID . , kill (25) PID = 25 . , . Capsicum ? ?

: .

: . -, . , Unix , . , PID , , fork , pdfork , « ». , - .

. , . , - : « «» , , , , ». . , , - .

, , , . , . , , .



. , «-» . , openat , «-». , «-», .

? , «-» ?

: , , . , Capability .

: , .

: , , - …

: .

: - .

: , . «-» ? , openat - b/c/../.. ?

, , ? - , . , , , openat (d, “b/c/../..) «c» , - .



. , , , . «-», . , , . , , . , UID - ?

: , .

: , . , , «» UID ? : cap_enter UID . , . ? ?

: , UID , , , , , - .

: , . «» UID . , , UID . , , , . UID .

54:14

:

MIT-Kurs "Computer Systems Security". 6: «», 3


.

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 sie Ihren Freunden empfehlen. Habr-Benutzer erhalten 30% Rabatt 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 $ 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).

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/de418219/


All Articles