 Dann freue ich mich, euch zu unserem vorletzten Vorderes Abend heute begrüßen zu dürfen. Christian, das ist ein Zeichen Software-Entwickler mit einem Hang-to-Security-Automatisierung. Und noch ganz viel, was uns überraschen wird, wenn wir uns ein bisschen was über Lock for Tray erzählen. Lock for Tray war diese kleine Sicherheitslücke, die uns über die letzten paar Tage beschäftigt hat, so ab Jahreswechsel. Dann viel Spaß mit Christian. Es ist spannend, dass man ein halbes Jahr nach so einer Sicherheitslücke noch so einen ganzen Raum damit vollkriegt, die zu erklären. Ich würde grundlegend fragen, wer ist denn hier ein Java-Entwickler? Könnt ihr mal aufstehen? Nein, also, okay, ihr könnt auch die Hand heben. Wer kacken, die schämen sich. Ich sehe schon, die Stimmung läuft auf jeden Fall gegen Java-Entwickler. Das ist ein Java-Entwickler-Rassismus. Aber wer von euch hat denn so ein grundlegendes Verständnis von Java? Wer von euch hat in irgendeiner Form in seiner Firma, in seinem Projekt, ein Problem mit Lock for Tray bekommen und oder davon gehört, hat bei jemanden der CEO direkt angerufen. Gibt es noch so ein paar Hände? Bist du der CEO selber? Ich würde versuchen, weil es bei uns auch ähnlich war, dass sehr viele Leute darauf aufmerksam gemacht wurden, dass es da wohl eine Sicherheitslücke gibt. Spätestens, wenn so etwas beim Spiegel bei Heise ankommt, geht es dann irgendwo in der Vorstandsetage auch rum, weil die Sekretärin das gelesen hat oder sowas. Und gefühlt war es bei uns so, dass sehr viele Leute wussten, man muss diese Schwachstelle fixen oder patchen oder eine neue Version von Lock for Tray einspielen. Und sehr wenige haben verstanden, warum oder haben sich darum gekümmert. Ich glaube, die meisten, die schaffen das nachzuvollziehen. Warum ist denn so eine Schwachstelle schwierig? Und meistens gibt es in so CVE-Postungen auch sehr, sehr gute DoCoo und auch Blockposts. Aber viele Leute haben einfach nicht die Zeit. Und jetzt dachte ich, normalerweise mache ich so DevOps-Vorträge und so Automatisierungscrampel und sowas. Und heute komme ich mal und mache was mit Security, wenn hier schon so eine Sicherheitsinteressierte Konferenz kommt. Ich finde es cool, dass so viele Leute da sind. Ich heiß Christian, manche sagen auch Sai, bin Software-Entwickler, schon lang, habe meistens gute Laune und der Rest wurde auch schon gesagt. Ja genau, ich dachte, bevor ich jetzt alles erkläre und dann zeige, was da los ist, zeige ich erstmal, was da los ist. Falls manche schon vergessen haben nach einem halben Jahr, wie das mit diesem Dingsbums war. Ganz kurze Setup-Erklärung. Ich habe hier unten rechts, man muss da gar nicht groß sehen, was da viel, ist ein bisschen größer, was dann so wahnsinnig wichtig, einen Java-basierten Server gestartet, der heißt hier Opfer. Den wollen wir gleich angreifen. Und in diesem Server läuft eine verwundbare Version von Lock4J. Also genau das, was quasi dieses Riesenproblem war und ich würde euch gern kurz zeigen, was damit denn genau passiert ist. So, jetzt spielt sich das Ganze auf meinem Rechner ab. Dann müsst ihr euch quasi vorstellen, mein Rechner wäre jetzt so ein Application-Server, wo man so eine Software mit Lock4J drin betreibt. Was jetzt halt dummerweise aus Demo gründen, auch noch hier in diesem Rechner sich abspielt, ist einmal der Klein, das heißt ich als Angreifer, werde gleich natürlich auch von diesem Rechner angreifen. Da müsst ihr sich halt vorstellen, ich möchte euch vielleicht machen, remote. Und was ja auch noch auf diesem Rechner läuft, was man sich auch woanders in die Cloud oder sonst wohin vorstellen muss, sind zwei Server, nämlich ein Elder-Server, den ich vorher als Angreifer präpariert habe. Und ein Web-Server, die sind quasi beide oben links, da passiert gar nicht viel, deswegen sind sie so ein bisschen kleiner und total unwichtig. Und jetzt stelle man sich mal so ein Server vor, da kann ich einen Namen in irgendeinen Service eingeben. Und dann kommt sowas wie bei Hallo-Welt, da werde ich begrüßt und sage Hallo GPN oder Hallo liebes GPN Publikum. Und das ist ein ganz unscheinbarer, netter Service, der grüßt auch und was auch passiert. Und das sieht man hier unten. Ich hoffe, es ist nicht so klein, kann es noch ein bisschen größer machen. Das Logging-Modul, was hier eingebaut ist, das lockt quasi diesen Query-Parameter, den ich oben in meinen Browser-Request oder hatte die Query-Request eingegeben habe. Warum locken wir? Kommen wir gleich nochmal zu so ein paar Beispielen, aber ich könnte mir als Betreiber dieses Servers natürlich vorstellen, okay, ich will einfach mal gucken, wie viele Leute haben den aufgerufen, mit welchen Queries wurde vielleicht auch versucht, da Blödsinn reinzuschreiben, weil da steht Name und niemand heißt GPN, wer würde sowas reinschreiben. Einfach wie in der realen Welt, ich mache Logging, damit ich nachher nachvollziehen kann, im Nachhinein, was ist denn auf diesem Service passiert. So. Und was man jetzt als Angriff machen kann, ist, einen anderen String da reinzuschreiben. Oh, was ist das? Schauen wir gleich. Was hier passiert, und das kann ich leider nicht größer machen, ich hoffe, das ist sichtbar oben. Man sieht es aber im Text auch nochmal, was hier rauskam. Ich habe diesen String hier eingegeben. Was auffällt, ist dieser Dollar mit geschweiften Klammern. Was quasi so eine Art in verschiedenen Sprachen, gibt es so ähnliche Konstrukte, die einfach sagen, was in dieser Klammer passiert, führe das aus. Und was jetzt auch noch, was jetzt auch noch in meinem Log plötzlich auftaucht, ist, die unterste Zeile ist das, was wir erwarten. Der Benutzer hat was eingegeben, und der Logger hat es gelockt. Die Kuh, die ist irgendwie dazu passiert, schauen wir nachher warum. Und vielleicht hat der eine oder andere schon gemerkt, irgendwie ist es ein Taschenrechner bei mir aufgegangen. Das wäre dann quasi der Part, wo man sich vorstellen muss, jemand hat Code auf meinem Server ausgeführt und man könnte natürlich statt dem Taschenrechner auch beliebige andere Sachen ausführen. Oder neue Bineries runterladen. Dann kann man den ganzen Inhalt von der Platte verschlüsseln, weil es einfach nur statt Kalkulator einzugeben, auch sowas wie Shred oder sowas drin wäre. Und es sind auch direkt fünf. Man weiß es auch nicht so recht, warum. Ein bisschen übertrieben beim Angreifen. Wollen wir noch mal versuchen? Ich versuche noch mal, okay. Oh, okay, warte, noch wieder zu. Okay, alles gut. So, jetzt ist natürlich die Frage, wie kommt es dazu? Was ist da passiert? Wir gehen, glaube ich, es ist jetzt jeder abgeholt. Man kann über einen normalen Webrequest, wo man einen komischen Namen angibt, oder einen String angibt, irgendwie auf dem Server Code ausführen oder Bineries starten, in dem Fall diesen Kalkulator. So, ich würde ganz kurz ausholen, was Log4J ist, was diese Technologien dahinter sind. Zum Teil habt ihr so ein paar Kürze, wie LWJ, NDI und sowas schon gelesen. Die ganze Welt sucht Java-Entwicklers, da haben wir. Also, Log4J ist eine Java-Bibliothek und das ist wahrscheinlich eine der verbreitetsten Bibliotheken, die es überhaupt gibt. Man spricht davon, dass, oder hat damals, habe ich so ein paar Zahlen gelesen, dass bis zu 50% aller Java-Services, Handys, Server, Clients, Bibliotheken, alte Android-Versionen Log4J enthalten. Nicht zwingend in der anfälligen Version, nicht zwingend, vielleicht auch in der Version vorher, bevor sie anfällig wurde, aber prinzipiell ist es erst mal eine riesen Verbreitung. Ihr kennt das vielleicht, wenn ihr mal Oracle Java installiert habt, kommt am Anfang so ein Java Runs und Billion Devices. Es ist richtig viel. Wenn man sich so moderne Apps anguckt, dann ist das verbreitetste Java Framework Spring, oder Spring Boot, und mit einem Anteil von irgendwie 70%. Davon, da ist dieser Logger schon quasi, da ist ein Logger immer drin, und davon ist ein Anteil von 40% Log4J. Also es ist sehr, sehr verbreitet. Und es ist auch in den letzten Jahren nicht sehr viel maintained. Also es wurden Sicherheitsupdates gemacht, es wurden wenige Features gepflegt, weil es gibt nur zwei oder drei Maintainer. Für so eine riesen Bibliothek, die so viel verwendet wird, ist das ganz schön wenig, und die haben das auch mega gut gehandelt. Die haben super schnell reagiert, die haben super schnell ein Patch gemacht, weitere Patches gemacht. Also der Fallout von so einer Lücke ist ja meistens, da gucken plötzlich mehr Leute hin. Vielleicht habt ihr sowas schon mal gesehen, wenn jetzt vor ein paar Wochen war Spring vor Shell, wie die alle heißen und so, da ist eine Lücke, die wird neu gefunden, und sofort gibt es noch fünf andere hinterher, weil jetzt plötzlich alle Hecker-Sicherheitsforscher, egal in welche Farbe der Hut hat, dann finde ich da noch mehr, damit ich es patchen kann, oder damit ich es benutzen kann. Genau. Was ist denn Logging, und was kann man damit log4j machen? Logging habe ich eben gezeigt, ich will einfach Eingaben zum Beispiel vom Benutzer oder vom Verhalten meines Programms irgendwo hinschreiben. Klassischerweise hat man das früher in der Datei geschrieben, mittlerweile kann man das, ich hätte gesagt, es ist ein guter Ansatz, das auf einen zentralen Server zu schreiben, in der Cloud weg migriert wird automatisch, dass die Logs noch da sind, dass man auch aggregieren kann über eine gewisse Zeit und über verschiedene Services und so weiter. Und Log4j erlaubt es. Log4j erlaubt aber nicht nur, sowas wie den Weiterversand, sondern auch die komplette Bearbeitung dieses Inhalts. Das heißt, ich kann das kategorisieren, ich kann das nach Zuständen, nach Kritikalität sortieren, ich kann es aufbereiten, also ich kann es formatieren, ich kann das zentralen, aber ich muss es einfach nicht aufbereiten. Das ist das Wissen dazu packen, wenn sich ein User mit seinem Namen anmelden würde und ich möchte das loggen, könnte ich bei meinem Directory server, zum Beispiel LDAP, ADH nachfragen, wie ist die User-ID von der Person? Oder was hat der für Credentials? Kann ich ihm ein Passwortfeld anbieten oder soll ich ihm so etwas wie 2-Factor Authentication oder Ubiqui prompt anbieten? aber der kann das loggen, damit ich nachher nachvollziehen kann, okay, da hat man jemand gpn reingeschrieben, sondern seine User-Eddie ist auch noch fünf. So, JNDi hat vielleicht auch schon jemand gesehen. JNDi ist das Java-Naming- and Directory-Interface. Und das kann man benutzen unter anderem in Log for J, um Logs anzureichern. Und in JNDi kann man eben zum Beispiel einen LDAP, Directory-Interface und so, einen LDAP-Server oder ein ADS-Server anfragen. Typischerweise macht man sowas für Account-Geschichten. User meldet sich an, gibt mir mal alle seine Rollen, damit ich im Nachgang fragen kann, was für Berechtigungen hat der User denn. Man kann aber auch zum Beispiel Connections-Settings erfragen. Man macht das nicht mehr so viel, aber es sind so viele Enterprise-Services, wo man sich so vorstellt, so Top-Modern, Typko oder so was. Da lachen man sich oder weinen, ich weiß das nicht. Genau, keine alten Wunden aufbrechen. Wenn man sich quasi vorstellt, das funktioniert so, ein Client weiß, wo ist der Endpunkt von diesem Server und fragt den, per JNDi, hey, Server, gib mir deine Connections-Settings, die du dir wünschst. Das macht man typischerweise, wenn man sehr viele Clients hat oder hat man früher gemacht, als es noch kein sauberes Config-Management gab, dann kann nämlich der Server allen seinen Clients, die versuchen zuzugreifen, sagen, benutzt bitte diesen TLS-Seifer, benutzt bitte diesen Time-Out, benutzt bitte diese Paketgrößen. Dass man quasi die Möglichkeit hat, zentral an einem Server einzustellen, zum Beispiel auch, wenn der Server merkt, ich werde überlastet, dann ist das so eine Art Loadbalancing-Mechanismus, in dem man dem Client sagt, hey, mach mal höheren Time-Out, weil du kriegst nicht so schnell eine Antwort. Man kann LDAP abfragen, habe ich eben schon gesagt. Beispiel, ich schicke eine User-ID an einen Server und bekomme zurück, was hat der für ein Greeting, ist es ein He-Him, ist es ein They, ist es ein Hear oder sonst wie, damit ich eben sagen kann, hallo, der GPN oder die GPN oder sonst wie. Und noch viele andere, welche Business-Organisation gehört er an und so weiter, beliebig, was man halt so in LDAP pflegen kann und was man eben auch machen kann. Und das ist mittlerweile zum Glück etwas eingeschränkt worden, zumindest mal per Default. Man kann Remote, also von einem anderen Server Java-Klassen herunterladen und lokal ausführen. Und es gibt tatsächlich, zumindest historisch, sinnvolle Anwendungsmöglichkeiten dafür, auch wenn manche schon lachen oder weinen. Ihr müsst es euch so vorstellen, wenn man so ein bisschen zurückdenkt paar Jahre und hat nicht diese ganzen modernen Packaging-Tools, man hat nicht so moderne Rollout-Mechanismen, wo man sagt, hier, ich klick jetzt bei mir an einer Stelle oder das passiert automatisch nach einem Merch, Continuous Delivery und knall ein Update an 100.000 Clients raus. Es gibt aber auch zum Beispiel zentrale Server, die müssen so stabil sein und sind vielleicht sogar, also dass man sich selten in Release macht, typischerweise sind wir auch wieder so im Enterprise-Bereich oder so leider. Man macht wenige Release, das ist alles sehr star und was es dann gibt, sind Services, die werden von z.B. staatlichen Entitäten signiert und geprüft. Also ein Beispiel ist, wenn ihr ein Handlungsunternehmen habt und betreibt in manchen Ländern eine Filiale, zum Beispiel Ungarn oder sowas, dann müsst ihr die Software, die auf dieser Kasse dort läuft, da muss ein Teil der Software vom Start geprüft und signiert werden und ihr dürft nicht nur diese Software benutzen und keine andere auf die Kasse installieren. Und per Class-Loding oder auf euren Server oder sonst wo. Und per Remote-Class-Loading könnte man so eine etwas ein bisschen öfter halt Klassen nachladen, weil man hat ja nichts installiert, so richtig, so ein Runtime-Ding, wo ich zum Beispiel sage, zentral mache ich eine Noise Release, aber ich ziehe mir quasi nur die Änderungen rein und sowas, so kann man sich das ungefähr vorstellen. Sollte man nicht machen, es geht. Also ich sage hier, der Java-App sagt sowas wie hey Server, gib mal was auch immer du für mich hast, ein Newstuff-Class und dann kann ich die bei mir lokal laden. So, kurz zum Naming noch von Lock for Shell, wo kommt das her? Die meisten kennen das vielleicht, man spricht so von eine Shell aufmachen, also hier Linux oder eine Command-Shell, damit man irgendwie Code ausführen kann. Das Ganze geht Remote. Das heißt, ich kann, ich muss nicht an den Server dran, ich muss nicht auf dem Server eingelockt sein. Und es ist ein sehr breiter Angriffsvektor. Ich habe nachher noch paar Beispiele dafür. Warum das so krass einschlägt bei einem Logger? So, was ist das Ganze jetzt bei Lock for Shell? Wir haben so ein Zusammenspiel in der ersten Variante wohlgemerkt. Aus LDAP, JNDi und Remote-Class-Loading. Und das Ganze funktioniert so, dass in dem Moment, wo ich eben dieses, kannst du noch mal zeigen, diesen String von vorhin eingebe, das ist quasi hier so eine Art Protokoll-Angabe. Logger benutze JNDi und greife, also diesen Directory-Index-Gramen-Felefanz, greife per LDAP auf diesen Server zu, den ich dir vorher hingestellt habe und präpariert habe und rufe folgende LDAP, folgendes LDAP-Konstrukt auf. Und genau. Und der LDAP-Server, der antwortet mit einem Haufen Informationen, aber er sagt auch, hey, Achtung, ich habe eine neue Klasse für dich und das kann man in LDAP hinterlegen, weil es nur ein Textfeld ist letztendlich. Und hier hast du eine URL, wo du dir noch eine neue Klasse runterladen sollst. Also sagt Java, jo, alles cool. Ist ja quasi das Protokoll, für das ich programmiert bin. LDAP-Server, wo ich gerade angefragt habe, sagt, ich soll mir da was Hohles holen, jetzt gehe ich zu diesem Web-Server. Ich habe vorher gesagt, der Angreifer hat einen LDAP-Server und einen Web-Server gestartet. Und da muss man sich das so vorstellen, quasi, dass er zum Web-Server hingeht und diese URL, die er vorher aus LDAP bekommen hat, dort anfragt und dann kriegt er einfach ein Stück Binary, also eine fertig kompilierte Java-Klasse und führt die dann aus. Und das ist quasi so ein bisschen die alte Java-Applikation mit noch ein bisschen mehr Java on top. Und da kann der Angreifer einfach reinschreiben, was er will. Und schwieriger wird es dann bei so etwas älteren Services, wo es noch nicht so viele Best Practices gab und jetzt so viel Security Research. Vielleicht kennt ihr das noch, vor allem die Älteren. Früher hat man, weil man darüber nachgedacht hat oder weil es einfacher ist mit den Permissions, solche Java-Apps auch gern als Root oder Admin laufen lassen. Die meisten wissen das und man sollte das nicht tun. Aber das ist eine Lösung für viele Leute, die Port 80 benutzen wollen. Es ist schon, wie viele Fehler sind da schon in der Kette, aber die nicht wissen, wie man es konfiguriert und wie man in Proxy bedient. Und dann stellt man das halt am Tomcat ein und weil man Port 80 und einfach verwenden darf, bei einer Nicht-Root-Applikation kann man ja das als Root laufen lassen. Und damit kann man halt alles machen, was Root auch darf. Es ist übrigens in ganz vielen Docker Best Practices steht, lasst euren Scheiß nicht als Root im Container laufen. Und fast alle Beispiel-Container in irgendwelchen Foren-Blocks, Posts, Vorträgen, die starten in Docker die App ohne zusätzliche User-Config und dann läuft sie als Root. In Docker ist das nicht so wahnsinnig schlimm, wenn man nicht aus Docker ausbrechen kann oder aus dem Container, aber man kann dann als Root einfach noch viel mehr Sachen machen und nachinstallieren, als wenn man jetzt nur normaler User ist. Aber jetzt sind wir dann irgendwann, kommt man zum vierten Vortrag, warum sollte man X nicht tun und da wollen wir ja gar nicht hin. Dass dieses Jane-DI-Runterladen eine blöde Idee ist, das haben unter anderem schon 2016 auf einer großen Security-Konferenz und wahrscheinlich der bekanntesten in den USA auf der Black Hat Leute schon vorgestellt. Jetzt ist halt dummerweise, haben wahrscheinlich alle Leute, die wussten, dass Loc4J das kann aus gutem Grund oder aus einem Grund. Die haben den Talknet gesehen und alle Leute, die den Talk gesehen haben, haben Loc4J nicht vermutlich. Ja, sonst wäre vielleicht mal einer auf die Idee gekommen zu sagen, vielleicht ist das gar nicht so gut, was wir da immer tun oder tun könnten. Ja, kann man gespalten, der Meinung darüber sein, wie das passiert ist, man weiß auch nicht, ob das, das war ja auch vorher schon bekannt und man weiß natürlich auch nicht, wie oft und wie lange das schon ausgenutzt wurde. Vor allem, weil ihr vorhin gesehen habt, der eigentlich Loc1-Drag, der steht ja sogar noch da. Da ist ja kein Fehler geflogen, das mit der Kuh hätte man auch weglassen können und nur Code ausführen. Und warum genau ist jetzt das Problem bei Loc4J? Und das Problem ist ein bisschen, dass ich einfach normalerweise in meinem Beispiel habe ich den Namen gelockt und dann kommt da dieser String da unten zustande. Und wenn man das noch mal so ein bisschen auseinander nimmt und leider ist der Background von der von der neueren Folie passt dann ja zu der gelben Schrift, tut mir leid. Kannst aber vorlesen, man hat quasi, ich war schon mal gesagt, vorne so ein Parameter einfach, so normaler Query-Parameter für den Request. Dann habe ich eben diesen JnDI-Befil, das ich zu älter ab will, dann habe ich den bösen Server, wo ich mir das Ding abhole und so einen Kontext, den ich vorher programmiert, präpariert habe. Und ich würde euch gerne die Demo noch mal zeigen, aber vorher ein bisschen tiefer in den Code einsteigen. Als ich den Talk vorbereitet habe, habe ich versucht, das Ding auch so mit Containern und was weiß ich hinzustellen. Und dann habe ich gesehen, dass der, jetzt habe ich seinen Namen vergessen, Prädigate, Thomas, irgendwas von Berater aus Süddeutschland irgendwo, schon viel besseren Code hat und habe ich beschlossen, das darf ich bestimmt benutzen. Ja, also der Dude, der macht auch coole Videos, heißt, den ihr es nachher nicht verstanden habt, dann guckt ihr das Video von dem noch mal an und der kann das vielleicht, ich habe es nicht gesehen, aber der kann das vielleicht besser erklären als ich, weil er macht das auch ganz oft. Genau. Dann gucke ich ihn mal kurz nochmal, wir gucken nochmal kurz den Code an. Wo ist es? Wo habe ich das vorhin aufgehabt? Sorry, ich dachte, ich hätte das noch offen. Top vorbereitet. Hat jemand Fragen bis hierher? Ihr sollt übrigens, habe ich vielleicht vorher vergessen, einfach reinschreien, wenn ihr Fragen habt. Ja, okay. Da es jetzt schon offen ist, mach so ein bisschen größer, zeige ich schon mal quasi den, den bösen Code, der dann nachher als Klasse kompelliert reingeworfen wird. Also es ist jetzt in diesem Falle erst mal einfach nur so ein bisschen Konsolen-Output. Ja, wo man quasi sagt, hier schreibt auf die Konsole einen, na wo ist es hier, einen Error. Das Logo der Error ist es hier nur zu Demozwecken jetzt und schreibt diesen Text, der danach ankommt. Und was dann gemacht wird, ist einfach damit man nachher auch das richtige, die richtige Mailware oder das richtige Binary ausführt, wird geprüft. Bin ich denn in Mac OS oder bin ich bei Windows, bin ich bei Linux? Bittigerweise machen das ganz viele Skripte von so Exploits für alle möglichen Sachen. Man will ja auch das Richtige angreifen. Vielleicht auch die richtige Mailware nachladen, bringt ja nichts, wenn ich irgendwie extra runter lade und dann habe ich so ein Mac, der nur sorgt, kenne ich nicht, mache ich nichts mit. Genau. Und in meinem Fall war es jetzt eben, mein Server ist ein Mac Gerät und dann rufe ich halt dreimal auf dieses Open Calculator. Und hier könnte man eben alles andere auch tun. Irgendwo noch Mailware, Kryptomeiner oder sonst was runterladen, Keylogger, irgendwas, was den ganzen Traffic mitschneidet, weil verschlüsselt hin oder her. Ich bin halt an der einen Endseite, wo es terminiert oder startet. Das heißt, ich kann das mit TCP dann auch alles mitschneiden schön. Je nachdem wie es verschlüsselt ist. Genau. Und das ist quasi das Stück Code, was man nachlädt und Start Calculator und Linux weiß nur, ob es da einen gibt. Aber es gibt es bestimmt im Zweifel, wie gesagt, ist es eben nur ein Beispiel. Und dann ist quasi der Opferserver, ist ein ganz einfacher Server, der nur sagt, hier ist Spark, ist einfach so ein Server, der einfach diesen Service anbietet, ein Webserver, der hat eben diesen Endpoint, wo man Hallo hinschreiben kann mit einem Parameter, der dann quasi in dieser Parameter Funktionalität gespeichert wird und dann loggen wir einfach dieses Name. Das heißt, hier ist nix mit, das ist 0815 die einfachste Variante von Log4j, die ihr haben könnt. Schreibe ein Log. Und dann kann man im Hintergrund noch hinlegen, das soll auf die Konsole, also normalerweise macht man eine Konfig neben dran, wo man sagt, der LogEintrag soll auf die Konsole, der soll zu einem zentralen Service, der soll in ein File geschrieben werden und man kann, wenn man es braucht, man kann Logs auch in der Datenbank schreiben und in ein OpenJMS-Topic werfen oder so Pappsapp oder sowas machen, wenn man das möchte. Warum auch immer? Wo meinst du dieses? Dieses? Ja, also die Frage war, ich sage nur mal ins Mikro, die Frage war, müssten hier in dieser Log-Zeile eben mehrere Parameter stehen. Ja, wem gehört was? Jetzt müssen wir mal gucken, ob das Log davon noch da ist. Du siehst ja quasi, hier steht Name, Doppelpunkt, das ist quasi der Anfang von diesem String hier, der hier zusammengebaut wird. Und dann kommt einfach der komplette Inhalt dieses Query-Parameters. Ja, Beispiel war SQL, Injection und Prepared Statements, kann man bestimmt machen, das hier ist wahrscheinlich auch Code, den man so nicht einfach schreiben will, aber die einfachste Demo, also hätte wäre, aber weißt du noch, ob ich deine Frage sinnvoller beantworten kann, außer es funktioniert so und es gibt Leute, die schreiben solchen Code und vielleicht sollte man das sinnvoller umgehen und hätte dann das Problem auch gar nicht. Ach so, okay, ob sie im Logger eine Möglichkeit gibt, das getrennt zu behandeln, gibt es bestimmt, du kannst ja auch in Java das Vorher eine Variable packen und dir nur ein String rauslassen und da auch schon Sachen raus extrahieren. Und das Nachlagern, oder ich blicke gerade nicht, worauf du hinaus willst. Und wir müssen uns vielleicht nachher einfach mal, ja, nachher nochmal kurz zusammensetzen, weil ich bin prinzipiell interessiert, was du willst, aber ich verstehe es gerade nicht, tut mir leid. Das Problem ist, dass das Name als zweiter Parameter dann schon so programmiert ist, dass es automatisch erst mal gequotet wird und nichts Böses machen kann, ja, dass man nicht ein String ist, sondern das Name als pack und dann, und das schon safe ist, ja, etwa ja mein fremde String. So was? Okay, also, der andere Kollege hier vorne hat es erklärt, dass man quasi schon das Ganze irgendwie gequotet und escaped, damit eben nur noch ein String reinkommt, richtig. Ich versuch's einfach mal so, letztendlich. Ja, was ist ja vertiert wird. Ach so, okay, dass der, ja, ja. Das ist der Wahl ins Loch geben. Okay, jetzt, dass der String vom Angreifer nicht mehr interpretiert wird, ja. Ja, kann man in Lochboot Share auch konfigurieren, aber hätte man das jetzt ausgeschalten, müsste man jetzt irgendwie Däumchen drehen und Spiele machen oder so, genau, aber grundlegend ist es so, Java setzt hier zuerst mal einen String zusammen. Ja, das heißt, das ist schon nur Zeichenkette. Und Lochboot Share wertet aber diese Zeichenkette halt aus nach so Inline-Parametern und so passiert das ganze Ding quasi. Genau, so, jetzt, wir haben einen HTTP Server, der kann gar nix. Das ist so 0815, mach Port 8080 auf und wenn die Frage nach diesem File hier badcode.class kommt, gib dem Consumer dieses File als Bystream. Und dann gibt's noch den LDAP Server, das ist eigentlich so die interessanteste Geschichte an der ganzen Nummer. Da ist noch ein bisschen 0815-Config, die das Ding aufsetzt, ist total irrelevant für das Beispiel, weil wenn man einen echten LDAP Server oder einen präparierten Server im Internet betreiben würde, das hier würde komplett ausreichen, aber wahrscheinlich würde man da, ich würde als Angreifer noch bisschen mehr Spaß drin verstecken auch. Was interessant ist, ist letztendlich dieses Ding hier, das ist dieser einen Eintrag, den man da quasi anbietet und den auch der Angreifer mit diesem String in Lock4J ausführt. Das ist einfach Lock4J das richtige Objekt, wenn man so ein LDAP-Sprech ist, aufruft. Wo im Endeffekt drin steht, geht zu Localhost 8080, wo eben der präparierte Webserver läuft, von mir als Angreifer und schnappt dir das File und die Klasse Bad Code und der eine davon ist quasi ein, so heißt die Klasse und der andere davon ist, führe es bei dir lokal als diese Klasse aus. Und dieses Zeug hier reicht quasi, diesen großen mächtigen J&I-Konstrukt, dass er einfach diese Klasse runterlädt und ausführt. Per Default ist das in irgendeinem JDK deaktiviert worden, vor ein paar Jahren schon, so was wie JDK 8, JDK 121 Version oder so was. Wir sind bei 200 irgendwas, das ist schon eine ganze Weile her. Ich habe gestern frisch Java 8 installiert, es funktioniert noch. Ich bin nicht ganz sicher, wie das zusammenpasst, aber irgendwie geht es noch. Localhost ist erlaubt. Bitte? Localhost ist erlaubt. Ah, Localhost ist es erlaubt. Okay, gut, da habe ich kurz gewundert. Okay, Localhost ist es erlaubt, ja gut, es ist natürlich doof, denn der Angreifer schon bei dir zu Hause wohnt, aber grundlegend ist natürlich immer die Frage auch, wie viel ist denn an so JDI-Kram eben erlaubt, gerade wenn man so ein älteres Konstrukt hat, weil die Leute genau sowas benutzen wollen. Wir werden doch gleich die Ticket-Nummer verlinken, wie das Ding als Feature in Java, in LocalJ, reingekommen ist. Das ist mit Absicht da rein passiert, weil Leute das gute Idee irgendwie empfunden haben. Genau, das ist quasi dieser ganze Server-Code hier, und wie gesagt, ich könnte es jetzt nochmal ausführen, dann seht ihr fünf Taschenrechler und ne Kuh. Die können wir auch den ganzen Abend noch spielen. Genau, und das Kratzeln, was jetzt bei LocalJ passiert ist, im Vergleich zu so einer typischen Schwachstelle, wo man sagt, ich muss eben den bestimmten Stringen in den Service reingeben, damit der ausgeführt wird, wie zur SQL Injection oder sowas. Das ist eben hier was anderes, weil man quasi auf ganz viele Weisen so ein Server dazubekommen kann, was zu loggen. Also sprich, es gibt ganz viele witzige Beispiele, wo vielleicht auch ein paar Lacher noch kommen, vielleicht auch nicht. Man könnte zum Beispiel, ich habe mal von einem hier ansässigen Unternehmen ein Log-in-Screen aus einem App genommen, man könnte das Ding zum Beispiel als seinen Username ausgeben. Das ist jetzt kein typisches Feld, was irgendwie in so einem Angriff bei einer anderen Schwachstelle ausgewertet werden würde. Wenn jetzt aber zum Beispiel der Logger hingeht und sagt, ich logge tatsächlich alle User, die sich angemeldet haben, vielleicht auch, weil ich noch im Ramp ab bin bei einem kleinen Start-up oder sowas, ja, und guck mal, welche User waren denn wie oft da. Es gibt sicher sauberere und bessere Methoden, das zu tun. Aber es sind Sachen, die sieht man dann doch schon mal, auch wenn man gerade so Beratung macht oder sowas. Und als dann sowas im Internet hochkam, im Dezember, da wurden die Leute richtig kreativ. Zum Beispiel, vielleicht geht es nicht im Userfeld, aber vielleicht geht es im Passwort vergessenfeld. Vielleicht ist da eher sowas, wo ich sage, ja, ich will nicht alle User loggen, aber ich will die User loggen, die eine E-Mail hinterlassen haben und damit ausgesagt haben, ich habe meinen Passwort vergessen. Einfach nur, damit ich nachher nachvollziehen kann, hat der User sich vielleicht doch noch mal versucht, einzuloggen, hat es dann funktioniert, weil da muss ich mir Sorgen machen. Und das ist tatsächlich in vielen modernen Betrieben, die Internet und Produkte machen, ja, einen Riesenfaktor, einen Riesenpane. Wenn fünf Leute sich nicht anmelden können, hast du fünfmal eine einstärkende Bewertung in deiner App. Egal, ob es der Webserver war, die App, oder wenn sie irgendwo an das Auto nicht angekriegt haben oder sowas, ja, aber die App ist schuld, ein Stern und dann reist sich das runter und dann hast du weniger Download-Zahlen, also zumindest im Kopf von manchen Sales-Leuten oder sowas. Ich bin ja mehr so Backend-Mensch, mir ist das egal, wenn die App nicht geht. Genau. So, wie ist das Ganze reingekommen? Ich will jetzt nicht so wahnsinnig viel vorlesen, aber 2013 hat jemand das als Feature gefordert, genau das. Nicht, dass man Melber nachladen kann, natürlich, sondern, dass man eben noch aus dem Elderbserver das Log mit Daten anreichern kann. 2013 gab es schon zentrales Logging in manchen Firmen, aber es gab da immer noch viele Firmen, die haben halt einfach in so ein Pfeil gelockt. Und da konnte man über drei Ecken damit, zum Beispiel, was hier so als Beispiel drin steht, die Pfeils aus mehreren, das ist zwar für den, der das Feature gestellt hat, eine Möglichkeit, Pfeils von mehreren Instanzen einer App, glaube ich, zu aggregieren. Einfach, weil man da halt einfach noch mehr Zeug mit dranschreiben kann, dass man eben von extern holt, wovon die Applikation gar nichts weiß, weil sie diese Daten gar nicht hält. Ja, und das heißt, prinzipiell ist dieser, oops, falscher Knopf, dieser Angriffsweg ist seit 2013 offen. Also, quasi fast, der hatte fast zehnjähriges, bis der letztes Jahr quasi gefunden wurde. Und zum Glück relativ schnell gepatched wurde. Und ich glaube, es ist noch nicht so viel Fallout bekannt. Aber wenn man diese ganze Szene so ein bisschen verfolgt, weiß man auch, dass nicht so viele Firmen damit irgendwie ans Licht kommen und sagen, aha, wir haben alle unsere Kundendaten verloren. Oder wir haben so viel Geld dafür bezahlt, dass sie nur in eine Richtung verloren gingen und dann wieder zurück kam oder so. Und wo geht es weiter? Jetzt habt ihr vorhin gesehen, das Log hat diesen Angriff-String ins Log gespeichert, der Logger. Wenn ihr jetzt zentrales Logging habt, dann wird dieser String auch im zentralen Logging abgelegt. Weil es ist ja ein-zu-einzen-String, der wird da quasi irgendwie hinkopiert. Jetzt ist sowas wie Elastic, der ganze Elkstack, also hier Kibana und sowas, das ist alles Java. Ja, so, ja, die ersten Lachen schon, weil natürlich jeder weiß, jetzt hast du quasi das Ding, jetzt hast du auf einem Server im Internet, der irgendwie erreichbar war, die Pest, und das steckt halt alles an. Und dieser String wird in weitere Systeme geschrieben. Und jetzt muss man sich vorstellen, wenn in einer Firma sehr, sehr viele Java-Entwickler sind, dann schreibt auch jemanden Tool, was an der App hier von so einem Elastic-Stack Logs auswertet. Um wo drin schreibt er das? In Java und vielleicht hat der Lokal-Logging und dann irgendwann hast du das halt in allen Rechnungen. Kreativ auch, wenn man sich vorstellt, man hat so eine App, die man... Und das ist die Frage, wie kriege ich denn das in möglichst viele Systeme rein, wo ich keinen Web-Service habe, wo ich einfach mit dem Browser irgendeinen Mist hinschicken kann? Bei einem großen ortsansässigen Handelsunternehmen kannst du dich mit deiner App anmelden, am Scanner selbst, an der Kasse. Und du scannst halt... Das ist kein Geheimnis. Wer hat die der App? Ich hab's ja auch nicht, aber... Wer ist ein Partnerin oder Partner hat die... Nein, lassen wir das. Ich kann natürlich jetzt als Angreifer... Ich kann ja mir davon ein Screenshot machen und kann einfach einen anderen QR-Code... Zwei Minuten googeln, online QR-Code-Generator, da stopfe ich diesen String rein. Und dann steht da eben nicht mehr, meine Kundennummer ist 12345, dann steht da irgendein Angriffsstring, wo ich dann wieder einen präparierten Server laufen lasse und dann eben nicht quasi auf Localhost, sondern im Internet, vielleicht bin ich dann auch schon safe als Java-Betreiber oder so. Und das ist halt echt spannend. Was auch viel aufgetaucht ist, sind solche SSIDs. Leute, die sowas in ihren Twitter-Username passen, packen. Leute, die ihr Handy so nennen. Ja, ihr lacht, ja. Es ist offensichtlich auch bei iCloud was ausgefallen, weil die Leute ihr iPhone so genannt haben. Oder ihren Namen und ihren Namen und dann hast du irgendwo... Das ist das, was ich meine mit Fallout. Es gibt von Apple irgendwo ein Statement, wo man gesagt hat, ja, wir waren dagegen, Angreifbar-Deal, fertig. Und gingen da vielleicht fünf Calculator auf oder wurde die Kundendatenbank irgendwo ausgelutscht? Weiß man nicht. Und da wird es ja so eine SSID, wenn ich hier mit so einem Ding rumlaufe, dann haben das alle eure Handys, egal ob außer ihr habt WLAN aus, und vielleicht selbst dann, weil Google noch hinten dran irgendwie guckt, hey, wie heißt denn das WLAN hier, weil dann mache ich bessere Geolocation und so, als jetzt nur mit GPS. Aber prinzipiell jedes Handy und wenn da alte dabei sind, ja, die eben noch so Java basierte Android-Apps und so weiter, könnte man sich vorstellen. Ja, Handyname habe ich schon gesagt, dann findet ihr halt alle Access Points oder eben die Betriebssoftware, die ja dann doch oft... Der Access Point hat sicher kein Java, aber vielleicht sein Frontend oder sowas. Bluetooth Devices. Ja, ich habe vorhin zufällig, weil der Präsenter halt Bluetooth kann halt so eine Latte von... Möchten Sie mit folgenden 84 Bluetooth-Services Geräten reden, wenn da sowas dabei ist. Und ich habe so eine App, wie die von Logitech, die bestimmt auch sehr gut ist. Ja, dann habt ihr sowas vielleicht auch in Java. QR-Codes auf Tickets. Geht ihr auf ein Konzert? Und der Scanner geht nicht. Und dann kommt der Kollege und der Scanner geht auch nicht. Lassen die euch rein. Und da hinten steht ein Riesenschlange. Die Leute sind betrunken und fangen an zu pöbeln. Ich habe es noch nicht probiert, in so einen Konzert reinzukommen. Aber es wäre ja denkbar. Ihr könnt Formulareprüfungen an der Hochschule, vielleicht nicht euch eine gute Note verschaffen. Aber man könnte prinzipiell ja in irgendeinem Online-System sowas hinterlegen und einfach den Server zum Crashing bringen. Wenn keiner abgeben kann, habt ihr zumindest noch mal Zeit zum Lernen, bis die Cyber-Attacke vorbei ist. Oder eben ihr bewerbt euch bei der Konkurrenz. Mittlerweile hat jeder so einen Riesen-SAP-System. Die haben alle auch viel Java. Und dann schreibt ihr halt euren Namen. Hallo, ich heiß. Christian Kühn, Held-Up, GNDi. Und vielleicht geht aber im Zweifelsfall nur deren HR-System für drei Wochen kaputt. Und dann könnt ihr die ganzen Leute, die sich dort eigentlich beworben, hätten bei euch einsammeln. Wie kann man sich schützen? Grundlegend ist ja immer die Frage, wann kommt so ein Angriff? In der Regel, wenn es jetzt kein so ein Zero-Day ist, gibt es zuerst die Meldung der Schwachstelle. Und gerade so im letzten ein, zwei Jahren hat sich relativ oft gezeigt, dass dann schon die ersten bei Open Source irgendwelchen Merch-Requests, Pool-Requests und Branches von irgendwelchen Maintainern auf großen Repos die werden beobachtet. Da steht dann schon so was wie, ah, da irgendwo könnte was mit Spring kommen. Und der, jetzt wollte ich Entertainer sagen, der Maintainer, der hat gestern irgendwie in dem Serializing von Zertifikaten bei Spring Beans irgendwas gebaut. Da kommt bestimmt, was da ist, die Schwachstelle. Ob sie es dann ist oder nicht, was gucken dann eben mehr Leute hin? Und wenn man sowieso Responsible Disclosure oder eben so ein Public Disclosure ist, es gibt auch Leute, die hauen das Ding einfach ins Internet raus. Und dann kriegt ihr eine Schwachstellenbezeichnung relativ schnell. Meistens ist es so, dass mit der Veröffentlichung auch in der NIST Schwachstellen-Datenbank und bei den großen Herstellern, die sowas auch verbreiten, ja, sowas, dass die ganzen Firmen, die so Security Scanner verkaufen und vermitteln, die haben meistens relativ schnell so eine Schwachstelle drin. Das heißt, der erste Schutz wäre, zumindest mal dann, wenn es passiert ist, dass ihr aktiv euch aufmerksam machen lässt. Last in einer deiner Bibliotheken, die du verwendest, ist eine Schwachstelle drin. Overst Dependency Check kann das zum Beispiel oder Snick oder sowas. Da gibt es Anbieter, die machen das gratis und open source. Overst war vielleicht so ein Hind dafür. Ansonsten, ja, Security Trends kennen. Ich habe Lock4Jay zufällig abends auf der Couch gesehen, aber nur weil ich irgendwo ein Twitter rumgesucht habe und da stand was mit hier, Achtung, Riesensicherheitslück und ich dachte, uuh, ich guck mal, wir mussten jetzt doch noch mal kurz an meinen Rechner und mein letztes Projekt auschecken und gucken, was wir da für eine Version, ah, kein Lock4Jay drin, gut. Also da, wir sind in der anderen Hälfte von Spring Logging abgebogen im Standard. Und man braucht einen guten Contingencyplan, also einen guten Notfallplan in seiner Firma und ihr wisst es wahrscheinlich, alle, die ihr euch für solche Themen interessiert, vielleicht wissen es aber eure Kollegen nicht. Und deswegen kann ich nur dazu aufrufen, wenn es bei euch sowas noch nicht wissendlich für alle gibt, tragt doch einfach das Wissen mal in die Breite und erklärt mal den Kollegen, hey, oder stellt mal die Frage, was wäre eigentlich, wenn wir morgen so ein Problem hätten? Was würden wir tun? Würden wir unseren Server ausschalten? Ist ja immer eine Möglichkeit. Dann kann man das beziffern, was es uns kostet. Ja, für die Chance, dass es uns nicht die Politik den Laden, oder die Justiz den Laden zu macht, weil wir eben unsere Kundendaten verloren haben. Das ist ja immer so die zwei Extreme. Was es ist, ist letztendlich wie eine Versicherung. Machst du vorher aus, hast du vielleicht nicht den Ausfall. Genau, Schwachstellenscanner habe ich gerade schon gesagt, dependency check, automatische Updates. Wenn du jetzt werben, dass man im Restream den Talk von 18.15 angucken könnte, wo erklärt wurde, wie das geht. Ungenutzte Features deaktivieren. Man kann dieses J&I Lookup oder Messaging Lookup schon immer in Log4J deaktivieren. Und das wurde dann kurzfristig, weil das der erste bekannte Workaround auch. Aber, also, dass man quasi sagt, warum muss ein Logger in dem String irgendwas aufrufen, wenn ich das Entwickler doch möchte, dann kann ich es doch wenigstens extra mir die zwei Minuten mühe machen und das Außen rumrappen irgendwie. Deswegen, alle Features, die ihr nicht braucht, warum benutzt man die? Warum habe ich Features in meiner Anwendung, die ich nicht brauche? Weil jedes Feature, was ich nicht brauche und auch nicht regelmäßig in irgendwelchen Regressions-Tests habe, wird irgendwann kaputt gehen. Also, Christian's Law oder so. Security News lesen könnte man und Infosekt wird da verfolgen. Ich habe so ein paar Blocks, die ich persönlich für ganz gut halte. Wahrscheinlich kennt ihr die aber zum Teil. Das ist auch mal als PDF irgendwie raushauen, irgendwo hin. Und dieser Contingencyplan ist meiner Meinung nach eines der wichtigsten Dinge, die man im Unternehmen oder in seinem Projekt haben sollte. Nämlich, es wurde eine Schwachstelle gefunden. Nachdem man sie gefunden hat, wer macht was und wie schnell. Damit man sich im Klaren wird. Wie wichtig ist es für uns, wenn dieser Service ausgeht? Der einfachste Angriff wäre natürlich einen Start-Down. Wenn das Server weg ist, ist es vielleicht auch blöd für euch, vor allem wenn der RZ steht und die ganze Kiste mit ausgeht und ihr habt einen Notfallplan. Ganz wichtig übrigens, wenn ihr eine Schwachstelle findet, erst mal ruhig durchatmen. Weil dann kann man besser denken und so was. Und wenn sie denn ausgenutzt wurde, auch wieder ruhig durchatmen, aber überlegen wer macht was, wie schnell und wen muss sich informieren. Hab ich eine Law-Abteilung ... muss ich auf jeden Fall informieren. Das gibt richtig Ärger, wenn man das nicht wird. Habe ich eine Security-Abteilung, habe ich eine Datenschutzabteilung, ... ... habe ich als Entwickler vielleicht so eine Ops-Abteilung, ... ... wo ich sagen kann, hey, ... ... gib mir mal deine Telefonnummer von zu Hause, ... ... falls ich heute Nacht um drei anrufe und sage, ... ... mach den Server aus, ... ... wenn man noch so ein klassisches Admin-Dev ... ... getrennt Modell hat. Genau, so, ich habe gerade gesehen, ... ... also gibt es noch Fragen zwischendurch eigentlich, ... ... aber können wir auch nachher noch mal machen, ... ... nachdem ich gerade einen 15-Minuten-Schild gesehen habe, ... ... ist er noch ein bisschen Zeit, ... ... deswegen werde ich noch ein bisschen, noch ein bisschen erzählen. Haben wir jetzt eben schon gehört, ... ... außer Localhost, hätte ich selber drauf kommen können, ... ... ist das Ding erst mal aktuell deaktiviert, ... ... also dieser Look-up, ... ... dass man quasi einen Remote-File runterlädt, ... ... von einem Web-Server, ... ... was aber funktioniert und was dann auch so, ... ... wo sich der Angriff dann so hinbewegt hat, ... ... ist man braucht gar keinen Web-Server und Elder-Server mehr, ... ... sondern nur noch einen Elder-Server. Weil jetzt kommt wieder das gute, mächtige Java ins Spiel. Java hat ein ganz abgefahrenes Feature, ... ... das kann nämlich außen im binären String, ... ... eine Klasse erstellen, also serialisieren. Das muss dafür ein serializable Interface implementieren. Wie das Ganze geht, ... ... das wird jetzt wahrscheinlich die Timebox knallhart sprengen ... ... oder sowas, aber letztendlich ist es quasi so, ... ... der String ist ein deserialisiertes Objekt, ... ... und den bekomme ich ja von Elder-Up und Elder-Up sagt mir, ... ... hey, benutzt dieses Ding und Java weiß alles klar, ... ... das ist deserialisiert, ich serialisiere mir das. Und dann muss man so eine ganz abgefahrene Kette machen, ... ... es gibt so ein paar Tools in der Standard-Java-Library, ... ... mit der man dann überhaupt dazu kommt, ... ... dass diese Klasse ausgeführt wird. Und die sind alle für sich ein sinnvolles Feature, ... ... also die Kette geht so ungefähr, wie es muss, ... ... dieses serializable implementieren, was kaum jemand benutzt. Es gibt so ganz abstruse Zusammenhänge, wo es Sinn macht vielleicht. Und was man dann machen kann, ... ... ist verschieden andere Bibliotheken, die im Standard-JDK drin sind, ... ... das heißt, die muss man nicht nachladen, ... ... die sind einfach schon gratis da, kann man benutzen, ... ... eben um eine Klasse zu erstellen, ... ... die dann eben das Ding als Java-Klasse hat, ... ... darin ist dann halt schon eine Methode ... ... und dann kann man mit einem anderen Tool, ... ... und es dreht sich irgendwie um so etwas wie XSLT, ... ... also so Style-Sheet-Zeug, ... ... dazu auch kommen, dass diese Klasse auch noch ausgeführt wird. Und dann bist du quasi da, wo du vorher warst, ... ... nur ohne diesen Extraserver. Und eigentlich auch ohne, dass du einen Glass-File runtergeladen hast, ... ... weil es kam ja nur String, ... ... also Base-File selbst formuliert oder so. Genau, und dann hast du das Ding quasi auch in deiner Java-App, ... ... und dann bist du genauso doof wie vorher, ... ... weil dann hast du genau das gleiche wieder erreicht, ... ... nur eben, dass es eben nicht als Glass-File kam, ... ... und du hast das deaktiviert oder das war deaktiviert, ... ... und du warst safe. Genau. Ich hoffe, es hat euch Spaß gemacht, wenn, fragen. Gerne. In die Mannschaft ist es halt wirklich Pemm-Files, ... ... also irgendwie so ein kleinen Zertifikat, ... ... dass irgendwie dann auch mit irgendwie Common-Name ... ... irgendwo reingeschrieben wurde oder so. Also die Frage war, ob es da, ... ... zumindest kann man mal sagen, mir bekannt, ... ... irgendwie kleinen Zertifikate Pemm-Files oder so was gab, ... ... weil Base64 richtig, ... ... weiß ich nicht, ... ... maybe? So, ich kann es tatsächlich nicht sagen. Wenn ihr Interesse habt, ... ... kann ich auch den Code raussuchen, ... ... wie man das ganze Ding auch mit dieser Serialisierungs-Methode ... ... irgendwie ausnutzen kann, ... ... das ist ein bisschen mehr Java-Magie, ... ... was man damit dann alles anstellen kann, ... ... so tief war ich dann nicht drin. Ja, für mich war es tatsächlich irgendwann so ein, ... ... komm, ich habe jetzt gefunden, was ist kaputt, ... ... wie kann ich es patchen, ... ... und jetzt kann ich es dem Rest erklären, ... ... damit er das auch weiß hat. Ähm, das Problem ist ja, ... ... also für die Sicherheitslücke, also für Sicherheit, ... ... wäre es besser, wenn Dollar, geschweifte Klammern, ... ... nur normale ASCII-Zeichen, ... ... also nur als ASCII-Zeichen behandelt werden würde, ... ... aber für die Feature-Liste wäre es besser, ... ... wenn Dollar, geschweifte Klammern was Besonderes wären. Wäre es ein guter Kompromiss, wenn man sagt, ... ... Dollar, geschweifte Klammern, ... ... darf nur dann etwas besonderes sein, ... ... wenn dieser String schon bei der Kompellierung gegeben ist, ... ... aber nicht, wenn es ein One-Time-String ist, ... ... weil das macht Wast an manchen Stellen. Wahrscheinlich ja. Das ist so Input-Validation, ... ... das ist ein ganz klassisches Input-Validation-Thema. Wann will ich quasi dem Input, ... ... also das, was mir typischerweise der User gibt, vertrauen? Und mein, mein Favourite wäre eigentlich nie. Ja, also ich, was willst du, ja, natürlich wäre das eine Lösung, ja. Sobald du halt an irgendeine Klasse, die sowas als Feature mitbringt, ... ... dass die Code ausführt, was durchreichen kannst, ... ... wird früher oder später vielleicht jemanden einen Weg finden, ... ... da Code zu implantieren. Ganz klar, ja. Wenn man hingehen würde und sagen eben, was ich vorhin gesagt habe, ... ... man könnte natürlich auch diesen Parameter, ... ... wenn man dieses Feature braucht, ... ... vorher schon auswerten und dann in den Logger das Ergebnis reinstopfen. Ja, es ist sogar, ich glaube, wenn man so Standard Java schreibt ... ... und es wird in einem Logger was aufgerufen, irgendeine Methode, ... ... dann kriegst du so ein, in jeder IDE so ein riesengroßes rotes Feld, ... ... es sagt, ah, mach das nicht, mach es vorher, wenn du es brauchst ... ... und sonst mach es gar nicht. Aber das wäre wahrscheinlich eine Lösung. Aber sobald Leute so was haben wollen ... ... und ich kann das auch nachvollziehen, ... ... dass zum Beispiel so ein Maintainer so was einbaut, ... ... weil er vielleicht in dem Moment selber ja nicht drüber nachdenkt, ... ... weil ich mache ja Logging, ich mache ja gar eine Security, ... ... vielleicht gibt es auch jemand von Security, der sagt, ... ... ah ja, was soll da schon passieren, ... ... weil bis jetzt kam halt noch keiner auf die Idee, ... ... das dann auch noch überelbt hat mit GNDi und so weiter zu verdrahten. Wenn du so einen Druck hast, als Maintainer auch Features zu liefern ... ... und ich weiß noch, ob ihr schon mal bei GitHub in so eine Issuliste ... ... reingeguckt habt, die Nutzer, die nix für eure Software bezahlen, ... ... die sind schon ganz schön unverschämt zum Teil. Ich glaube, da kann man auch schon einen gewissen Druck irgendwie ... ... haben, so was einzubauen, wenn man es vielleicht auch gar nicht so cool findet. Aber ist das nicht schon so ein halb gelöstes Problem eigentlich? Ich meine, wir hatten das ja ganz so bei SQL Injections und alles, ... ... und da gibt es jetzt schon diese Best Practice eben mit, ... ... ich teile den String auf so format Stringmäßig, ... ... sieht das meist aus, das vom Entwickler gegeben ist ... ... und da setze ich dann ein vom Benutzer gegeben ist, ... ... aber das wirklich nur als String, ohne irgendwas zu interpretieren. Wieso hat sich das noch nicht so allgemeiner durchgesetzt ... ... und war jetzt zehn Jahre lang quasi unbekannt ... ... und gibt es da vielleicht noch mehr, wo andere Logging-Sachen ... ... und sonstiges, wo da noch was auftauchen wird? Also, ich glaube, dass so was in ganz vielen Fällen noch drin ist. Ja, es ist wie gesagt so ein Feature von 2013. Vielleicht hat es außerdem das bestellt, hat auch gar keiner benutzt ... ... oder die Leute sind schon lange zu anderen Programmiersprachen ... ... oder zu anderen Firmen oder zu moderneren Stack-Up gewandert ... ... oder sie haben vielleicht Lockfall J1s ... ... und sind überhaupt nicht betroffen, weil es da gar nicht so ausgewertet wird. Es ist halt immer die Frage, wie viel ist reale Welt ... ... und wie viel ist es müsste eigentlich so sein. Natürlich macht es Sinn, allen Input zu validieren, ... ... bevor du ihn irgendwo anders reinstopfst. Auch Objekte zu manipulieren ist ja auch so was, ... ... das, was in C so viele Leute mit Pointernet verstanden haben. Wann kann ich ein Objekt wie übergeben? Ja, was ja Rust einfach auch viel stabiler macht. Also, wann darf wem gehört das Objekt und wer da darauf irgendwie ... ... darf darauf irgendwie Mutationen ausführen oder Änderungen ausführen? In der perfekten Welt gibt es sowas nicht, ... ... aber es wird sicher noch 30 Jahre genau solche Schwachstellen geben, ... ... wo einfach Leute Software schreiben, die ja nicht so stabil ist. Ich will es nicht mal sagen bei Java, das kann dir prinzipiell ... ... vielleicht in der einen oder anderen Sprache weniger, ... ... aber prinzipiell überall auftauchen, ... ... wenn du einfach so lange um so ein Feature außen rumschreibst, ... ... bis es irgendwie funktioniert und sobald es jemand aus ... ... weil du kannst ja diese ganzen ... ... Zichtangriffsszenarien, der gar nicht überlegen, ... ... die deine Software prinzipiell angreifen können. Aber ja, wahrscheinlich wäre es so, dass das perfekte Bild einer ... ... nicht hackbaren Software, dass einfach, dass die Software perfekt ist, ... ... aber es ist utopisch. Kleine Anmerkung dazu, Log4j und eigentlich alle mir ... ... bekannten Logging-Frameworks für Java haben schon seit ... ... ewig immer parametrisiertes Logging. Und jetzt als Reaktion auf dieses Log4-Stell hat man auch ... ... noch mal genau darauf geachtet, in welchen Parametern überhaupt ... ... diese dollargeschweifte Klammer auf Sache ... ... interpretiert werden kann. Und es ist jetzt standardmäßig tatsächlich auch so, ... ... dass es nur im ersten Parameter gemacht werden kann. Also so was wie SQL Injection ist eigentlich dann auch nicht ... ... mehr möglich. Ja, bis der erste rausfindet wie, aber natürlich, ... ... aber das ist genau dieses Thema. Du hast an einer Software irgendeine Schwachstelle ... ... und dann gucken alle hin. Und so kommt es auch bei Log4j diese Versionierung, du hast ... ... ich glaube in 2014 irgendwas ist es kaputt. Und es ging bis mehrere 15. Versionen, bis in der 2017 irgendwie ... ... X, das alles, was bis dahin gefunden wurde, gefixt wurde. Und es gibt ja Tausende von so krass verbreiteter Software, ... ... sodass jetzt sogar ja Firmen auch hingehen wie ... ... Google und Mozilla und die Apache Foundation und andere, ... ... die einfach sagen, hey, neben Backbounties machen wir ... ... so Programme, wo wir uns ein Stück Software hernehmen ... ... und das so lange auseinanderschneiden, bis wir der ... ... Meinung sind, wir haben alle zumindest trivialen ... ... Sicherheitsprobleme, die auch jemanden, die auch ... ... ein Böseartiger finden könnte, gefunden. Und das ist immer eine so eine Timebox-Frage. Ja, wenn du fünf Tage so ein Stück Software backerst, ... ... wisst ihr alle selber. Und vielleicht werde ihr am sechsten Tag die Lösung ... ... gekommen, wenn du es dann jemand anders erklärst, ... ... aber wenn du noch fünf Tage heißt, hörst, also halt ... ... aufhörst, dann ist das Ding halt gelaufen. Und du wirst eben, es ist cool, ich find's super, wenn ... ... so was auch, dass jetzt viel mehr auf solche Lücken ... ... öffentlich werden, früher hat man das irgendwo ... ... in der Tisch gekehrt wahrscheinlich bei so einer Firma, ... ... schnell ein Update rausgehauen gesagt oder wie es bei ... ... Apple oft so ist, du siehst die Release Notes, ... ... da steht was von Emojis und dann hörst du ... ... hinten rum oder liest du in irgendwelchen Blocks, ... ... hier sind die folgenden acht Schwachstellen, ... ... die Apple in diesem Release gefixt hat, ... ... die ich gefunden habe. Und je mehr so was publik wird, ... ... desto mehr können auch eben Sicherheitsforscher, ... ... also die das besser machen wollen, da drauf gucken und ... ... bessern. Ich glaube, ich habe das Kabel rausgezogen so ein bisschen, ja. Genau, ansonsten, wenn ihr noch Fragen habt, ... ... ich bin noch den ganzen Abend noch da, kommt gerne noch vorbei, ... ... weil ich glaube, der Timebox ist jetzt auch hier ein bisschen ... ... einigermaßen rum, bis noch jemand ankommt. Okay, möchte noch jemand? Auch gut. Ansonsten kann ich dich hier mit der Lieblings ... ... Mitigation für die Sicherheitslücke beschäftigen. Was denkst du über die beiden Aussagen? Eine Waffe ist die Lösung, um das Ganze wegzukriegen, ... ... also eine Web Application Firewall. Die zweite Aussage, wer muss einen eigenen Fog, ... ... da wird nichts passieren. Ja, ich glaube, die Audience hat ja gerade die zweite Frage ... ... schon beantwortet. Ja, das haben alle mit dir gelacht. Ne, und eine Waffe ist halt genau hier, ... ... sitzigerweise war dann auch so ein, ... ... das Problem von diesem Angriff, ... ... oder den zu finden und zu stoppen. Man hat an ganz vielen Web Application Firewalls, ... ... diesen JNDi-String rausgeblockt. Jetzt haben Leute dann, das ist immer so ein Wettrennen, ... ... Angreifer gegen Verteidiger. Der Verteidiger hat gemerkt, ah, da JNDiI-LDAP, ... ... das lasse ich schon gar nicht rein als Input-String. Als die Leute auf die Idee gekommen, ... ... ich muss JNDi-LDAP nicht zusammenschreiben. Man muss sich das mal vorstellen, ... ... ja, der String wird irgendwie gepasst ... ... und es muss nur die Reihenfolge JNDi und so weiter stimmen, ... ... da können andere Buchstaben dazwischenstehen ... ... und es wird trotzdem ausgewertet. Ja, und das ist so ein Punkt, ... ... jetzt kannst du dich nämlich fragen, wer macht sowas? Ja, aber ich weiß nicht, also, wenn ich den Code halt angucke, ... ... den die auch zum Fixen geschrieben haben, denke ich dann, ... ... okay, ich hätte es nicht hingefixt bekommen, kurzmal, ... ... ja, und ich kriege wahrscheinlich auch die restliche ... ... 200.000 Lines of Code von Lock4J, ... ... auch net so schön hingebaut oder so was, ... ... wie derjenige das Konto damals, der es gebaut hat. Ja, also, es ist ja net so, dass die Entwickler schlecht sind, ... ... sondern die haben halt einfach in dem Moment ... ... wahrscheinlich nicht alle 100% Möglichkeiten bedacht, ... ... die sich User und Angreifer ausdenken, ja, ... ... und dann kommst du halt irgendwann an diesen Punkt, ... ... du kannst es nicht perfekt machen. Ja, und diese Waff-Geschichte ist halt so eine Sache, ... ... es wurden ja auch Server betroffen, die gar net im Internet hängen. Ebenso zweite, dritte Reihe, ja, ich kann zum Beispiel, ... ... wenn ich eben meinen Kunden-Input an der Kasse bei DM, ... ... mit der App Scanner und ende halt den QR-Code, ... ... ja, dann scanne ich halt da irgendeinen anderen String rein, ... ... wenn ich das bei, und das muss ja jetzt nicht DM sein, ... ... das geht ja bei allen mittlerweile, dass du Coupons selber scansst, ... ... das ist ja einfach nur ein Schnipsel QR-Code, ... ... das kann ja alles sein, Barcode, QR-Code, ... ... weiß da gar was, ja. Oder eben, wo es, ich glaube, wo es aufgefallen ist, ... ... ursprünglich diese Sicherheitslücke war in Minecraft, ... ... ja, und jemand hat das genutzt, ... ... um anderen Leuten den Kleinen wegzuschießen, ... ... ja, das heißt, die haben auf dem Minecraft-Server ... ... so ein String gepostet, der nix anderes gemacht hat, ... ... als dem Kleinen, der das ausgewertet hat, kaputt zu machen. Ja, und das ist ja ein Angriff, ... ... weiß ich nicht, wer von euch schon vor 30 Jahren, ... ... wie andere hier, vielleicht auf der Bühne schon gezockt hat, ... ... im Internet, es gab schon vor 30 Jahren sowas, ... ... dass man in so Counter-Strike oder sowas Strings geschickt hat, ... ... ja, ich kann mich noch erinnern, ... ... ich bin irgendwann aus Counter-Strike rausgeflogen, ... ... ja, und dann kam nachher raus, ... ... jemand hat einen String mit irgendwas Virus, ... ... irgendwas mit zum iCard-Test-String oder sowas geschickt, ... ... und mein Netgeer-Route hat gesagt, ... ... Ha, Virus, ich mach zu, ... ... ja, das ist echt ein Angriff, ... ... es gab ja auch lange Jahre in so grad, bei diesen, ... ... da geht's ja dann irgendwann auch um Prestige und Geld, ... ... bei irgendwelchen Online-Games, ... ... dass Leute rausgefunden haben, ... ... welche anderen sich da gerade in Skype parallel per Voice unterhalten ... ... und haben über die IP, die man damals rausfinden konnte, von Skype, ... ... über irgendwelche Booter-Services, denen einfach Perdedors, ... ... die aus dem Internet geschossen. Und wenn Skype weg ist, ist der Zock-Rechner halt komplett raus, ... ... natürlich, ja, wenn man da entsprechend viele Daten hinschippt, ... ... und dann sind die Leute haben quasi verloren, ... ... ja, es ist quasi wie ein Cheat. Und wenn sowas, sowas ist natürlich immer noch mal so, ... ... du hast eine viel breitere Menge an kreativen Angreifern, ... ... wenn es Kids sind, die sich gegen mich aus dem Spiel befördern wollen. So. Genau, wie gesagt, ansonsten, wenn ihr Feedback habt, ... ... schreibt mir gerne eine Mail oder Twitter oder Tutut oder sonst wie ... ... oder quatscht mich nachher einfach an. Ich bin, wie gesagt, den ganzen Abend noch da. Dankeschön. Super, dann danke dir.