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

In Fortsetzung des Themas des Teilens von Privilegien werden wir heute über Möglichkeiten sprechen. Wenn Sie sich erinnern, haben wir letzte Woche darüber gesprochen, wie Unix einige Mechanismen für Anwendungen bereitstellt, die wir verwenden können, wenn wir Berechtigungen von der internen Struktur der Anwendung trennen müssen.

Heute werden wir über die Möglichkeiten sprechen, die uns dazu bringen, die Berechtigungen der Anwendung sehr unterschiedlich zu betrachten. Daher haben wir in der heutigen Vorlesung zwei getrennte Themen zur Diskussion. Eine Frage ist, wie Sie Verwirrung bei der Bestimmung der Autorität vermeiden und Ihre Berechtigungen beim Schreiben eines Programms klarer und eindeutiger gestalten können, damit Sie nicht versehentlich die falschen Berechtigungen verwenden.

Die zweite Frage betrifft die „Sandbox“ namens Capsicum . Es handelt sich um ein OKWS- ähnliches System , mit dem Sie ein Codefragment mit weniger Berechtigungen ausführen können. Wenn das System kompromittiert wird, droht daher kein großer Schaden.



Mit diesem Ansatz können Sie Berechtigungen anders bearbeiten als mit Unix . Lassen Sie uns zunächst dieses verwirrende Autoritätsproblem betrachten, mit dem die Autorin des Artikels, über den wir Norman Norman diskutieren, konfrontiert war, und herausfinden, warum sie von ihm so verwirrt war.

Dieser Artikel wurde vor langer Zeit geschrieben und der Autor verwendet eine syntaktische Struktur für Dateinamen, was etwas überraschend ist. Wir können jedoch versuchen, sein Problem zumindest in eine bekanntere Namenssyntax im Unix- Stil zu übertragen.

Soweit ich das beurteilen kann, verwendete er den Fortran-Compiler , der sich in / sysx / fort befand , und er wollte diesen Compiler ändern, um Statistiken darüber zu erhalten, was kompiliert wurde, welche Teile des Compilers am ressourcenintensivsten waren und so weiter. Daher wollte er sicherstellen, dass dieser Fortran-Compiler irgendwie einen Eintrag in der Datei / sysx / stat bereitstellt und dass er hier Informationen über verschiedene Compiler-Aufrufe schreibt.



Ihr Betriebssystem hatte so etwas wie die Setuid- Funktion, über die wir unter Unix gesprochen haben . Sie nannten es die Home-File-Lizenz. Wenn Sie also / sysx / fort ausgeführt haben und dieses Programm über eine sogenannte Home-Files- Lizenz verfügt, verfügt dieser gerade gestartete Prozess über zusätzliche Schreibberechtigungen für alles in / sysx / . Das heißt, Sie könnten nach dem Schrägstrich alles aufschreiben, was normalerweise mit einem Sternchen markiert ist, und einen Ausdruck der Form / sysx / * erhalten . Dies gab Zugriff auf alle Dateien, die nach / in das Verzeichnis geschrieben wurden, und der Benutzer konnte sie ausführen. Daher bestand das spezifische Problem darin, dass eine Art intelligenter Benutzer dies tun konnte, indem er den Compiler ausführte, der viele Argumente annehmen konnte, wie dies bei GCC der Fall ist.

Ein solcher Benutzer könnte beispielsweise so etwas wie foo.f sammeln, wobei f der Quellcode von Fortran ist , und hier hinzufügen - o / sysx / stat .



Sie hatten eine andere Datei im System / sysx , die eine Abrechnungsdatei für alle Systemclients war. Sein Schaden würde noch mehr Schaden anrichten. Auf ähnliche Weise war es möglich, den Compiler zu „bitten“, die Quelldatei / sysx / bill zu kompilieren und in eine spezielle Datei in / sysx zu legen . Und in ihrem Fall hat es funktioniert. Trotz der Tatsache, dass der Benutzer selbst keinen Schreibzugriff auf diese Datei oder dieses Verzeichnis hatte, verwendete er den Compiler, der über dieses zusätzliche Privileg verfügte - eine Lizenz für Home-Dateien. Dank der Berechtigungen des Compilers konnte er Dateien entgegen den Absichten des Entwicklers ersetzen.



