Java Security im Überblick

Slides:



Advertisements
Ähnliche Präsentationen
SQL Injection – Funktionsweise und Gegenmaßnahmen
Advertisements

Einführung in die Programmiersprache C/C++
der Universität Oldenburg
der Universität Oldenburg
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Einführung in die Programmierung Zusammenfassung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Die 20 beliebtesten Versäumnisse hinsichtlich Sicherheit in der Softwareentwicklung EUROSEC GmbH Chiffriertechnik & Sicherheit Tel: / 60850,
Das secologic Projekt im Kurzüberblick - Stand Sept
Kapselung , toString , equals , Java API
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
10 Streams JavaHS Merseburg WS 05/06 E/A - Ströme (Streams) in Java.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Packages Vortrag : Cornelia Hardt 23. November 1999.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Klassen und Objekte
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
05 - Reflection Das Reflection API Reflection2 Ziel Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt.
Einführung in die Programmierung Datensammlung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Delphi II - OOP IFB Fortbildung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
1 Sg 3 – JSP - Java Server Pages Softwareengineering Praktikum Java Server Pages Nicole Brandstätter Josef Sturm Karl Streicher.
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
1. Verhalten der Objekte: Operationen Werden in den Klassen definiert Werden (i.d.R.) auf einem Objekt aufgerufen Wird das Empfängerobjekt genannt Weitere.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Reinhard Stumptner Seminar Softwareentwicklung Dynamisches Laden und Binden in Java.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #3 Philipp Effenberger
Neuerungen in Java 5/6/7. Stefan Bühler für InfoPoint Überblick Java 5 neue Sprachfeatures Erweiterungen Klassenbibliothek Java 6 Erweiterungen.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs Übung Besprechung der Hausaufgabe
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Implementieren von Klassen
 Präsentation transkript:

