TM JAVA Sicherheit Vortragender: Daniel Nowak Folie: 1 Übersicht Das Basis-Sicherheitskonzept der Java Virtual Machine • Sandbox • Der Class Loader • Der Class File Verifier • Der Security Manager Neue Sicherheitsmechanismen in Java 2 • Sicherheitsstrategien(Policy) • Zugriffskontrolle – • Stack Inspection Objekte des neuen Sicherheitskonzeptes • policytool Identity Permission Access Contoller Protection Domain Policy Cryptografie Folie: 2 Motivation • höchst populäre Entwicklungsplattform mobiler Code - • dynamischer Download Komponenten-basiert ... wichtig für e-Commerce Millionen Internetnutzer (Netscape Navigator, Internet Explorer) Browser bringen ihre eigene VM mit Javas Portabilität erlaubt es, Applets an Webpages anzuhängen • ...und Entwickler von Java-Programmen Java bietet viel bezüglich Sicherheit: • Crypto APIs • Sicherheitsmechanismen in der Sprache/Architektur schwierig, unsicheren Code zu schreiben ...das heißt aber nicht, sichere Programmentwicklung in Java ist trivial Folie: 3 Gefahrenquelle: ausführbarer Code 4 Klassen von Sicherheitsangriffen: Sicherheitsangriff Java Sicherheit Systemmodifikation Invasion of Privacy Denial of Service „Belästigung/Täuschung“ stark stark schwach schwach Java dämmt diese Gefahr ein durch: • JVM lässt den Code nur in abgesichertem Bereich laufen („Sandbox“) strikte Zugriffskontrolle auf das umgebene System • Bytecode wahrt das Sandbox-Prinzip • Programmiersprache Folie: 4 Java als Sprache Java als Sprache scheint wichtig zu sein: • keine Pointer-Arithmetik • Garbage Collection • automatisches Prüfen von Arraylängen • strenge Typisierung • Zugriffsrechte • Exception Handling • Objektorientierung(Data-Hiding, Abstaktion,Kapselung) keine ungültigen Speicherzugriffe keine illegalen Casts, Objektzugriffe Einschränkung der Sichtbarkeit von Elementen Sicherheitsdesign Aber wichtiger ist die zugrunde liegende JVM ! Portabilität durch Java Source Code Bytecode Bytecode Folie: 5 Das Basis-Sicherheitskonzept der JVM • Konzept der sicheren Sandbox für Java-Programme • Die Sandbox wird durch 3 eng zusammenwirkende Teile realisiert: – Class Loader • – separiert geladene von lokalen Klassen Class File Verifier • – Verifikation aller Klassen, die in die Sandbox geladen werden v.a. Gewährleistung der Typsicherheit Security Manager • überprüft (Datei-,...)Zugriffsversuche außerhalb der Sandbox zur Laufzeit Folie: 6 Die Sandbox-Restriktionen Was soll verhindert werden? – – Veränderungen am Browsersystem(z.B. durch Systemaufrufe, Dateiupdates) lokaler Speicherzugriff: • • – – – – – – – – – • unerlaubtes Lesen/Schreiben von Dateien,Umgebungsvariablen Löschen, Anlegen von Dateien/Verzeichnissen Auslesen von Verzeichnissen Aufbau von Netzwerkverbindungen(„phone home“-Regel) Portlistening System-Properties auslesen/setzen (user.name ...) willkürliche Programmausführung(Runtime.exec()) Terminierung des Java Interpreters Dynamisches Laden von Libraries Manipulation von Threads Installieren eigener Class Loader, Security Manager Überschreiben oder Korruption von System-Klassen Folie: 7 Der Class Loader ...ist dafür verantwortlich, alle verschiedenen Teile eines Programmes zusammenzubringen, damit es ausführbar ist. Class Loader Bytecode JVM Internet Folie: 8 Der Class Loader Aufgaben: – Laden,Trennen und Verwalten von Klassen – Einteilung in sicher/unsicher Schutz der Java System-Klassen Anmerkungen: o Verhindern von Überschreibung vertrauenswürdiger JVM-Klassen durch gleichnamige Klassen von einem Webserver o Erzeugung konkreter Klassen erst nach dem Verifikationsprozess o Zugriffsrechte auf Elemente innerhalb der Systemklassen-Packages ( java.* ) müssen geschützt werden(Sichtbarkeitsbeschränkungen) Eigene Klassen dürfen deshalb nicht diesen Packages hinzugefügt werden. Folie: 9 Class Loader Implementierungen • 1 eingebauter Class Loader(Primordial Class Loader), der für das Laden der System-Klassen verantwortlich ist • meist in C geschrieben volle Rechtevergabe an geladene Klassen es kann bel. viele zusätzliche Class Loader geben • • für Web-Browser z.B. gibt es den Applet Class Loader für jeden zusätzlichen ClassLoader kann es mehrere Instanzen geben – eine pro Codebase • damit: eigene Namespaces keine Namenskollisionen keine Sichtbarkeit zwischen Namespaces » » » Folie: 10 Class Loader Hierarchie Bei der Suche nach Klassen wird eine Class Loader-Hierarchie durchlaufen: direkte Kommunikation zwischen Class Loadern • Suchreihenfolge: System-Klassen lokale Klassen Abgeleitete Class Loader(Java2): Remote-Klassen Applikation Applet Primordial Class Loader java.lang.ClassLoader java.security.SecureClassLoader java.net.URLClassLoader AppletClassLoader System-Klassen Folie: 11 Class Loader Interaktion Ablauf für das Laden einer Klasse über das Netz: 1 verantwortlicher AppletClassLoader wird kontaktiert 2 lokaler Cache des AppletClassLoaders wird durchsucht 3 Anfrage an Primordial ClassLoader 4 Laden der Klasse vom Host Folie: 12 Der Class File Verifier ...prüft, ob das Programm nach den Regeln der JVM läuft • das bedeutet nicht unbedingt, dass das Programm die Regeln von Java als Sprache befolgt Class Loader Regeln Bytecode JVM Class File Verifier Class Internet Folie: 13 Java Bytecode ...ist die Maschinensprache der JVM. Beibehaltung des oo-Konzepts Sicherheitstechnische Aspekte für die Verifikation von Bytecode: korrupter Java Cross-Compiler generiert Bytecode aus unsicherer Sprache (Cobol,Delphie) Umgehung des Java Sicherheitskonzepts Folie: 14 Aktivierung des Class File Verifier Wann wird der Class File Verifier benötigt? JVM initiiert das Laden von Klassen PrimordialClass Loader für SystemKlassen Applet Class Loader holt Klassen über das Netz Class File Verifier In Java 2 auch Applikationen (URLClassLoader) Folie: 15 Bytecode-Verifikation Die 4 Phasen der Verifikation: – Datei-Integrität überprüfen • – Klassen-Integrität überprüfen • • – Superklasse(wenn vorhanden) nicht final Name und Signatur von Methoden und referenzierten Klassen Bytecode-Integrität überprüfen • • • – Format(0xCAFEBABE),Länge Datenfluß-Analyse Stack-Checking statische Typüberprüfung Laufzeit-Integrität überprüfen • dynamische Typüberprüfungen Folie: 16 E x e p t i o n s Der Security Manager Der Security Manager überwacht potentiell gefährliche Operationen auf dem OS. mobiler Code JVM Security Manager ja nein Exception OS-Calls Folie: 17 Der Security Manager Ursprüngliches Konzept in Java 1.1: definiert check-Methoden, die kritische Aktionen überwachen - z.B. checkRead, checkAccess, checkExit, checkConnect - insg. 29 Methoden Applikationen bringen meist eigene Implementierung des Security Manager mit. - fein-körnige Kontrolle möglich, aber umständlich (besser:Java2) Für Applets gilt der Security Manager des Browsers. - ...ist für die Sandbox-Restriktionen verantwortlich Jede laufende JVM hat max. 1 Security Manager! - kann nicht ausgetauscht werden! enge Kooperation zwischen Security Manager und Class Loader Folie: 18 Erweiterung des Sicherheitsmodells zu klärende Anforderungen: – WOHER kommt der Java-Code bzw. WEM kann ich trauen? – – WAS darf das Programm tun? – – Signaturen, Zertifikate Permissions (bzw.Rechte) WIE kann ich die Vertraulichkeit der Daten sichern, die mein Applet verarbeitet? Die Antwort hierauf ist Cryptographie. ...in Java gibt es hierzu die APIs JCA und JCE. Folie: 19 Sicherheit auf API-Level • Java Cryptographie Architecture (JCA 1.2) -- im JDK enthalten besteht aus 5 Packages: – – – – – • java.security java.security.acl java.security.interfaces java.security.spec java.security.cert Java Cryptographie Extension (JCE) -- nur für US und Canada java.crypto.* Standardisierung von sicheren Streams, Key-Generatoren, Cipher Support Folie: 20 Java Cryptographie Architecture flexibles Framework: Verschiedene Provider können ihre eigenen Implementationen der Cryptographie-Tools und anderer administrativer Funktionen anbieten. Provider 3 Provider 2 Algorithmus A Provider 1 Algorithmus A Algorithmus B Algorithmus A Algorithmus B Algorithmus C Engine Classes Signature KeyPair User Code MessageDigest Algorithmus B Algorithmus C etc... Algorithmus C Folie: 21 Rechtevergabe Frage: Was darf ein fremdes Programm auf meinem System tun? 2 Ansätze: – JDK1.1 • Schwarz-Weiß-Prinzip (Sandbox) – vertrauenswürdig -- nicht vertrauenswürdig Java 2 • Graustufen-Prinzip dosierbare Vergabe von Rechten flexibel z.B. Satz von Rechten für Videokonferenz-Applets Folie: 22 Java 2 Grundidee: Jeder Code läuft unter einer Sicherheitspolitik, welche Programmen verschiedene Rechte zuordnet! wichtiger Punkt in Java 2-Sicherheitsmodell: Code-Signatur Signaturen allein lassen aber keine graduelle Entscheidungen über Rechtevergabe für Programme zu. Zugriffskontrollmechanismen 4 zentrale Capabilities: • • • • fein dosierte Zugriffskontrolle konfigurierbare Sicherheitspolitik erweiterbare Zugriffskontrollstruktur Sicherheitsprüfung für alle Programme Folie: 23 Java 2 Sicherheitskonzept Java Runtime Bytecode Identity Code Source Signers Policy Access Controller " Stack Inspection Grundstein für Java2 Sicherheit: policy (java.security.Policy) Ausführbarer Code wird durch seine Herkunfts-URL und Signatur kategorisiert. Solchen (URL,Signatur)-Paaren werden dann Zugriffsrechte zugeordnet Folie: 24 Sicherheitselemente-Identity+Permission Version von SUN: – Identity » Basis für sicherheitskritische Entscheidungen Herkunft Signatur java.security.CodeSource – URL public key Permission » » Kapselung sicherheitskritischer Anfragen(System-Calls) abstrakt: java.security.Permission target action java.security.Permission eigene Permissions FilePermission SocketPermission PropertyPermission RuntimePermission NetPermission AWTPermission Folie: 25 Sicherheitselemente - Policy – Policy » » Zuordnung von Identity und Permissions zu Code (Matrix) (ähnlich dem Security Manager) Benutzerdefiniert policytool grant CodeBase „http://www.example.com/users/dummy“ , SignedBy „*“ { permissions java.io.FilePermission „read,write“ , „/applets/tmp/*“; permissions java.net.SocketPermission „connect“ , „*.example.com“; }; » » » » Laufzeit-Repräsentation: java.security.Policy Default-Policy = Sandbox Plaintext in policy-Datei: default: <java_home>/lib/security/java.policy benutzerdefiniert: <user_home>/.java.policy Spezielle Policy kann bei Applikation angegeben werden: appletviewer -Djava.policy==/home/users/dummy/policy <applet> Folie: 26 Sicherheitselemente-Protection Domain – Protection Domain logisches Konstrukt zur Gruppierung von Objekten Objekte sind eindeutig Protection Domains(PD) zugeordnet Class Loader Konzept spezielle Domain: System Domain für System-Klassen(haben alle Rechte) a.class b.class c.class d.class PD A Permissions PD B Permissions Klasse Domain Permission Folie: 31 Sicherheitselemente-Secure Class Loader • Secure Class Loader – – » • Implementierung des abstrakten Class Loader zuständig für das Laden jeden Javacodes(Ausnahme: built-in-Klassen) insbesondere für das Tracking von CodeSource und Signatur des mobilen Codes Applikationen in die Sandbox bringen – – – CLASSPATH kann beibehalten werden Applikationen in CLASSPATH werden vom URLClassLoader geladen !! ...und sind damit Gegenstand von Sicherheitsüberprüfungen für System-Klassen gibt es ab JDK 1.2 einen neuen Pfad: Xbootclasspath ...und werden mit dem Primordial ClassLoader geladen Folie: 32 Sicherheitselemente-Security Manager – Security Manager kann zur Laufzeit ausgetauscht werden! » Sicherheitsüberprüfung bei Instanziierung und Installation: RuntimePermission(„createSecurityManager“) RuntimePermission(„setSecurityManager“) » » » definiert ein allgemeines Interface für Sicherheitsüberprüfungen alle check-Methoden durch checkPermission ersetzt bzw. neu implementiert weiter an Access Controller z.B.: public void checkLink(String lib){ checkPermission(new RuntimePermission(„loadLibrary.“+lib); } Folie: 33 Sicherheitselemente-Access Controller – Access Controller (final) java.security.AccessController • • • eigentliche Sicherheitsüberprüfung Unter welchen Umständen ist eine Anfrage (nicht)erlaubt? Implementierung des Stack Inspection Algorithmus Der Access Controller ist für die Zugriffsauthorisierung vor jedem sicherheitskritischen Zugriff verantwortlich Eine Klasse kann auch dynamisch Stack Ins. initiieren: checkPermission(Permission p) Der Access Controller führt dann die entsprechende Stack Ins.(checkPrivilege()) durch und liefert eine Entscheidung: - AccessControlException Zugriff erlaubt Folie: 34 Stack Inspection - allgemein Zu klären: Wer darf welche kritischen Aktionen ausführen? Kontext: Thread Jeder Ausführungsthread hat einen eigenen Laufzeit-Stack. Jeder Stack besteht aus Frames. Jeder Frame besteht aus Methodenaufruf(Klasse) + Protection Domain Der aktuelle Kontext wird vollkommen durch die aktuelle MethodenaufrufSequenz bzw. Protection-Domain-Sequenz beschrieben. Beispiel: Spiele-Applet versucht, eine HighScore-Datei zu öffnen AccessController.checkPermission() System Domain java.io.FileInputStream() openHighScoreFile() Stack Protection Domain A Folie: 35 Stack Inspection Problem: Applikation kann unsicheren Code enthalten.(oder andersherum) Java Applikation (z.B. Browser) untrusted Code vertrauenswürdig? Call Java System Library Folie: 36 Stack Inspection - Beispiel Unsicherer UserCode verwendet vertrauenswürdigen Code. User Code Change Passwort- Datei öffnen Applikation Wie funktioniert das? AccessController bietet hierfür die Methode doPrivileged(). Damit wird der JRE signalisiert, dass der Status der aufrufenen Klasse(Methode) zu ignorieren ist. Idee: Kapselung sicherheitskritischer Operationen in kleinstmögliche Blöcke. Java wrappt den gesamten enable/disable-Prozeß in ein Interface,das mit dem AccessController angesprochen werden kann: interface PrivilegedAction{ Object run(); } Folie: 37 Stack Inspection - Beispiel Unsicherer UserCode verwendet vertrauenswürdigen Code. User Code Change Passwort- Datei öffnen Applikation Die Change Passwort-Applikation würde dementsprechend folgenden Code beinhalten: public void changePassword(){ //eigene Rechte zum Öffnen der Datei benutzen AccessController.doPrivileged(new PrivilegedAction(){ public Object run(){ //Datei öffnen ... return null; } }); //altes und neues Passwort verifizieren... } Folie: 38 Stack Inspection - Algorithmus checkPrivilege(target){ //loop, newest to oldest stack frame foreach stackFrame{ if(local policy forbids access to target by class executing in stackFrame) throw ForbiddenException ; if(stackFrame has enabled privilege for target) return; if(stackFrame has disabled privilege for target) throw ForbiddenException ; } } Stack Ins. Algorithmus, wie er im Access Controller implementiert ist Folie: 39 Access Controller – Security Manager Access Controler versus Security Manager • • • Access Controller immer installiert -Sicherheitsüberprüfungen immer gewährleistet Access Controller garantiert Stack Inspection Algorithmus – eigener Security Manager kann u.U. einen korrupten Stack Ins. Algorithmus anbieten doPrivilege() nur in Access Controller unterstützt, nicht unbedingt in Security Manager – dieser Mechanismus könnte also u.U. ignoriert werden Folie: 40 Quellen Bücher: O Securing Java von Gary McGraw, Edward W. Felten O Java Network Security von Robert McGregor et. al. O Inside Java2 Platform Security von Li Gong Webressourcen: Security Tutorial von Sun Folie: 41