Wem sollten sie die Schuld für das geben, was passiert ist? Was ist ihrer Meinung nach schief gelaufen? Könnten Sie anders gehandelt haben, um solchen Problemen nicht zu begegnen? Sie glaubten, dass der Fortran-Compiler bei der Verwendung seiner Berechtigungen sehr vorsichtig sein würde. Tatsächlich verfügt der Fortran-Compiler ab einer bestimmten Ebene über zwei Arten von Berechtigungen, die er verwendet.

Eine, die wichtigste, basiert auf der Tatsache, dass der Benutzer, wenn er den Compiler aufruft , auf die Quelldatei wie foo.f. zugreifen kann. Und wenn es ein anderer Benutzer wäre, der den Compiler nicht aktiviert oder nicht aufgerufen hätte, wäre ein solcher Benutzer nicht in der Lage, auf den Quellcode des "richtigen" Benutzers zuzugreifen.

Die zweite Art von Berechtigung wird durch diese Lizenz bereitgestellt, mit der Sie diese speziellen Dateien schreiben können. Auf der internen Ebene des Compiler-Quellcodes sollte klar angegeben sein, welche dieser Berechtigungen er beim Öffnen einer Datei oder beim Ausführen einer privilegierten Operation verwenden möchte. Es kann einfach wie jedes andere Programm Dateien öffnen, lesen und schreiben. Es verwendet implizit alle Berechtigungen, die es besitzt, dh in ihrem Systemdesign war es eine Art Kombination von Benutzerberechtigungen und Lizenzen für die Verwendung von Home-Dateien.

Daher waren diese Leute wirklich daran interessiert, dieses Problem zu lösen. Und sie nannten diesen Compiler einen „dummen Helfer“, weil er zwischen den vielen Privilegien, die er hatte, unterscheiden und sie gegebenenfalls sorgfältig einsetzen musste.

Wir sollten uns also überlegen, wie wir einen ähnlichen Compiler unter Unix entwickeln können . In ihrem System war alles an diese Dateilizenz gebunden. Es gibt andere Mechanismen, die sie später in ihr Programm aufgenommen haben, um Chancen zu identifizieren. Wir werden in naher Zukunft darüber sprechen. Aber können wir dieses Problem auf einem Unix- System lösen?

Angenommen, Sie müssten diesen Fortran-Compiler unter Unix schreiben, diese spezielle Datei schreiben und das Problem vermeiden. Was würdest du tun Irgendwelche Ideen? Ich denke, Sie können dies einfach als schlechten Plan deklarieren und beispielsweise keine Statistiken führen. Oder unterstützen Sie keinen Dateneingabetyp - oh . Auf der anderen Seite können Sie angeben, welchen Quellcode Sie kompilieren möchten, damit Sie die Datei / bill oder die Statistikdatei lesen können, die möglicherweise geheim sein muss.

Oder vielleicht könnten Sie Standard-Quellcode unterstützen, aber dann müsste er Teile eines anderen Quellcodes enthalten, das ist also etwas abstrus.

Zielgruppe: Man könnte Compiler-Berechtigungen teilen.

Professor: Ja, das wäre ein weiteres potenziell gutes Design, das seine Referenzen teilt. Wir wissen, dass der Fortran-Compiler nicht beide Berechtigungen gleichzeitig benötigt. Wenn wir also unter Unix sprechen, könnten wir vielleicht einen Compiler wie world / bin / fortcc erstellen , und es wäre nur ein reguläres Programm ohne zusätzliche Berechtigungen. Und dann würden wir / bin / fortlog erstellen, ein spezielles Programm mit einigen zusätzlichen Berechtigungen, und es wird Statistiken darüber sammeln, was im Compiler passiert, und die fortcc- Funktion ruft fortlog auf . Also, welche Privilegien würden wir diesem Fortlog geben ?



Zielgruppe: Wenn Sie beispielsweise setuid oder fortlog verwenden , kann jeder andere Benutzer auch beliebige Daten darüber registrieren.

Professor: Ja, also ist es nicht so toll. Da die einzige Möglichkeit in Unix , Fortlog zusätzliche Berechtigungen zu erteilen, darin besteht, Eigentümer zu werden, weiß ich nicht, ob Sie möglicherweise Fort UID und Setuid erstellen. Und jedes Mal, wenn Sie fortlog ausführen , wird auf diese Fort-UID umgeschaltet . Und vielleicht wird hier noch eine spezielle Statistikdatei benötigt. Aber schließlich kann jeder dieses Fortlog nennen .