Java Security im Überblick EUROSEC GmbH Chiffriertechnik & Sicherheit Tel: 06173 / 60850, www.eurosec.com © EUROSEC GmbH Chiffriertechnik & Sicherheit, 2005

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Überblick Teil 1: Java Programmiertechniken zur Erhöhung der Sicherheit Teil 2: Schutz von Java-Source-Code vor Reverse Engineering (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Java und Sicherheit Java gilt als „sichere Programmiersprache“ Keine Buffer Overflow Problematik Memory Management durch VM Integrierte Sicherheitsprüfungen Byte-Code Checks Klassen/Methoden Sichtbarkeit Sicherheitseigenschaften verhindern jedoch keine Probleme durch Programmier-“Fehler“ Woran muss man denken? Wichtig sind Empfehlungen zu grundlegenden Programmiertechniken, und zum Erhöhen der Sicherheit  Best Practice Programmiertechniken erforderlich (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Basis-Programmiertechniken (1) Verwendung von public Klassenvariablen einschränken Als privat definieren Entsprechende Zugriffsmethoden implementieren, die unter anderem für die Inhaltskontrolle (z.B. Filterung/Eingabenüberprüfung) genutzt werden können Methoden als privat deklarieren. Protected und public nur verwenden, falls notwendig Protected und public Methoden müssen geschützt sein (Überprüfung der Eingabeparameter) Statische Klassenmitglieder vermeiden, da Zugriff auf den Inhalt aus allen Instanzen möglich (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Basis-Programmiertechniken (2) Rückgabe von änderbaren Objekten vermeiden z.B. Referenzen auf interne Arrays Änderbare Objekte, die vom externen Code übermittelt werden, sollen nicht direkt gespeichert werden Objekt-Cloning verwenden Klasse String soll nicht zum Speichern sensitiver Informationen (z.B. Kennworte) benutzt werden Wegen Garbage-Collection werden sie nicht sofort freigegeben und können wieder benutzt werden Stattdessen char[] verwenden und nach Verwendung überschreiben (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Basis-Programmiertechniken (3) Klassen und Methoden nach Möglichkeit als final deklarieren Erweiterungen/Modifikationen durch Angreifer werden vermieden Nach Möglichkeit nur final Methoden aus Konstruktoren heraus aufrufen Innere Klassen nicht benutzen Innere Klassen werden beim Kompilieren als zugreifbar für alle Klassen im gleichen Package definiert Die Klassenvariablen der umgebenden Klasse sind plötzlich nicht mehr privat (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Basis-Programmiertechniken (4) Keine leeren catch-Blöcke verwenden Auf Fehler wird nicht reagiert Späteres „Füllen“ wird vergessen Standard-Bibliotheken für sicherheitsrelevante Funktionen verwenden Keine neuen kryptografischen Verfahren ausdenken Erzeugung sicherer Zufallszahlen gewährleisten java.util.Random nicht verwenden stattdessen java.security.SecureRandom (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Weitere Programmiertechniken (1) Nicht davon ausgehen, dass die Initialisierung immer stattfindet Es existieren unterschiedliche Methoden, die Initialisierung zu umgehen Keine Klassenvergleiche auf Basis der Klassennamen verwenden (z.B. if (obj.getClass().getName().equals("Foo")) Stattdessen Vergleiche der Klassen mittels des == Operators verwenden if (a.getClass() == b.getClass()) (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Weitere Programmiertechniken (2) Klassen als uncloneable realisieren, da durch Cloning-Mechanismus Objekte instanziiert werden können, ohne Ausführung eines Konstruktors public final void clone() throws java.lang.CloneNotSupportedException { throw new java.lang.CloneNotSupportedException(); } Ist Cloning erforderlich… Bei eigenen Methoden als final deklarieren Bei fremden (Elternklasse): public final void clone() throws java.lang.CloneNotSupportedException {super.clone();} (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Weitere Programmiertechniken (3) Klassen-Serialisierung vermeiden, da bei Serialisierung auch private Inhalte einer Klasse eingesehen werden können. Serialisierung durch folgende Methode nicht zulassen: private final void writeObject(ObjectOutputStream out) throws java.io.IOException {throw new java.io.IOException("Object cannot be serialized");} Ist Serialisierung erforderlich, alle Felder mit sensitiven Informationen (Kennwörter) bzw. lokalen Referenzen (z.B. Handles zu lokalen Ressourcen) als transient markieren Klassen als nicht deserializeable implementieren, da die Deserialisierung auch für nicht serialisierbare Klassen möglich ist private final void readObject(ObjectInputStream in) throws java.io.IOException {throw new java.io.IOException("Class cannot be deserialized");} (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Reverse Engineering und Code Obfuscation (Java) (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Problematik Java Byte Code ist anfällig gegen Reverse Engineering Dank vieler Informationen im Byte Code Code Obfuscation: Technologie, um das Reverse Engineering zu erschweren Byte Code wird modifiziert. Als Ergebnis entsteht kaum lesbarer Spaghetti-Code Ist jedoch kein Allheilmittel, nur der Aufwand für das Re-Engineering wird erheblich größer Viele Code Obfuscators verfügbar (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Reverse Engineering - Tools Verschiedene Decompiler verfügbar Unterschiede in Funktionsweise, Lizenzierungsmodellen und Preisen Auswahl an bekannten Decompilern (keine komplette Liste): Mocha, Jasmine, WingDis, DeJaVu, SourceAgain, Jad (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Reverse-Engeneering: Angriffsziele Problem: Java-Byte-Code muss ausgeliefert werden Dekompilieren liefert Informationen über Kontrollfluss Einprogrammierte Werte (Schlüssel, Initial-Werte,…) Verarbeitete Eingaben (Versteckte Funktionen, Optionen) Vorhandener Testcode (z.B. ohne Sicherheitsprüfungen) Verwendete Mechanismen zum Verschleiern von Daten Prüfen von Lizenzen Vorbereitung für weitere Angriffe Wie kann Code Obfuscation helfen? (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Layout Obfuscation Basiert auf … Umbenennung von Bezeichnern (vor allem Variablen- und Methodennamen) Löschen von Debug-Informationen (Zeilen-Nummern, die vom Compiler eingefügt werden) Am weitesten verbreitete Technik Erschwert das Nachvollziehen, versteckt aber nicht die Programmlogik Sicherheitsgewinn nicht erheblich (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Layout Obfuscation - Beispiel package test; import java.util.*; class Demo { private Vector buffer = new Vector(); /** * Return the position of the specified String in the * buffer. Remove the String once if it has been found. * Return -1 if the String isn't found. */ int getStringPos(String string) { for(int counter=0; counter < buffer.size(); counter++) { String curString = (String)buffer.elementAt(counter); if (curString.equals(string)) { buffer.remove(counter); return counter; } } return -1; } } package a; import java.util.Vector; class a { private Vector a new Vector(); int a(String s) { for(int i = 0; i < a.size(); i++) { String s1 = (String)a.elementAt(i); if(s1.equals(s)) { a.remove(i); return i; } } return -1; } } (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Control Obfuscation Basiert auf Änderungen des Programm-Control-Flusses Einführung zusätzlicher (auch ungültiger) Code-Abschnitte Ändert Programmablauf so, dass Nachvollziehen der Programmlogik kaum möglich ist Bietet gute Sicherheit Programme werden langsamer (etwa 2%, also nicht erheblich) Programme werden größer durch Zusatzcode bzw. Code-Änderungen Durch Fehler im Code Obfuscator kann die fehlerfreie Funktionalität des Programms beeinflusst werden Flow Obfuscation kann auch VM-/JIT-Fehler erzeugen/aufdecken (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Control Obfuscation - Beispiel c = a + b; doSomething(c); doOtherThings(); if(i != 0) goto _L2; else goto _L1 _L1: e != null ? e : (e = a(b(">8\0171]2;\035!Z4)\035jO")); _L2: doSomething(); c = a + b; if (methodWhichReturnsFalse()) { doTotallyDifferentUselessThings(); } else { doSomething(c); doOtherThings(); } (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Data Obfuscation Basiert auf Änderungen des Datenmodells Modifikationen der Vererbungsbeziehungen Array-Restrukturierungen (Dimensionen) Clone-Methoden (verschiedene Versionen von Methoden) Aufspaltung der Variablen (eine boolesche Variable in zwei unterschiedlichen Variablen unterbringen) String-Manipulationen Durch diese Änderungen ist Nachvollziehen des dekompilierten Codes kaum möglich; sehr mächtig Bietet gute Sicherheit Programme werden langsamer Programme werden größer durch Zusatzcode bzw. Code-Änderungen (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Code Obfuscator Code Obfuscator verschiedenster Typen verfügbar Auch mit kombinierten Techniken Manche sind integrierbar in die Entwicklungsumgebungen Unterschiedliche Lizenzierungsmodelle und Preise Auswahl (keine komplette Liste): 2LKit Obfuscator, Cloakware, CodeShield, Condensity, DashO Pro, Hashjava, Helseth Jobfuscator, HoseMocha, JAX, JCloak, Jobfuscate, JODE, JProof 1st Barrier , JShrink, JZipper, Obfuscate, Neil Aggarwal’s Obfuscate, RetroGuard, Smokescreen, SourceGuard, The Marvin Obfuscator, Zelix KalssMaster (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Fazit bzgl. Reverse Engineering Java Decompiler sind vorhanden Einfach zu nutzen Code-Obfuscation kann helfen Relevant wenn Java Programme an Dritte ausgeliefert werden Wenn Angreifer Zugriff auf Java Programmcode haben Einzelfall-Entscheidung für/gegen Code-Obfuscation stets erforderlich (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Anhang (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

Warum dieser Vortrag von uns? - Unsere Erfahrung: mehrere Personenjahre in Forschungsprojekten zur sicheren Softwareentwicklung; derzeit gemeinsam mit Partnern wie SAP, Commerzbank, Universitäten, ... zahlreiche Schwachstellenanalysen für Softwarehersteller, nebst intensiver Feedbackzyklen mit den Entwicklern Erstellung von Anforderungs- und Designspezifikationen in mehreren großen Entwicklungsprojekten Erstellung von Guidelines zur sicheren Softwareentwicklung, mit Schwerpunkten Banking & Finance, sowie Webapplikationen Reverse Engineering und Gutachten von Sicherheitsfunktionen und Kryptomechanismen Implementierung von Sicherheitsfunktionen im Auftrag (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Abschlussbemerkung die vorliegende Dokumentation wurde von EUROSEC erstellt im Rahmen des secologic Forschungsprojekts, Laufzeit 2005 und 2006, nähere Informationen unter www.secologic.org wir bedanken uns beim Bundesministerium für Wirtschaft für die Förderung dieses Projektes Anregungen und Feedback sind jederzeit willkommen, ebenso Anfragen zu Sicherheitsaspekten, die hier nicht behandelt werden konnten. (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg

(c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg Copyright Hinweis Diese Folien wurden von EUROSEC erstellt und dienen der Durchführung von Schulungen oder Seminaren zum Thema Sichere Anwendungsentwicklung, mit Fokus Webapplikationen. Wir haben diese Folien veröffentlicht, um die Entwicklung besserer Softwareprodukte zu unterstützen. Die Folien dürfen gerne von Ihnen für eigene Zwecke im eigenen Unternehmen verwendet werden, unter Beibehaltung eines Herkunfts-Hinweises auf EUROSEC. Eine kommerzielle Verwertung, insbesondere durch Schulungs- oder Beratungsunternehmen, wie beispielsweise Verkauf an Dritte oder ähnliches ist jedoch nicht gestattet. (c) 2005, EUROSEC GmbH Chiffriertechnik & Sicherheit, Kronberg