Westfälische Wilhelms-Universität Münster Ausarbeitung JavaME Sicherheitskonzepte Im Rahmen des Seminars Mobile Java Julian Chandra Hauck Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Christian Hermanns Institut für Wirtschaftsinformatik Praktische Informatik in der Wirtschaft Inhaltsverzeichnis 1 Vorwort...................................................................................................................... 3 2 Sicherheitskonzepte auf Laufzeitumgebungsebene ................................................... 4 3 4 2.1 Das Sandkasten Modell der KVM .................................................................... 4 2.2 Der Verifikationsprozess der KVM .................................................................. 5 Sicherheitskonzepte auf Konfigurationsebene .......................................................... 7 3.1 Einschränkungen der CDC ............................................................................... 7 3.2 Einschränkungen der CLDC............................................................................. 7 Sicherheitskonzepte auf Profilebene.......................................................................... 9 4.1 Profile für CDC................................................................................................. 9 4.2 Protection domains des MIDP 2.0 .................................................................. 10 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.4 5 Permissions ................................................................................................. 10 Protection domains ..................................................................................... 11 Zertifizierung eines MIDlets....................................................................... 12 Die Security and Trust Services API .............................................................. 13 Integritätsprüfung einer Nachricht.............................................................. 14 Authentifizierung einer Nachricht .............................................................. 15 Vertraulichkeit von Nachrichten................................................................. 17 Sichere Netzwerkprotokolle im MIDP 2.0 ..................................................... 19 Fazit ......................................................................................................................... 20 Literaturverzeichnis ........................................................................................................ 21 II Kapitel 1: Vorwort 1 Vorwort Neben der Einfachheit der Sprache, sind die zu Grunde gelegten Sicherheitskonzepte einer der Hauptgründe weshalb Java bzw. die Java Virtual Machine (JVM) so populär geworden ist. Die eingeschränkten Ressourcen mobiler Endgeräte und die Form der Kommunikation zwischen diesen verlangt ein vernünftiges Sicherheitskonzept auf Sprach-, Compiler- und Laufzeitumgebungsebene. Programme, die dynamisch heruntergeladen und ausgeführt werden, sowie Funkkommunikation stellen zwei typische Herausforderungen an die Integrität eines Systems dar. Im Rahmen dieser Arbeit werden die Sicherheitskonzepte der JavaME erläutert. Als einen Einstieg zu den hier nicht erläuterten allgemeinen konzeptionellen Grundlagen der JavaME, empfiehlt sich die Lektüre eines Grundlagen Buchs, wie z.B. [BrMo06]. Die Struktur dieser Arbeit ist eine „bottom-up“ Betrachtung des Aufbaus einer JavaME Implementierung. Beginnend mit den Sicherheitskonzepten der Kilobyte Java Virtual Machine (KVM) (Kapitel 2) auf unterster Ebene werden das Sandkasten Modell der KVM (Unterkapitel 2.1) sowie der zweistufige Verifikationsprozess (Unterkapitel 2.2) erläutert. Danach werden die Sicherheitskonzepte der darauf aufsetzenden Konfigurationsebene (Kapitel 3) betrachtet und dabei zwischen der für PDA’s und ähnliche Geräte erdachten Connected Device Configuration (CDC) (Unterkapitel 3.1) und der für Mobiltelefone erdachten Connected Limited Device Configuration (CLDC) (Unterkapitel 3.2) unterschieden. Schließlich folgen die Sicherheitskonzepte der Profilebene (Kapitel 4). Einer Zusammenfassung der Sicherheitskonzepte der CDC Profile (Unterkapitel 4.1) folgt eine Erläuterung zur Anforderung spezieller Rechte für MIDlet’s über die Sicherheitsdomänen des Mobile Information Device Profile 2.0 (MIDP 2.0) (Unterkapitel 4.2). Konzepte zur Implementierung von Integritäts-, Authentizitäts- und Vertraulichkeitsfunktionalität werden im Zusammenhang mit der Security and Trust Service API (SATSA) erläutert (Unterkapitel 4.4). Abschließend werden die Möglichkeiten zum Aufbau sicherer Netzwerkberbindungen behandelt (Unterkapitel 4.5). 3 Kapitel 2: Sicherheitskonzepte auf Laufzeitumgebungsebene 2 Sicherheitskonzepte auf Laufzeitumgebungsebene Über Mechanismen auf Laufzeitumgebungsebene muss sichergestellt werden, dass die Ausführung eines Programms das unterliegende System niemals destabilisiert. Normale JVM Implementierungen erlauben lokalen Programmen den Zugriff auf Systemressourcen (trusted execution). Wenn Code von außerhalb des Systems ausgeführt wird, muss dieser mit Einschränkungen bezüglich des Zugriffs auf Systemressourcen rechnen (untrusted execution). Diese Ausführung findet in einem so genannten Sandkasten statt und wird mit der Klasse SecurityManager kontrolliert. Direkte Speicherzugriffe sowie Zugriffe auf Bereiche außerhalb eines Arrays sind nicht möglich. Da das komplette Sicherheitskonzept einer JVM für Geräte mit geringen Kapazitäten zu speicherintensiv ist, wurde ein einfacheres Sicherheitsmodell für die KVM entworfen. Im Folgenden werden das Sandkasten Modell der KVM (Unterkapitel 2.1) sowie der zweistufige Verifikationsprozess (Unterkapitel 2.2) näher erläutert. 2.1 Das Sandkasten Modell der KVM Der Sandkasten (engl. sandbox) einer KVM ist eine Umgebung, in der ein einzelnes MIDlet ausgeführt wird. Das Nachladen von benötigten Klassen ist auf das JAR des MIDlets beschränkt, sodass MIDlets vollständig voneinander gekapselt sind. Zugriffe auf Geräte oder das System sind nur indirekt über die APIs von Konfigurationen, Profilen, optionalen Paketen und geräteherstellerspezifischen Bibliotheken möglich (vgl. Abbildung 1). System API der optionalen Pakete KVM Sandkasten API des Geräteherstellers MIDlet API des Profils API der Konfiguration Abbildung 1: Das Sandkasten Modell der KVM 4 Kapitel 2: Sicherheitskonzepte auf Laufzeitumgebungsebene Die Stabilität des unterliegenden Systems hängt damit von der richtigen Implementierung des Sandkastens auf Herstellerseite ab. Anwendungen können, abgeschirmt durch den Sandkasten, nicht mehr das unterliegende System destabilisieren. Es bleibt einer Implementierung überlassen, ob sie die parallele Ausführung mehrerer MIDlets in jeweils eigenen Sandkästen erlaubt. 2.2 Der Verifikationsprozess der KVM Die Implementierung einer KVM muss beim Starten eines MIDlets erkennen können, ob es sich möglicherweise um ein ungültiges JAR bzw. um ungültige classfiles handelt. Die Verifikation in einer JavaSE Implementierung benötigt mit seinen 30-100 KB dynamischen Speicher zu viel Kapazitäten für ein ressourcenbeschränktes CLDC Gerät. Daher wurde ein zweistufiger Verifikationsprozess erdacht, der den Speicherverbrauch auf unter 100 B senken kann, ohne jedoch Einschränkungen bei der Sicherheit vorzunehmen (vgl. [JSR30]). Die Verifikation wird dazu in eine off-device preverification und eine in-device verification zur Laufzeit zerlegt (vgl. Abbildung 2). Abbildung 2: Einordnung der Verifikation in den Prozess der Entwicklung und Nutzung Die Präverifikation, die normalerweise auf einer ressourcenstärkeren Hardware wie einem PC oder Server ausgeführt wird, tauscht jsr, jsr_w, ret und wide ret 5 Kapitel 2: Sicherheitskonzepte auf Laufzeitumgebungsebene Bytecodes mit semantisch gleichen Befehlen aus. Im nächsten Schritt werden jeder Methode der classfile zusätzliche Informationen, so genannte stack map Attribute, hinzugefügt. Die stack maps beschreiben den Typ der lokalen Variablen und der Elemente auf dem Operandenstack, welche zusammen auf dem Interpreterstack liegen (Für eine formale Definition der stack maps vgl. Appendix 1 von [JSR139]). Dieser Vorgang erhöht die Größe der Datei zwar ca. um fünf Prozent (vgl. [KVM]), erlaubt dem Gerät aber die Verifikation mit verringertem dynamischen Speicherbedarf und weniger VM Code. Die classfiles sind, dank des erweiterbaren Attribut Mechanismus von classfiles, aufwärts kompatibel zu Überprüfungen mit JavaSE und JavaEE Umgebungen, die die stack maps bei der Verifikation einfach ignorieren. Die in-device verification besteht im wesentlich aus vier Schritten (vgl. [JSR139]: • Im ersten Schritt wird der Bytecode linear gescannt und die Typen der lokalen Variablen und der Stackelemente in einem vorher dafür reservierten Speicher abgelegt. Es wird im weiteren Verlauf der Verifikation kein weiterer Speicher mehr reserviert. • Als nächstes folgt eine Initialisierung, in der der this Zeiger den abgeleiteten Typen der Instanzmethoden zugewiesen, Argument Typen und ein leerer Operandenstack initialisiert werden. • In diesem Schritt wird der Bytecode erneut linear gescannt und die stack maps mit den Wirkungen der Instruktionen abgeglichen bzw. die Typen entsprechend der stack maps gesetzt. • Als letztes wird sichergestellt, dass die letzte Instruktion der Methode ein unbedingter Sprung, eine Rückgabe, athrow, tableswitch oder lookupswitch ist. Zusätzlich zu den oben erwähnten Maßnahmen, wird in der Verifikation dafür gesorgt, dass Konstruktoren für nicht initialisierte Objekte nur genau einmal aufgerufen werden, dass die einzig legale Aktion auf nicht initialisierten Objekten der Aufruf des Konstruktors ist und dass nicht initialisierte lokale Objektvariablen bei alternativem Programmablauf nicht mehr auf dem Operandenstack liegen. Eine Unregelmäßigkeit im Verifikationsprozess führt zu einer Ablehnung der Klasse und somit zu einer Verhinderung der Ausführung. 6 Kapitel 3: Sicherheitskonzepte auf Konfigurationsebene 3 Sicherheitskonzepte auf Konfigurationsebene Es gibt z. Zt. zwei Implementierungen auf Konfigurationsebene. Die Connected Device Configuration (CDC), die für PDA’s und vergleichbare Geräte entworfen wurde (Unterkapitel 3.1) sowie die Connected Limited Device Configuration (CLDC), die auf mobile Endgeräte wie Handys zugeschnitten ist (Unterkapitel 3.2). Im Folgenden wird im Wesentlichen auf die sicherheitsrelevanten Unterschiede und Einschränkungen dieser Konfigurationen gegenüber der JavaSE eingegangen. 3.1 Einschränkungen der CDC Eine CDC Implementierung (vgl. [JSR36] für CDC 1.0.2 und [JSR218] für CDC 1.1.2) hat wesentlich umfangreichere Anforderungen an die Hardware als eine CLDC Implementierung. Daher konnten viele Sicherheitskonzepte der JavaSE portiert werden. Unter anderem fordert die Konfiguration eine vollständige Java Virtual Machine (JVM). Im Folgenden sind die sicherheitsrelevanten Merkmale aufgeführt: • Die Verifikation von Klassen wurde komplett übernommen. • Mit so genannten signed classes wird mit Zertifikaten die Integrität und Herkunft von Klassen gegenüber der JVM verifiziert und authentifiziert (zur Authentifizierung und Integritätsprüfung vgl. 4.3.2) und damit eine Möglichkeit geschaffen, Programme über Sicherheitsdomänen (engl. protection domains) mit unterschiedlichen Rechten auszustatten. • Die aus der JavaSE übernommenen security policies erlauben die Kontrolle der Zugriffsrechte von ausgeführtem Code. • Das komplette Security package ist aus der JavaSE übernommen. 3.2 Einschränkungen der CLDC Die CLDC ist eine Implementierung von JavaME für mobile Endgeräte mit eingeschränkten Ressourcen. Die Sicherheitskonzepte der JavaSE sind zu umfangreich um sie komplett zu übernehmen, daher wurde ein einfacheres Sicherheitskonzept entwickelt, welches aber die für Java typische Abschottung der in der JVM laufenden Programme vom System schafft. Die folgenden Einschränkungen zusammen mit dem 7 Kapitel 3: Sicherheitskonzepte auf Konfigurationsebene Sandkasten Modell der KVM (Unterkapitel 2.2) sind die Grundlage für die Sicherheit in mobilen Endgeräten mit CLDC 1.0 Implementierung (vgl. [JSR30]) und dienen gleichzeitig auch zur Anpassung an die ressourcenbeschränkte Umgebung: • Die Ergänzung oder Veränderung von Systembibliotheken (java.* und javax.microedition.*) ist verboten, da dies von schadhaftem Code als Angriffspunkt genutzt werden kann, um die vorhandenen sicheren Klassen und Methoden zu umgehen. • Die Reihenfolge, in der Klassen nachgeschaut werden (engl. classfile lookup order), darf nicht verändert werden, da sonst externe Bibliotheken einer Systembibliothek vorgeschaltet werden könnten. • Das Erstellen von benutzerdefinierten class loadern ist untersagt. Somit kann auf die Art und Weise des Ladeprozesses von Klassen in die KVM kein Einfluss genommen werden. • Das Java Native Interface (JNI), mit dessen API direkt betriebssystemspezifische Funktionen aufgerufen werden konnten, wurde entfernt, um das Sicherheitskonzept des Sandkastenmodells (vgl. Unterkapitel 2.1) nicht zu kompromittieren. An dessen Stelle tritt ein KVM Native Interface (KNI), das die statische Bindung von nativen Funktionen zur KVM erlaubt und demnach nur für Endgerätehersteller und Plattformanbieter geeignet ist (vgl. [Sch07]) Es gibt weitere Einschränkungen, welche großteils auf den verkleinerten Sprachumfang zurückzuführen sind (für eine vollständige Auflistung vgl. [JSR139]). 8 Kapitel 4: Sicherheitskonzepte auf Profilebene 4 Sicherheitskonzepte auf Profilebene Bisher wurden die Konzepte auf Sprach-, Compiler- und Laufzeitumgebungsebene betrachtet. Es ist sichergestellt, dass Programme richtig kompiliert sind und dass sie außerhalb des Sandkastens keinen Schaden verursachen. Sicherheitskonzepte werden aber nicht nur auf Ebene der Systemstabilität benötigt. Für eine Akzeptanz der Industrie und der Anwender mussten auch sinnvolle Konzepte auf Profilebene erdacht werden. Im Folgenden Kapitel werden zunächst die Sicherheitskonzepte der CDC Profile beschrieben (Unterkapitel 4.1). Vielen Entwicklern waren die Einschränkungen des MIDP 1.0 (vgl. [JSR37]) zu restriktiv und so wurde mit der Spezifikation des MIDP 2.0 (vgl. [JSR118]) für CLDC ein System von Sicherheitsdomänen (engl. protection domains) geschaffen, welches anschließend näher erläutert wird (Unterkapitel 4.2). Danach folgt eine Beschreibung der SATSA (Unterkapitel 4.3), die die Integrität (Abschnitt 4.3.1), Authentizität (Abschnitt 4.3.2) und Vertraulichkeit (Abschnitt 4.3.3) von ausgetauschten Daten auf CLDC Geräten ermöglicht. Das Kapitel schließt mit einer Beschreibung sicherer Netzwerkprotokolle im MIDP 2.0 (Unterkapitel 4.4). 4.1 Profile für CDC Derzeit sind drei Profile für die CDC verfügbar. Diese sind hierarchisch so angeordnet, dass ein weiter unten stehendes Profil jeweils eine Untermenge des in der Hierarchie höher stehenden Profils bildet. Das Foundation Profile (vgl. [JSR219] für Version 1.1.2) bildet die Grundlage und enthält die Java Pakete, die nicht grafische Grundfunktionalität bereitstellen. Das Personal Basic Profile (vgl. [JSR217]) und das darüber liegende Personal Profile (vgl. [JSR216]) ergänzen das Foundation Profile um grafische Funktionalität. Das Foundation Profile in der Version 1.1.2 enthält neben einer Untermenge von J2SE 1.4.2 Klassen (unter anderem auch Klassen aus java.security.*) zusätzlich die vorher optionalen packages Java Authentification und Authorization Service, Java Cryptography Extension und Java Secure Socket Extension. Da eine komplette Portierung der Sicherheitskonzepte von der JavaSE vorgenommen wurde, wird auf eine Beschreibung an dieser Stelle verzichtet. 9 Kapitel 4: Sicherheitskonzepte auf Profilebene 4.2 Protection domains des MIDP 2.0 In der Welt der mobilen Endgeräte und kleinen Bandbreiten sollen heruntergeladene MIDlets die Erlaubnis erhalten können Netzwerkverbindungen aufzubauen. Andererseits soll dies auch nicht unkontrolliert passieren, da dies unter Umständen zu hohen Kosten führen kann. Bei Geräten, die das ältere MIDP1.0 (vgl. [JSR37] implementieren, fehlt die Unterscheidung zwischen vertrauens- und nicht vertrauenswürdigen MIDlets völlig. Alle MIDlets arbeiten mit gleich restriktiven Sicherheitseinschränkungen. Mit dem MIDP 2.0 (vgl. [JSR188]) erhalten Hersteller die Möglichkeit, ein System von Sicherheitsdomänen zu spezifizieren und MIDlets entsprechend ihrer Vertrauenswürdigkeit mehr Rechte zu erteilen. 4.2.1 Permissions Für eine MIDP 2.0 Implementierung ist vorgesehen, dass einige Netzwerkprotokolle nur nach Erteilung einer Berechtigung (engl. permissions) freizugeben sind. Ein MIDlet kann die folgenden Berechtigungen anfordern: • javax.microedition.io.Connector.http • javax.microedition.io.Connector.https • javax.microedition.io.Connector.socket • javax.microedition.io.Connector.serversocket • javax.microedition.io.Connector.ssl • javax.microedition.io.Connector.datagram • javax.microedition.io.Connector.datagramreceiver • javax.microedition.io.Connector.comm • javax.microedition.io.PushRegistry In der [JSR248] sind zusätzlich Berechtigungsgruppen spezifiziert, die die Anforderungen von Berechtigungen und den Umgang mit diesen erleichtern. Für das MIDP 2.0 sind das z.B. die Net Access, Low Level Net Access, Application Auto Invocation und Local Connectivity Berechtigungsgruppen, deren Funktion sich aus dem Namen ableiten. 10 Kapitel 4: Sicherheitskonzepte auf Profilebene Die oben aufgeführten Berechtigungen und Berechtigungsgruppen können von optionalen Paketen erweitert werden. So definiert z.B. die in Unterkapitel 4.4 erläuterte SATSA noch zusätzlich folgende Berechtigungen: • javax.microedition.apdu.aid • javax.microedition.apdu.sat • javax.microedition.jcrmi • javax.microedition.securityservice.CMSMessageSignatureService 4.2.2 Protection domains Die Erteilung von Berechtigungen geschieht dabei nicht auf Ebene des Programmcodes, sondern wird indirekt über die Sicherheitsdomäne in der das MIDlet gestartet wird geregelt. Es werden in aller Regel vier Sicherheitsdomänen definiert: • Gerätehersteller (manufacturer domain) • Betreiber (operator domain) • Vertrauenswürdige Dritte (identified third party domain) • Vertrauensunwürdige Dritte (unidentified third party domain, vor MIDP2.0.1 untrusted) Eine Sicherheitsdomäne definiert allowed und user permissions. Alle permissions, die nicht allowed oder user sind, werden von der Sicherheitsdomäne bei Anforderung abgelehnt. Während allowed permissions ohne weiteres vom MIDlet nutzbar sind, wird bei user permissions der Nutzer zur weiteren Vorgehensweise befragt. Der Nutzer muss dann über so genannte interaction modes entscheiden, ob eine Erlaubnis einmal (oneshot), bis zur Terminierung des MIDlets (session), bis zur Deinstallation des MIDlets (blanket) oder gar nicht (no) zu erteilen ist. Der Programmierer hat nun die Möglichkeit im JAD die Berechtigungen zu integrieren. Dabei wird in notwendige, solche die zur Lauffähigkeit zwingend erforderlich sind, und optionale, solche die brauchbar aber nicht zwingend erforderlich sind, unterschieden. Sie werden in den Attributen MIDlet-Permission und MIDlet-Permission-Opt mit Komma getrennt aufgeführt. Vor der Installation kann mithilfe der JAD Attribute überprüft werden, ob das Programm in der Sicherheitsdomäne überhaupt die nötigen Berechtigungen hat und ggf. die Installation abbrechen, ohne dass der Nutzer dies später 11 Kapitel 4: Sicherheitskonzepte auf Profilebene zur Laufzeit testen muss. Berechtigungen die als user permissions definiert sind, fordern bei Anforderung durch ein MIDlet den Nutzer zur Berechtigung oder Ablehnung auf. Darüber hinaus kann ein MIDlet seine Berechtigungen zur Laufzeit mit der Methode checkPermission() erfragen, um so z.B. seinen Programmablauf zu steuern. 4.2.3 Zertifizierung eines MIDlets Um nun einem Endgerät die Möglichkeit zu geben zu entscheiden, in welcher Sicherheitsdomäne das MIDlet gestartet werden kann, muss die Herkunft des MIDlets sichergestellt sein. Dazu wurde von Seiten der Industrie das Java-Verified-Programm ins Leben gerufen. Nach einem automatisierten Vortest, muss das MIDlet von einem Testhaus „manuell“ auf Produktqualität getestet werden, bevor eine Signatur des MIDlets z.B. mit einem RSA X.509 Version 3 Verfahren bei einer Certificate Authority (CA) ermöglicht wird. Das MIDlet wird dazu gesichert einem Testhaus übermittelt. Nach erfolgreichem Test gilt das MIDlet als Java Verified und muss von einer CA signiert werden. Dazu wird ein Zertifikat für den Entwickler generiert, welches mit dem Hauptzertifikat signiert wird. Nachdem die Anwendung mit dem Zertifikat des Anwendungsentwicklers signiert wurde, wird die JAD Datei entsprechend mit Informationen ergänzt. Die Zertifikatsketten (es sind auch mehrere möglich) werden in fortlaufend nummerierten MIDlet-Certificate-x-y Attributen samt ihrer Zertifikate gespeichert, wobei x für die Zertifikatskette und y für das Element der Kette steht. Mit dem geheimen Schlüssel (private key) der Hauptzertifizierungsstelle wird aus dem JAR eine Signatur erzeugt die im Attribut MIDlet-Jar-RSA-SHA1 als base64 codiert im JAD gespeichert wird. Ist dieses Attribut vorhanden muss beim herunterladen eine Verifikation und Authentifizierung vorgenommen werden (vgl. Abschnitt 4.3.2). Der Prozess besteht aus mehreren Schritten: 1. Die MIDlet-Certificate-x-y Attribute werden für jede Zertifikatkette x, beginnend bei Element y=1 der Zertifikatkette, durchlaufen und es wird versucht ein passendes Hauptzertifikat im Gerät zu finden. 2. Die erste Zertifikatskette, die verifiziert wird, bindet das MIDlet an eine feste Sicherheitsdomäne. 3. Nachdem sichergestellt ist, dass der Versender der ist der er vorgibt zu sein, wird nun mit dem öffentlichen Schlüssel (public key) der Zertifizierungsstelle die Signatur decodiert. 12 Kapitel 4: Sicherheitskonzepte auf Profilebene 4. Der mit der Hash-Funktion SHA-1 erzeugte Wert aus dem übermittelten JAR wird mit der decodierten Signatur verglichen. Nur wenn alle diese Punkte erfolgreich absolviert wurden kann mit der Installation in die gewünschte Sicherheitsdomäne fortgefahren werden. Bei einem Fehler wird die MIDlet Installation entweder abgelehnt oder in die unidentified third party domain vorgenommen. MIDlets auf Basis des MIDP 1.0 werden standardmäßig in die unidentified third party domain installiert. Umgekehrt werden bei MIDlets, die unter MIDP 2.0 verifiziert werden könnten, bei der Installation in MIDP 1.0 Geräten die Zertifikate ignoriert und wie alle anderen MIDlets in derselben restriktiven Sicherheitsdomäne ausgeführt. 4.3 Die Security and Trust Services API Um die vielen Anwendungsgebiete mit JavaME abzudecken und trotzdem das Ziel einer kleinen aber eingeschränkten Umgebung zu gewährleisten, gibt es neben den Konfigurationen und Profilen noch optionale Pakete, die die benutzbare API bei Bedarf um die gewünschte Funktionalität erweitern. Die Security and Trust Services API (SATSA), die in [JSR177] spezifiziert ist, erweitert den Sprachumfang um zwei Typen von Paketen. Zum einen sind das die Kommunikationspakete SATSA APDU Communication API und SATSA JCRMI Communication API, welche das Generic Connection Framework um die Klassen APDUConnection und JavaCardRMIConnection erweitern. Dadurch wird eine Brücke zwischen JavaME und smart cards, wie der Java Card, (Universal) Subscriber Identity Module und token smart cards, geschlagen (für detailliertere Informationen vgl. [SATSA1]). Zum anderen sind dies die SATSA CRYPTO Cryptographic API und die SATSA Public Key Infrastructure Signature Servcie API und einige Exceptions, die zum Teil Untermengen der JavaSE Sicherheitspakete java.security.* und javax.crypto.* sind. Sie ermöglichen einer JavaME Implementierung digitale Signaturen und digitale Zertifikate zu verwalten sowie kryptografische Operationen auszuführen. Die Anwendungen der SATSA werden im Folgenden näher erläutert (vgl. [SATSA2]). 13 Kapitel 4: Sicherheitskonzepte auf Profilebene 4.3.1 Integritätsprüfung einer Nachricht In einigen Anwendungen soll sichergestellt werden, dass Daten, wie z.B. Programme oder Nachrichten, unterwegs keine Veränderung erlitten haben. Die SATSA ermöglicht Benutzern über Einweg Hashfunktionen, wie z.B. den beiden populärsten Vertretern RSA Security MD5 oder NIST’s SHA-1 die Integrität ausgetauschter Daten sicherzustellen. Einweg Hashfunktionen sind Funktionen, die aus einer Eingabe x eine Ausgabe y (in aller Regel ein Element der natürlichen Zahlen) ermitteln, die diese Eingabe repräsentiert. Da die Menge der Eingaben X im Vergleich zu den möglichen so genannten Hashwerten Y sehr groß ist, liegt keine perfekte Injektivität vor, jedoch ist es sehr unwahrscheinlich, dass zwei ähnliche Eingaben die gleiche Ausgabe erzeugen. Es ist zudem unmöglich aus der Ausgabe y auf die Eingabe x zu schließen. Die schon in der JavaSE vorhandene MessageDigest Klasse erzeugt nach Angabe des gewünschten Hash-Algorithmus (für erlaubte Algorithmen vgl. [JCAA]), einer Eingabe in Form eines Strings oder Bytearrays und der Länge des zu erzeugenden Hashbytearrays ein digest genanntes Hashbytearray. Dieses wird dann beim Austausch zusammen mit der Datei übertragen. Der Empfänger kann nun, vorausgesetzt er kennt den Algorithmus und die Länge des digest, aus der mitgeschickten Datei ebenfalls ein digest ermitteln und sie mit dem mitgeschickten digest byteweise vergleichen (vgl. Abbildung 3). Da wie oben beschrieben quasi nur eine identische Eingabe dazu führen kann, dass die Hashbytearrays identisch sind, ist die Integrität der Daten sichergestellt. 14 Kapitel 4: Sicherheitskonzepte auf Profilebene Abbildung 3: Integritätsprüfung 4.3.2 Authentifizierung einer Nachricht Für einige praktische Anwendungen reicht es nicht aus sicherzugehen, dass die Integrität einer Nachricht gewährleistet ist. Es wäre ja theoretisch denkbar, dass jemand eine Nachricht abfängt, das digest entfernt, die mitgeschickte Datei korrumpiert, ein neues digest erzeugt und dieses dann zusammen mit der korrumpierten Datei weiterschickt. Der Empfänger kann dann zwar die Integrität der Daten prüfen, aber von wem die Daten sind, ist für den Empfänger so nicht ersichtlich. Es ist also nötig den Absender in einigen Fällen zusätzlich zu authentifizieren. Der Authentifizierungsprozess fügt dem in Abschnitt 3.2.1 beschriebenen Prozess der Integritätsprüfung Authentifizierungselemente hinzu. Für das folgende asymmetrische Verschlüsselungsverfahren benötigt der Absender ein gültiges Zertifikat mit geheimen (private) und öffentlichen Schlüssel (public key) und einen von einer Hauptzertifizierungsstelle zugewiesenen Namen (Certificate Authority Distinguished Name (CA DN)). Zu Anfang wird aus der Nachricht wieder ein digest erzeugt. Das digest wird dann mit dem private key des Senders signiert und zusammen mit dem Zertifikat und der Nachricht verschickt. Der Empfänger verifiziert die Gültigkeit des 15 Kapitel 4: Sicherheitskonzepte auf Profilebene Zertifikats über das auf dem Gerät integrierte Zertifikat der Hauptzertifizierungsstelle und entnimmt dem mitgeschickten Zertifikat zusätzlich noch den Verschlüsselungsalgorithmus und den public key. Diese Informationen benutzt der Empfänger, um die mitgeschickte Signatur zu dekodieren und das vom Absender generierte digest zu erhalten. Danach wird, wie in Abschnitt 4.3.1 beschrieben, aus den mitgeschickten Daten ein digest generiert und mit dem erhaltenen verglichen. Der Vorgang liefert nur dann ein sinnvolles Ergebnis, wenn das Ergebnis mit dem korrekten private/public Schlüsselpaar ver- und entschlüsselt wird. Unbemerkte Eingriffe Dritter in die Daten sind nicht mehr möglich. Die Authentizität und Integrität der verschickten Daten ist somit sichergestellt (vgl. Abbildung 4). Absender Daten Empfänger Übertragung Daten Signatur Hashfunktion Entschlüsselung Digest Digest Verschlüsselung Hashfunktion Signatur Digest =? Abbildung 4: Authentifizierung des Absenders mit Integritätsprüfung Die SATSA stellt, anders als in JavaSE, Signaturfunktionalität in der Klasse CMSMessageSignatureService aus dem Paket javax.microedition.* bereit. Es werden dabei zwei Möglichkeiten der Erzeugung von Signaturen bezüglich Ihres Zwecks unterschieden. Die für Zwecke der nicht Bestreitbarkeit (engl. non repudiation), wie z.B. in Verträgen, benutzbare Methode sign()und für einfache Authentifizierung die Methode authorize(). Beide unterstützen die Signatur von Strings oder Bytearrays. Für den Signaturprozess benötigt man zusätzlich den oben erwähnten CA 16 Kapitel 4: Sicherheitskonzepte auf Profilebene DN. Eine zusätzliche Signatur mit Zeitstempeln über eine Time Stamping Authority ist in der API nicht vorgesehen. Die Signature Klasse stellt in JavaSE Verifikations- und Signaturfunktionalität bereit. In der SATSA übernimmt sie nur die Aufgabe der Verifikation. Es werden im Verifikationsprozess der public key und der verwendete Algorithmus benötigt, welche sich im mitgeschickten Zertifikat befinden. 4.3.3 Vertraulichkeit von Nachrichten Die Authentizität und Integrität ausgetauschter Daten können wie beschrieben sichergestellt werden. Die oben erwähnten Mechanismen verhindern aber nicht, dass jemand die Daten und den public key abfängt und sie mitliest. Für die Übertragung sensibler Daten ist daher zusätzlich eine Verschlüsselung der Daten notwendig, die nur vom Empfänger entschlüsselt werden kann. Dies kann durch symmetrische und asymmetrische Schlüssel geschehen. Zusätzlich zu den in Abschnitt 4.4.2 besprochenen Mechanismen kann eine sichere asymmetrische Verschlüsselung von Nachrichten dadurch erreicht werden, dass die geschickten Daten zusätzlich durch den public key des Empfängers verschlüsselt werden (vgl. Abbildung 5). Der Empfänger ist damit der einzige, der die Nachricht dekodieren und die in Abschnitt 4.4.2 beschriebenen Schritte zur Authentifizierung des Absenders und der Integritätsprüfung der Nachricht durchführen kann. Die SATSA unterstützt zwar die asymmetrische Verschlüsselung über die Cipher Klasse, beherrscht aber von sich aus keine Funktionalität zur Entschlüsselung solcher Nachrichten über einen private key. Die Anwendungsgebiete sind dementsprechend eingeschränkt. 17 Kapitel 4: Sicherheitskonzepte auf Profilebene Abbildung 5: Asymmetrische Verschlüsselung (links) und Entschlüsselung (rechts) Die symmetrische Ver- und Entschlüsselung von Daten ist hingegen voll implementiert. Die Klasse Cipher besitzt Methoden, um Nachrichten zu ver- und entschlüsseln. Dies sind unter anderem die Methoden init(), die abhängig von der Anwendung für Verschlüsselungen die statische Variable Cipher.ENCRYPT_MODE oder für Entschlüsselungen die statische Variable Cipher.DECRYPT_MODE als Parameter erwartet, update() und doFinal(), die die Ver- bzw. Entschlüsselung durchführen bzw. diese abschließt. Sind der Absender und der Empfänger die einzigen Besitzer des Schlüssels (was in der realen Anwendungen ein nicht triviales Problem darstellt), ist sichergestellt, dass kein Dritter die Daten lesen kann (vgl. Abbildung 6). 18 Kapitel 4: Sicherheitskonzepte auf Profilebene Absender Empfänger Verschlüsselte Daten Übertragung Verschlüsselung Daten Entschlüsselung Verschlüsselte Daten Daten Abbildung 6: Symmetrische Ver- und Entschlüsselung 4.4 Sichere Netzwerkprotokolle im MIDP 2.0 Wie in der Übersicht über die Berechtigungen in Abschnitt 4.3.1 zu sehen war, unterstützt das MIDP ab der Version 2.0 unter anderem Secure Socket Layer (SSL) für sichere Socket Verbindungen und HTTP über SSL, Transport Layer Security (TLS), Wireless TLS oder WAP TLS. Diese werden, wie bei anderen Verbindungen sonst auch, mit bzw. Connector.open(“https://...“) Connector.open(“ssl://...“) geöffnet. HTTPS arbeitet mit einem Zertifikatsverfahren ähnlich dem der asymmetrischen Verschlüsselung, das in den Abschnitten 4.4.1 - 4.4.3 beschrieben ist. Die Klasse HttpsConnection definiert zusätzlich zwei neue Methoden int getPort() sowie SecurityInfo getSecurityInfo(). Das Interface SecurityInfo definiert Methoden, welche Protokolle benutzen können, um sicherheitsrelevante Informationen über ihre Verbindung zur Verfügung zu stellen. Das Interface Certificate definiert Methoden, um Informationen über das benutzte Zertifikat, wie z.B. den CA DN, die Zeitspanne in der das Zertifikat gültig ist und welcher Signaturalgorithmus benutzt wurde, zur Verfügung zu stellen. 19 Kapitel 5: Fazit 5 Fazit Die Sicherheitskonzepte der JavaME sind spätestens seit den neusten Versionen der Konfigurationen und Profile auf allen Ebenen durchdacht. Das zu Grunde gelegte Sandkasten Modell der KVM verhindert effektiv, dass das System, welches die KVM implementiert, destabilisiert wird. Der Verifikationsprozess wurde für CLDC Geräte neu erdacht, so dass eine effiziente Prüfung des Codes zur Laufzeit möglich ist. Die knappen Ressourcen der Geräte, für die JavaME konzipiert wurde, erzwingen einige Einschränkungen auf der Ebene der Funktionalität. Diese Einschränkungen gehen dabei nicht zu Lasten der Sicherheit. Es lässt sich erkennen, dass in steigender Versionszahl auch die Einschränkungen gegenüber der JavaSE kleiner werden. Während im MIDP 1.0 alle MIDlet’s gleich restriktiv behandelt wurden, ermöglicht das MIDP 2.0 Entwicklern eine größere Vielfalt an verschiedenen Anwendungen zu programmieren. Hersteller implementieren dazu Sicherheitsdomänen, die Entwickler, authentifiziert über Zertifikate, anfordern können. Die Unterstützung von HTTPS und SSL Verbindungen ermöglichen den Aufbau gesicherter Verbindungen zwischen Endgeräten und Servern. Für mehr Kontrolle über Integritäts-, Authentizitäts- und Verschlüsselungsfunktionalität bietet die SATSA umfangreiche Funktionalität, wobei an einigen Ecken einige Restriktionen bei den Anwendungen, gegeben durch die knappen Ressourcen, der Geräte erkennbar werden. 20 Literaturverzeichnis [BrMo06] Ulrich Breymann, Heiko Mosemann: Java ME Anwendungsentwicklung für Handys , PDA und Co., Hanse, 2006 [JCAA] JCAA Appendix: http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html#AppA [JSR30] Connected Limited Device Configuration 1.0 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr030/index.html [JSR36] Connected Device Configuration 1.0.2 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr036/index.html [JSR37] Mobile Information Device Profile 1.0 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr037/index.html [JSR118] Mobile Information Device Profile 2.0 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr118/index.html [JSR139] Connected Limited Device Configuration 1.1 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr139/index.html [JSR177] Security and Trust Service API Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr177/index.html [JSR188] Mobile Information Device Profile Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr188/index.html [JSR216] Personal Profile Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr216/index.html [JSR217] Personal Basic Profile Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr217/index.html [JSR218] Connected Device Configuration 1.1.2 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr218/index.html [JSR219] Foundation Profile 1.1.2 Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr219/index.html [JSR248] Mobile Service Architecture for CLDC: http://jcp.org/aboutJava/communityprocess/edr/jsr248/index.html [JVM] JVM Spezifikation, Kapitel 4.9: http://java.sun.com/docs/books/vmspec/2ndedition/html/ClassFile.doc.html#88597 [KVM] White Paper on KVM and CLDC http://java.sun.com/products/cldc/wp/KVMwp.pdf [SATSA1] C. Enrique Ortiz: The Security and Trust Service API for J2ME, Part 1, http://developers.sun.com/techtopics/mobility/apis/articles/satsa1/, 2005 [SATSA2] C. Enrique Ortiz: The Security and Trust Service API for J2ME, Part 2, http://developers.sun.com/techtopics/mobility/apis/articles/satsa2/, 2005 [Sch07] Klaus-Dieter Schmatz: Java Micro Edition Entwicklung mobiler JavaMEAnwendungen mit CLDC und MIDP, 2. Auflage, dpunkt.verlag, 2007