Forum: PC-Programmierung Java Security Manager - Funktionsweise


von JCL (Gast)


Lesenswert?

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

von Felix U. (ubfx)


Lesenswert?

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
von JCL (Gast)


Lesenswert?

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

von Felix U. (ubfx)


Lesenswert?

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
Noch kein Account? Hier anmelden.