Java Security

Werbung
Java Security
Sicherheit durch Classloader, Security 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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
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
Informatik III
17
policymanager
• Richlinien mit dem policymanager bearbeiten.
© Prof. Dr. Nikolaus Wulff
Informatik III
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
Informatik III
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
Informatik III
20
Herunterladen