Einschränkungen der Stapelinspektion

8

Dies ist eine Fortsetzung der Funktionsweise der Stapelinspektion. das untersucht den Begriff genauer

Die Stapelinspektion ist ein Mechanismus zur Gewährleistung der Sicherheit im Kontext der virtuellen JVM- und CLR-Maschinen, wenn extern heruntergeladene Codemodule unterschiedlicher Vertrauensstufen möglicherweise zusammen ausgeführt werden. Diese Systembibliotheken benötigen eine Möglichkeit zur Unterscheidung zwischen Aufrufen, die aus nicht vertrauenswürdigem Code stammen, und Aufrufen, die von der vertrauenswürdigen Anwendung selbst stammen. Dies erfolgt durch Zuordnen des seinem Ursprung entsprechenden Principals zum Code. Anschließend werden Zugriffsberechtigungen auf dem Stapel aufgezeichnet, und jedes Mal, wenn ein Aufruf an eine vertrauliche Systemmethode erfolgt, wird der Stapel durchlaufen, um festzustellen, ob die entsprechenden Berechtigungen für den Principal, der den Aufruf ausführt, auf dem Stapel vorhanden sind.

Was sind die Einschränkungen der Stapelinspektion? Welche Mechanismen wurden vorgeschlagen, um es zu ersetzen? Wurden seit seiner Einführung Ende der 90er Jahre wesentliche Änderungen am Modell vorgenommen?

Dave Clarke
quelle
Ich habe Probleme, die Funktionsweise der Stapelinspektion vollständig zu verstehen. Können Sie bitte einen Link zu einer guten Erklärung hinzufügen?
Raphael
@ Raphael: Gute Frage. Ich habe es zu einer Frage gemacht: cs.stackexchange.com/questions/796/…
Dave Clarke
1
In diesem Dokument werden einige Einschränkungen des in JVMs und Microsoft CLR verwendeten Stapelinspektionsmodells aufgeführt (aber ich habe es jetzt gefunden und nur die Schlussfolgerungen gelesen): research.microsoft.com/en-us/um/people/adg/Publications/…
Vor dem

Antworten:

6

Eine Stapelinspektion ist erforderlich, da Programme auf der JVM und der CLR standardmäßig Zugriff auf gefährliche Vorgänge haben. Daher muss etwas unternommen werden, um Katastrophen zu verhindern. Beispielsweise kann ein nicht vertrauenswürdiges Programm auf eine E / A-Bibliothek verweisen und diese aufrufen:

using IO;
...
IO.DeleteFile("/home/foo/bla");

Daher müssen wir bei jeder gefährlichen Operation prüfen, ob sie zulässig ist. Bei der Stapelinspektion ist es im Allgemeinen schwierig zu verstehen, wer Zugriff auf was erhält. Dies erschwert auch Optimierungen wie Inlining und Tail Calls.

Ein überlegener Mechanismus besteht darin, nicht jedem Programm überhaupt automatischen Zugriff auf gefährliche Vorgänge zu gewähren. In diesem Modell gibt es keine Möglichkeit, eine E / A-Bibliothek zu importieren. Der einzige Weg, um auf eine E / A-Bibliothek zuzugreifen, besteht darin, sie Ihnen von jemand anderem zu geben. Dies wird als Fähigkeitssicherheit bezeichnet. Eine Einführung finden Sie hier .

Stattdessen würden wir das vorherige Programm folgendermaßen schreiben:

Main(IOLibrary IO){
  IO.DeleteFile("/home/foo/bla");
}

Die E / A-Bibliothek ist ein Parameter für den Einstiegspunkt des Programms, und dies wird als Funktion bezeichnet (da sie eine gewisse Funktion zum Ausführen von E / A bietet). Um dieses Programm ausführen zu können, müssen wir selbst Zugriff auf eine E / A-Funktion haben und das Programm durch Aufrufen ausführen Main(ourIOlibrary). Wenn wir ein nicht vertrauenswürdiges Programm ausführen, übergeben wir unsere E / A-Bibliothek einfach nicht daran, da diese Bibliothek möglicherweise zum Löschen unserer Dateien verwendet wird. In einigen Fällen möchten wir einem nicht vertrauenswürdigen Programm eingeschränkten Zugriff auf das Dateisystem gewähren. In diesem Fall erstellen wir einen Wrapper um unsere eigene E / A-Bibliothek, der nur den Zugriff auf ein bestimmtes Verzeichnis ermöglicht, und übergeben diesen an das nicht vertrauenswürdige Programm anstelle der vollständigen E / A-Bibliothek

Wenn wir also eine E / A-Funktion benötigen, um ein Programm aufzurufen, das eine E / A-Funktion benötigt, bedeutet dies auch, dass alles, was unser Programm aufgerufen hat, Zugriff auf eine E / A-Funktion benötigt, um es uns geben zu können. Woher kam also die E / A-Fähigkeit? Nun, irgendwann gibt es einen Punkt, an dem der Mensch, der den Computer bedient, ein Programm aufruft. Dieser Mensch hat Zugriff auf alle Systemfunktionen, sodass er die E / A-Funktion weitergeben konnte. Wenn dieser Mensch dem von ihm ausgeführten Programm nicht vertraut, gibt er seine E / A-Fähigkeit einfach nicht an ihn weiter.

Sie können sich wahrscheinlich leicht andere Arten von Funktionen vorstellen: Internetzugang, Zugriff auf Zeichenbilder auf Ihrem Bildschirm usw. Beispielsweise kann ein sicheres Browser-Plugin-System einem nicht vertrauenswürdigen Plugin eine Grafikfunktion verleihen, mit der nur Grafiken in einem vordefinierten Rechteck gezeichnet werden können auf der Seite.

Jules
quelle
5

Eine Einschränkung der traditionell implementierten Stapelinspektion besteht darin, dass ordnungsgemäße Tail-Aufrufe unterbrochen werden. Insbesondere müssen typische Implementierungen den gesamten "Stapel" jederzeit beibehalten. Clements und Felleisen zeigen in ihrer Arbeit A Tail-Recursive Semantics for Stack Inspections in ESOP 2003 , wie dieses Problem mithilfe einer Technik namens "Continuation Marks" behoben werden kann .

Sam Tobin-Hochstadt
quelle