Und das ist nicht gut, weil jeder in die Statistikdatei schreiben kann. In diesem Fall ist dies aus Sicherheitsgründen ein kleines Problem. Was passiert jedoch, wenn es sich anstelle von stat um eine Rechnungszahlungsdatei handelt ? In diesem Fall sind die Probleme viel schwerwiegender.

Unix hat einen ziemlich komplizierten Mechanismus, den wir in der letzten Vorlesung am Montag weggelassen haben. Dieser Mechanismus ermöglicht es der Anwendung, zwischen mehreren UIDs zu wechseln. Um verschiedene Anwendungen auszuführen, können Sie zwischen Benutzer- IDs wechseln. Es ist ein wenig schwierig, es richtig zu machen, aber machbar. Dieser Mechanismus könnte also ein weiteres potenzielles Design unseres Systems sein.

Ich denke, Sie könnten noch einen Trick machen: Machen Sie das Fortlog "binär" nur für eine bestimmte Gruppe ausführbar und erstellen Sie die Fortcc-Setgid- Binärdatei für diese Gruppe. Dies ist jedoch nicht sehr gut, da dadurch jede Liste von Gruppen gelöscht wird, die der Benutzer ursprünglich hatte. Aber wer weiß, vielleicht ist das besser als nichts.

In jedem Fall ist dies ein ziemlich kompliziertes Problem, das jedoch mithilfe von Unix- Mechanismen vollständig gelöst werden kann. Vielleicht sollten Sie Ihr Problem überdenken und sich nicht zu viele Sorgen um die Statistikstatistikdatei machen, wobei die Sicherheit an erster Stelle steht. Was läuft in unserem Projekt falsch?

Es gibt zwei Dinge, auf die Sie achten müssen, wenn etwas schief gelaufen ist. Die erste wird Umgebungsautorität oder externe Autorität genannt. Versteht jemand, was sie meinten? Sie haben diese genaue Definition nie gegeben.

Zielgruppe: Dies bedeutet, dass Sie die Autorität haben, die Ihnen von der Umgebung erteilt wurde. Als ob Sie ein Benutzer wären, der ohne Einschränkungen handelt.

Professor: Ja, Sie führen eine Operation aus und können angeben, welche Operation Sie ausführen möchten. Die Entscheidung, ob diese Operation erfolgreich sein wird, hängt jedoch von einigen zusätzlichen indirekten Parametern in Ihrem Prozess ab.

Unter Unix können Sie herausfinden, wie die Überprüfung durch die Umweltbehörde aussehen wird. Wenn Sie einen Systemaufruf tätigen, haben Sie dem Systemaufruf daher wahrscheinlich einen Namen gegeben. Und innerhalb des Kernels wird dieser Name einem Objekt zugeordnet. Und dieses Objekt enthält angeblich eine Art Zugriffssteuerungsliste in sich, zum Beispiel Berechtigungen für diese Datei und so weiter.



Daher gibt es einige Berechtigungen, die Sie von diesem Objekt erhalten können, und Sie müssen bestimmen, ob der Vorgang mit diesem Namen, der der Anwendung gewährt wurde, zulässig ist, dh , der Kettenname -> Objekt -> Berechtigung wird erstellt . Dies ist, was die Anwendung bekommt, um den Prozess zu sehen.

Im Kernel befindet sich die aktuelle Benutzer-ID der Prozessprozess-UID , die Anrufe tätigt. Er ist auch an der Entscheidung beteiligt, ob die Ausführung einer bestimmten Operation zulässig ist oder nicht. Somit ist diese aktuelle Prozessbenutzer-ID ein externes Privileg. Der Kernel versucht, alle Vorgänge, die Sie ausführen möchten, mit Ihrer aktuellen UID , Ihrer aktuellen GID und anderen zusätzlichen Berechtigungen zu überprüfen. Und obwohl es eine Reihe von Berechtigungen gibt, mit denen Sie dies tun können, können Sie dies tun. Es ist jedoch möglich, dass Sie nicht alle diese Berechtigungen verwenden möchten, um eine bestimmte Datei zu öffnen oder einen anderen Vorgang auszuführen.

Verstehen Sie, was diese Umgebungsprivilegien sind , externe Privilegien? Im Fall des Betriebssystems bedeutet dies, dass der Prozess eine Art Benutzer-ID hat. Können Sie Beispiele für solche Berechtigungen nennen, die nicht mit dem Betriebssystem zusammenhängen? Zum Beispiel, wenn Sie eine Prozessidentifizierungsoperation ausführen, um herauszufinden, ob sie erfolgreich war oder nicht. Eine Firewall kann als Beispiel dienen. Wenn Sie sich innerhalb des Netzwerks befinden oder eine interne IP-Adresse haben, dürfen Sie eine Operation ausführen. Wenn Sie sich außerhalb des Netzwerks befinden, ist dieselbe Operation für Sie verboten.

