15.1.1 | Bytecode-Verifier und SecurityManager |
Die Sicherheit der Laufzeitumgebung beruht bei Java auf einem zweistufigen Konzept: Dem Bytecode-Verifier, der ein Teil der Virtual Machine ist, und der Klasse SecurityManager, die zur Laufzeit Zugriffskontrollen durchführt.
Insbesondere bei der Ausführung von Applets, die aus dem Internet heruntergeladen und ausgeführt werden, ist es wichtig, die Integrität des Bytecodes sicherzustellen. Ohne besondere Prüfungen vor der Ausführung könnte man sonst nicht gewährleisten, dass der Bytecode bösartige Befehlssequenzen enthält. Genau diese Aufgabe übernimmt der Bytecode-Verifier.
Der Bytecode-Verifier prüft den Code vor der Ausführung auf Korrektheit. Dadurch kommt der Bytecode nur dann im Browser zur Ausführung, wenn er korrekt ist und keine unerlaubten Befehlskombinationen enthält. Code, der gegen die Regeln des Bytecode-Verifiers verstößt, wird erst gar nicht ausgeführt.
Der nächste Schritt ist die Überwachung des Applets zur Laufzeit durch den SecurityManager. Der SecurityManager überprüft bei einer sicherheitsrelevanten Operation, ob sie ausgeführt werden darf oder nicht. Automatisch beim Start des Browsers bzw. des Appletviewers wird auch der SecurityManager gestartet. Dieser bleibt aktiv, bis der Browser bzw. Appletviewer beendet wird. Die Implementierung des SecurityManagers ist bei Applets vom Browser bzw. Appletviewer vorgegeben und kann nicht innerhalb eines Applets ersetzt werden.
Wird innerhalb eines Applets eine unerlaubte Operation ausgeführt, löst dies bis einschließlich JDK 1.1 eine SecurityException, seit JDK 1.2 eine AccessControlException aus.
Die hier dargestellten Kontrollen sind bei Applets besonders wichtig, sie können aber auch bei Applikationen durchgeführt werden. Bei Applikationen ist standardmäßig kein SecurityManager aktiv, so dass diese stets Vollzugriff haben. Allerdings kann der SecurityManager auch eingesetzt werden, um Applikationen abzusichern, beispielsweise wenn sich eine Applikation als RMI-Client Code über das Netz herunterlädt und lokal ausführt. In diesem Fall kann sich eine Applikation gegen unerwünschte Zugriffe des heruntergeladenen Codes schützen, in dem sie einen SecurityManager aktiviert. Auch der Bytecode-Verifier kommt dann bei Applikationen standardmäßig zur Ausführung.
Mit seinen Kontrollen realisiert der SecurityManager das bereits erwähnte Sandbox-Prinzip. Der Ausdrück rührt daher, dass die Anwendung in einem geschützten Bereich läuft, aus dem sie nicht ausbrechen kann. Jede sicherheitskritische Operation wie Zugriffe auf lokale Dateien löst eine Abfrage des SecurityManager aus. Nur dann, wenn dieser den Zugriff gewährt, kann das Programm aus der Sandbox heraus.