Java Security Sicherheit durch Classloader, Sercurtiy Manager und Co. Prof. Dr. Nikolaus Wulff Das Java Sicherheitskonzept • Java wurde von Anfang an auf Sicherheit im Internet ausgelegt. • Unsicherer Code z. B. ein Virus darf keinen Schaden zufügen und soll möglichst nicht zur Ausführung gelangen. • Java Programme werden in einem geschützten Bereich – der Sandbox – ausgeführt. Classloader Architektur Class Verifizierer Sicherheitseigenschaften der JVM und Sprache Security Manager und API Prof. Dr. Nikolaus Wulff Angewandte Informatik 2 Sandbox und JVM remote code „trusted“ sandbox localcode JVM local resources JDK 1.x model remote or local code policy class loader sandbox JVM local resources Java 2 Security Model Prof. Dr. Nikolaus Wulff Angewandte Informatik 3 Der ClassLoader • Der ClassLoader ist dafür zuständig Bytecode als Class-Dateien zu Laden und in der JVM zum Laufen zu bringen. • Er schützt die „trusted“ Java Kern Bibliotheken vor dem nachträglich zu ladenen Anwendungscode. • Es gibt immer den primären ClassLoader der JVM Runtime (rt.jar) java.lang.ClassLoader. • Klassen und somit auch die „eigenen“ ClassLoader werden durch diesen primären ClassLoader geladen. Prof. Dr. Nikolaus Wulff Angewandte Informatik 4 SecureClassLoader • „Fertige ClassLoader“ sind – java.security.SecureClassLoader – java.net.URLClassLoader • URL's können hierbei Internet Resourcen oder auch lokale Dateien und Archive sein. • Jeder ClassLoader definiert seinen „eigenen Namensraum“. – So ist es z.B. möglich ein und die selbe Klasse in verschiedenen Versionsständen quasi parallel laufen zu lassen. (Wichtig für 365x24 Anwendungen). – Es ist möglich die Klassen unterschiedlicher Domains gegeneinander abzuschotten. Prof. Dr. Nikolaus Wulff Angewandte Informatik 5 ClassLoader • Eigene Classloader können selbst entwickelt werden, z.B. um Klassen über das Internet zu laden. • Typische Funktionen sind: – Class findClass(String name) – Class loadClass(String name) – Class defineClass(String name, byte[] b, int, int) – InputStream findResourceAsStream(String name) – URL findResource(String name) – ClassLoader getParent() – ClassLoader getSystemClassLoader() Prof. Dr. Nikolaus Wulff Angewandte Informatik 6 Classloader selbst entwickeln • Classloader arbeiten verkettet. Es wird immer zuerst der Elternclassloader gefragt. • Nur wenn dieser die Klasse nicht kennt versucht der eigene Classloader die Klasse zu laden. • Eigene Classloader können bestimmte Pakete sperren, d.h. eine SecurityException wird geworfen. • Zu „trusted Packages“ dürfen keine eigenen Klassen von außerhalb hinzugeladen werden. Z. B. das Laden einer Klasse java.lang.Virus in den trusted Bereich wird mit einer SecurityException abgelehnt. Prof. Dr. Nikolaus Wulff Angewandte Informatik 7 Der Ladeprozess • Das Laden einer Klasse erfordert mehrere Schritte: • Loading: Finden und importieren der binären Daten. • Linking: Code Verifizierung, Vorbereitung und Auflösung von Abhängigkeiten – Verifizierung: sind die Daten korrekt – Vorbereitung: Speicher anfordern für Klassenvariablen – Auflösen: Symbolische Referenzen werden in konkrete direkte Referenzen innerhalb der JVM aufgelöst. • Initialisierung: Java Code zum Setzen von Startwerten für Klassenvariablen wird ausgeführt Prof. Dr. Nikolaus Wulff Angewandte Informatik 8 Class File Verifier • Hand in Hand mit dem Classloader verläuft die Verifizierung des Bytecodes. • Die JVM weiß nicht von welchem Compiler das Class-File kommt. • Im Prinzip erstellen Java Compiler gültigen Bytecode. • Jedoch ein Angreifer kann einen „eigenwilligen Compiler“ verwenden. • Vor dem Ausführen des Bytecodes wird dieser auf gültige Sprungadressen, Auflösung externer Referenzen und Binärkompatibilität etc. überprüft. Prof. Dr. Nikolaus Wulff Angewandte Informatik 9 Sicherheitsaspekte der JVM Die JVM selber ist auf Sicherheit ausgelegt: • • • • • Typkonvertierung per Cast wirft Exceptions. Keine ungültigen Feldindizes. Alle Referenzen werden auf null geprüft. Definierter Speicherzugriff, keine Pointer Arithmetik. Automatische Garbage Collection. All dies trägt wesentlich zu besseren und sicheren Anwendungen bei... Prof. Dr. Nikolaus Wulff Angewandte Informatik 10 Der Security Manager • ClassLoader schützen die Innenansicht der JVM. Sie stellen Namensbereiche bereit und kapseln ganze Klassen, Pakete und Bibliotheken. • Der Securtiy Manger sichert die Außensicht der „Sandbox“. Für viele potentielle Sicherheitslöcher gibt es eine checkXXX Methode die prüft, ob der augenblickliche Thread Erlaubniss besitzt die Operation XXX auszuführen. So prüfen z. B. checkRead und checkWrite, ob der Thread Datei IO Berechtigungen besitzt. • Diese Überprüfungen werden immer direkt von der JVM ausgeführt und werfen SecurityExceptions. Prof. Dr. Nikolaus Wulff Angewandte Informatik 11 Einige Security Aspekte • • • • • • • • • • accept/open socket connection from/to host:port waiting for connections on a local port modify a thread (priority, stop, ...) create a new class loader loading/adding classes from specified package create a new process calling System.exit loading a library which calls native code access/modify system properties read/write to a specified file Prof. Dr. Nikolaus Wulff Angewandte Informatik 12 SecurityManager laden • Beim Start einer Java Anwendung ist kein SecurityManager geladen. => Alles ist erlaubt! • Applets im Webbrowser haben immer einen SecurityManager, z.B. File-IO ist verboten... • Eine Anwendung installiert den Manager per System.setSecurityManager(...) • Sobald ein SecurityManager geladen ist lässt sich dieser nicht mehr ersetzen, erweitern oder modifizieren. • ApplicationServer installieren meist ihren eigenen ClassLoader und SecurityManager. Prof. Dr. Nikolaus Wulff Angewandte Informatik 13 Java Policies • Die Sicherheitseinstellungen werden meist als Richtlinien von außen spezifiziert. Im Verzeichnis %JRE%/lib/security sind zwei entsprechende Dateien java.policy und java.security zu finden. • Diese können und sollten für die jeweiligen eigenen Bedürfnisse innerhalb einer Organisation angepasst werden. • Ensprechende Anwendungen müssen beim Start den entspechenden SecurityManager laden... Prof. Dr. Nikolaus Wulff Angewandte Informatik 14 Auszug aus java.security # # Class to instantiate as the javax.security.auth.login.Configuration # provider. # login.configuration.provider=com.sun.security.auth.login.ConfigFile # # Default login configuration file # #login.config.url.1=file:${user.home}/.java.login.config # # Class to instantiate as the system Policy. This is the name of # the class that will be used as the Policy object. # policy.provider=sun.security.provider.PolicyFile # The default is to have a single system-wide policy file, # and a policy file in the user's home directory. policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy Prof. Dr. Nikolaus Wulff Angewandte Informatik 15 Auszug aus java.policy // Standard extensions get all permissions by default grant codeBase "file:${{java.ext.dirs}}/*" { permission java.security.AllPermission; }; // default permissions granted to all domains grant { // Allows any thread to stop itself using the // java.lang.Thread.stop() permission java.lang.RuntimePermission "stopThread"; // allows anyone to listen on un-privileged ports permission java.net.SocketPermission "localhost:1024-", "listen"; // "standard" properies that can be read by anyone permission java.util.PropertyPermission "java.version", "read"; permission java.util.PropertyPermission "java.vendor", "read"; permission java.util.PropertyPermission "java.vendor.url", "read"; • Diese Richtlinien parametriesieren entsprechende Klassen des java.security Pakets. Prof. Dr. Nikolaus Wulff Angewandte Informatik 16 Security Werkzeuge • Mit dem keytool lassen sich mit verschiedenen Verfahren Verschlüsselungssignaturen erstellen. • Jar Bibliotheken werden mit dem jarsigner Werkzeug mit Hilfe dieser Signaturen digital signiert. • Richtlinien werden in java.policies hinterlegt. • Zum Manipulieren von policy Dateien beinhaltet das JDK das Werkzeug policymanager. • Diese Tools ermöglichen einem System Adminstrator seine Sandburg dicht zu machen. Prof. Dr. Nikolaus Wulff Angewandte Informatik 17 policymanager • Richlinien mit dem policymanager bearbeiten. Prof. Dr. Nikolaus Wulff Angewandte Informatik 18 SecurityManager entwickeln • Die java.lang.SecurityManager Implementierung verwendet die java.policy Datei. • SecurityManager ist ein abstrakte Klasse und kann nicht direkt instanziert werden. Viel Code für einen eigenen SecurityManager ist nicht notwendig: System.setSecurityManager( new SecurityManager(){ // no own implementation } ); • Diese innere Klasse reicht bereits aus. Es können jedoch auch Methoden explizit überladen werden. Prof. Dr. Nikolaus Wulff Angewandte Informatik 19 Eigener SecurityManager public class TestSecurityManager extends SecurityManager { @Override public void checkWrite(String name) throws SecurityException { System.out.println("checkWrite " + name); if (name.startsWith("~/") || name.charAt(0)!='/') { // OK } else { throw new SecurityException("no write grants"); } } } • Beispiel für einen einfachen SecurityManager, der nur das Schreiben unterhalb des Home Verzeichnisses erlaubt. Keine besonders gute Implementierung ;-) Prof. Dr. Nikolaus Wulff Angewandte Informatik 20