Angenommen, Sie besuchen eine Website, die einen Link zu einem anderen Server enthält, und möchten möglicherweise nicht die Berechtigungen verwenden, die Sie benötigen, um diesem Link zu folgen. Vielleicht gibt dies jemandem Zugriff auf Ihren internen Netzwerkdrucker und jemand kann ihn verwenden. In Wirklichkeit sollte derjenige, der Ihnen den Link bereitgestellt hat, nicht zu Ihrem Drucker gelangen, da er sich außerhalb des Netzwerks befindet. Wenn Sie diesen Link besuchen, kann die Firewall Ihres Browsers dies auf betrügerische Weise tun.



Dies ist eine Art moralisches Äquivalent zu diesem verwirrenden Problem in Netzwerkmodellen.

Zielgruppe: Bestehende Berechtigungen wirken sich ebenfalls darauf aus.

Professor: Ja.

Zielgruppe: Weil Capsicum im Wesentlichen DAC verwendet - diskretionäre Zugriffskontrolle.

Professor: Ja, das liegt hauptsächlich daran, dass die Mitarbeiter von Capsicum so etwas wie eine diskretionäre Zugangskontrolle verwenden. Dies bedeutet, dass der Benutzer oder Eigentümer des Objekts entscheidet, wie die Sicherheitsrichtlinie für dieses Objekt aussehen soll. Für Unix ist dies sehr natürlich - dies sind meine Dateien, und ich kann entscheiden, was ich mit ihnen machen möchte, ich kann sie Ihnen geben oder sie behalten. Daher sehen fast alle DAC- Systeme so aus, da sie Berechtigungen benötigen, die der Benutzer ändern kann, um die Sicherheitsrichtlinien seiner Dateien zu verwalten.



Die Kehrseite des DAC ist die obligatorische Zugangskontrolle. Wir werden später darüber sprechen, aber auf einer bestimmten Ebene haben diese Systeme eine ganz andere Sicht auf die Welt. Sie denken, dass Sie nur ein Computerbenutzer sind und jemand anderes eine Sicherheitsrichtlinie für die Verwendung dieses Computers festlegt. Diese Ansicht stammt aus den 70er oder 80er Jahren, als das Militär wirklich geheime Computersysteme haben wollte, in denen Sie an einigen Dingen arbeiten, die als „geheim“ gekennzeichnet sind. Und wenn Sie an Dingen arbeiten, die als „geheim“ gekennzeichnet sind , und ich an Dingen arbeite, die als „streng geheim“ gekennzeichnet sind , können sie Sie nicht so leicht erreichen. Aber ich muss die Rechte für die Datei nicht festlegen und so weiter, es ist einfach nicht erlaubt von einem Top-Typ.

Daher versucht die obligatorische Zugriffskontrolle wirklich, verschiedene Arten von Zugriffsrichtlinien an die erste Stelle zu setzen, an der sich ein Benutzer und ein Anwendungsentwickler befinden, und neben ihnen gibt es einen anderen, der diese Richtlinie festlegt. Wie Sie sich vorstellen können, funktioniert dies jedoch nicht immer. Wir werden etwas später darüber sprechen. Dies ist jedoch die wesentliche Bedeutung der diskretionären Zugangskontrolle.

Wir haben viele andere Beispiele für die Verwendung der externen Zugriffskontrolle. Dies ist nicht unbedingt schlecht, Sie müssen nur sehr vorsichtig sein, wenn Sie es verwenden. Wenn Sie über ein Umgebungsprivilegsystem verfügen, müssen Sie bei der Ausführung privilegierter Vorgänge sehr vorsichtig sein. Sie müssen sicherstellen, dass Sie wirklich die richtigen Berechtigungen verwenden und nicht versehentlich getäuscht werden, wie bei diesem Fortran-Compiler vor fast 25 Jahren.

Dies ist also eine der Interpretationen dessen, was passiert. Und dies ist nicht unbedingt die einzige Möglichkeit, darüber nachzudenken, was schief geht, oder? Eine andere Möglichkeit ist, dass es schön wäre, wenn die Anwendung selbst wüsste, ob sie im Namen eines Prinzips auf die Datei zugreifen sollte. Problem Nummer 2 ist daher die Komplexität der Zugriffskontrollprüfungen.



