Hallo, in Java lässt sich der Zugriff auf manche Ressourcen (Netzwerk, Dateisystem, usw) durch einen Security Manager und eine Policy einschränken. Dabei ist es auch möglich, einzelnen Komponenten/Libraries selektiv den Zugriff zu erlauben bzw. zu verbieten. Wie ist das aber technisch genau umgesetzt? Die eigentlichen Syscalls müssen ja von der VM aufgerufen werden, das geht ja in reinem Java nicht. An welcher Stelle werden nun die entsprechenden Checks durchgeführt? Ist das in die VM hart reingecodet oder in der Class Library zu finden? Laut Oracle Doku (https://docs.oracle.com/javase/7/docs/api/java/lang/SecurityManager.html) ist das folgendermaßen: The SecurityManager class contains many methods with names that begin with the word check. These methods are called by various methods in the Java libraries before those methods perform certain potentially sensitive operations. Daraus schließe ich, dass diese Checks in der Class Library durchgeführt werden. Was hindert einen jetzt aber daran, den entsprechenden Code aus der Class Library selber zu implementieren und diese Checks einfach zu löschen? Könnte man dann nicht einfach von unpriviligiertem Code aus auf alle Ressourcen zugreifen? Viele Dank schonmal für jegliche Klarstellung
Interessante Frage. Wenn wir als Beispiel mal den FileReader aus dem Artikel, den du verlinkt hast, nehmen. Der kreiert intern einen FileInputStream, und der wiederum sieht so aus:
1 | public FileInputStream(File paramFile) |
2 | throws FileNotFoundException |
3 | { |
4 | String str = paramFile != null ? paramFile.getPath() : null; |
5 | SecurityManager localSecurityManager = System.getSecurityManager(); |
6 | if (localSecurityManager != null) { |
7 | localSecurityManager.checkRead(str); |
8 | } |
9 | if (str == null) { |
10 | throw new NullPointerException(); |
11 | } |
12 | if (paramFile.isInvalid()) { |
13 | throw new FileNotFoundException("Invalid file path"); |
14 | } |
15 | this.fd = new FileDescriptor(); |
16 | this.fd.attach(this); |
17 | this.path = str; |
18 | open(str); |
19 | } |
Hier finden also die Checks ganz normal in Java implementiert statt. Interessant wird es in der open Funktion, die auch noch Java ist:
1 | private void open(String paramString) |
2 | throws FileNotFoundException |
3 | { |
4 | open0(paramString); |
5 | } |
Und open0 ist jetzt eine native API. Das 0 deutet immer auf die nativen Syscallwrapper hin:
1 | private native void open0(String paramString) |
2 | throws FileNotFoundException; |
JCL schrieb: > Die eigentlichen Syscalls müssen ja von der VM aufgerufen werden, das > geht ja in reinem Java nicht. Jap. Die meisten nativen Funktionen sind in libjava.so bzw java.dll implementiert. Und da finden wir auch in den Exports:
1 | RVA Name |
2 | 00002B38 Java_java_io_FileInputStream_open0 |
Diese Funktion implementiert keine weiteren Checks. Wenn du es also schaffen würdest, open() oder open0() aus deiner Java-App zu callen, dann hast du den SecurityManager umgangen. Das Problem ist aber, dass sowohl open() als auch open0() private deklariert sind. Und darauf beruht die Sicherheit des ganzen :)
:
Bearbeitet durch User
Felix U. schrieb: > Das Problem ist aber, dass > sowohl open() als auch open0() private deklariert sind. Und darauf > beruht die Sicherheit des ganzen :) Ah okay, clever. Vielen Dank für die ausführliche Erklärung. Ich beschäftige mich an meiner Uni gerade mit einem Paper über die Sicherheit des Security Managers, dabei kam mir beiläufig die Frage auf, wie das eigentlich auf unterster Ebene gelöst ist. Im Prinzip ist das ja ein mächtiges Konzept, aber gibt es heutzutage überhaupt noch Anwendungen, die Gebrauch vom Java Security Manager machen? Java Applets in Webseiten scheinen ja langsam auszusterben, auf Android wird zwar viel Java eingesetzt, die Berechtigungen sind aber, soweit ich weiß, alle auf OS Ebene, zumal jede App ja auch nativen Code ausführen kann. Tomcat zB. scheint das zumindest optional vorzusehen, um eine zusätzliche Schicht an Sicherheit zu haben, falls man irgendwo sonst was falsch konfiguriert: https://tomcat.apache.org/tomcat-7.0-doc/security-manager-howto.html
JCL schrieb: > gibt es heutzutage > überhaupt noch Anwendungen, die Gebrauch vom Java Security Manager > machen? Gute Frage. Außer Applets und Apps (theoretisch) würde mir auch kein Szenario einfallen wo das sinnvoll ist. Ganz abgesehen davon, dass das ganze System ja von Beginn an so schlecht implementiert war, dass es zu jeder Zeit ein oder mehrere Lücken gab über die man aus Applets in einen Kontext mit Schreib- und Ausführrechten gekommen ist. Insofern ist wohl auch das Vertrauen in dieses "Sicherheitsfeature" nicht wirklich groß.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.