In gewisser Weise öffnet der Fortran- Compiler beim Ausführen die Datei im Namen des Benutzers, und Sie müssen dieselbe Logik wiederholen, die wir hier im Diagramm sehen, außer dass der Fortran-Compiler etwas anderes für die Sur-Prozess-UID verbinden muss. Anstatt die aktuellen Berechtigungen zu verwenden, sollte er einfach die Prüfung Name -> Objekt -> Berechtigung wiederholen und versuchen, dies mit einem anderen Satz von Berechtigungen für Ihre Prozess-UID zu tun.

Unter Unix ist dies ziemlich schwierig, da es viele Orte gibt, an denen Sicherheitsüberprüfungen stattfinden. Wenn Sie symbolische Softlinks haben, wird der symbolische Link gescannt und der Pfadname wird ebenfalls mit einigen Berechtigungen usw. ausgewertet. Es kann jedoch vorkommen, dass Sie in einigen Systemen die Überprüfung der Zugriffskontrolle vereinfachen können, wenn dies in der Anwendung unabhängig durchgeführt werden kann. Denken Sie nicht, dass dies ein kluger Plan ist? Würden Sie dem zustimmen? Besteht die Gefahr, diesen Test zu wiederholen?

Zielgruppe: Wenn Sie in der Anwendung Überprüfungen durchführen, können Sie einfach keine anderen Überprüfungen durchführen.

Professor: Ja, Sie können andere Prüfungen leicht überspringen, das ist absolut richtig. Als sie hier den Fortran- Compiler verwendeten, versuchte er in gewisser Weise nicht einmal, irgendwelche Überprüfungen durchzuführen, sodass sie fehlschlugen. Eine weitere Konsequenz neben dem Fehlen von Überprüfungen ist, dass sich der Kernel ständig ändern kann und dann leicht unterschiedliche Überprüfungen aufweist. Dies führt zu einigen zusätzlichen Sicherheitsanforderungen, die Anwendung ändert sich jedoch nicht und implementiert den alten Überprüfungsstil. Das ist also kein guter Plan.

Denken Sie daran, dass es im Bereich Sicherheit eine gute Idee gibt - eine Verringerung der Anzahl der beteiligten Mechanismen. Daher verfügt das Programm nur über eine geringe Anzahl von Stellen, an denen Sicherheitsrichtlinien angewendet werden. Sie möchten wahrscheinlich nicht dieselbe Funktionalität in Anwendungen, im Kernel usw. wiederholen. Sie möchten diese Überprüfungen wirklich an einer Stelle im Programm konzentrieren. Was sollte also die Lösung für das Problem der Erteilung von Befugnissen sein?

Am nächsten an der Lösung des Problems sind die Dateideskriptorfunktionen unter Unix .



In der Welt der Möglichkeiten besteht eine Alternative zu diesem Schema darin, dass Sie anstelle des Kettennamens -> Objekt -> Berechtigung und der Entscheidung, ob es basierend auf den externen Berechtigungen der Prozessprozess-UID verwendet werden soll, ein sehr einfaches Schema verwenden können.

Angenommen, Sie verfügen über Funktionen für ein bestimmtes Objekt. Und diese Funktionen können eine Reihe von Einschränkungen aufweisen, was Sie mit diesem Objekt tun können.



Wenn Sie jedoch Möglichkeiten für dieses Objekt haben, können Sie darauf zugreifen. . , , , .
, Capability , , , , . . Capability , - , — .

Capability , . , ?

, , . , . , , .

, , , « ». , , Capsicum ? ?

: , , , Capability .

: , , , , . — . Unix , 0, , 1, . . , , . , - , , . PID , , PID:57 , . , , . , , , , , .. .



, , , . , -, - , .

, , , Unix , , , /etc/pwd .

. . , . , « »?



, , integer . , . , .

, . , ? , . , .

, , Capability , Fortran . sysx/fort ? , ?

: , . , , output- . , , .

: , . , Fortran /sysx/stat . , .

, , . , , «» Unix . , , , Fortran , , , , , .

. fort1 , , - , , foo.f , , , — o , . , . , .

, , , . ! , , , , setuid Fortran .



, setuid - , . , . , , , , .

, , , , . , , , Capability , , , , .

26:30

:

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


.

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


All Articles