Qgelm

Kommentar zu Log4j: Es funktioniert wie spezifiziert

Originalartikel

Backup

<html> <header class=„article-header“><h1 class=„articleheading“>Kommentar zu Log4j: Es funktioniert wie spezifiziert</h1><div class=„publish-info“> Kristian K&#246;hntopp</div></header><figure class=„aufmacherbild“><img src=„https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/2/3/2/1/2/3/shutterstock_1010094787__Victor_Moussa_.jpg-8d1d0a3380a2b754.jpeg“ srcset=„https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/2/3/2/1/2/3/shutterstock_1010094787__Victor_Moussa_.jpg-8d1d0a3380a2b754.jpeg 700w, https://heise.cloudimg.io/width/1050/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/2/3/2/1/2/3/shutterstock_1010094787__Victor_Moussa_.jpg-8d1d0a3380a2b754.jpeg 1050w, https://heise.cloudimg.io/width/1500/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/2/3/2/1/2/3/shutterstock_1010094787__Victor_Moussa_.jpg-8d1d0a3380a2b754.jpeg 1500w, https://heise.cloudimg.io/width/2300/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/2/3/2/1/2/3/shutterstock_1010094787__Victor_Moussa_.jpg-8d1d0a3380a2b754.jpeg 2300w“ alt=„“ class=„img-responsive“ referrerpolicy=„no-referrer“ /><figcaption class=„akwa-caption“>(Bild:&#160;Victor Moussa/Shutterstock.com)</figcaption></figure><p><strong>&#220;ber den Java-Slogan „Write Once, Run Everywhere“ wurden schon viele Witze gemacht. Den log4j-Exploit behandeln viele nun wie einen Bug &#8211; aber das ist er nicht.</strong></p><p>Eine kritische L&#252;cke in der Java-Bibliothek Log4j beherrscht gerade die Schlagzeilen. Die IT-Welt ruft „Warnstufe Rot“ aus &#8211; weil offenbar der log4j-Code JNDI-Variablenexpansion vornehmen kann.</p><header class=„a-boxheader“ data-collapse-trigger=„“>Ein Kommentar von Kristian K&#246;hntopp</header><div class=„a-boxtarget a-boxcontent a-inline-textboxcontent a-inline-textboxcontent–horizontal-layout“ data-collapse-target=„“><figure class=„a-inline-textboximage-container“><img alt=„“ src=„https://heise.cloudimg.io/width/1775/q50.png-lossy-50.webp-lossy-50.foil1/_www-heise-de_/imgs/71/3/2/3/2/2/2/4/Kristian_Koehntopp-b0c68a8663f6c701.jpeg“ srcset=„https://heise.cloudimg.io/width/3550/q30.png-lossy-30.webp-lossy-30.foil1/_www-heise-de_/imgs/71/3/2/3/2/2/2/4/Kristian_Koehntopp-b0c68a8663f6c701.jpeg 2x“ class=„c1“ referrerpolicy=„no-referrer“ /></figure><div class=„a-inline-textboxcontent-container“><p class=„a-inline-textboxsynopsis“>Kristian K&#246;hntopp hat 1983 angefangen zu programmieren, und ist seit 1988 online. Seitdem hat er verschiedene Dinge mit Computern aller Art getan, denkt angesichts der Lage aber &#252;ber eine Karriere als Landschaftsg&#228;rtner nach.</p></div></div><p>Doch was ist JNDI? Jindi al Dap ist der Name eines alten arabischen Philosophen und Mathematik-Pioniers, der f&#252;r Sun/Oracle gearbeitet hat, um <a href=„https://docs.oracle.com/javase/tutorial/jndi/overview/index.html“ rel=„external noopener“ target=„_blank“><strong>ein System von Directory Lookups in Java [1]</strong></a> zu entwickeln. Dieses System l&#228;dt irgendwie Code aus dem Internet nach. Aber selbst, wenn man l&#228;nger auf das Systemdiagramm starrt, erkennt man nicht unbedingt sofort, an welcher Stelle sich der Java CLASSPATH so erweitert, dass er das gesamte Internet umfasst:</p><figure class=„a-inline-image a-u-inline“><div></div></figure><h3 class=„subheading“ id=„nav_nichts_ist0“>Nichts ist jemals simpel</h3><p>Das ist so, weil in Java nichts jemals simpel ist. Java Code ist unstrukturierter trockener Staub von Codefragmenten in Klassendateien, die inert in keiner Weise miteinander interagieren. Erst mit den passenden Factories, Delegates, Generators und ClassLoaders werden sie instanziiert und zusammengesetzt. Der entstehende Haufen an Querverweisen f&#252;hrt dann nur zuf&#228;llig irgendwann einmal tats&#228;chlich wirksamen Code aus.</p><p>Man k&#246;nnte jetzt auf die Idee kommen, eine IDE mit integrierter syntaktischer Codesuche zu verwenden, um diesen Quelltexthaufen in Form zu bringen und zu verstehen. Aber das ist vergebens: Auch mit der gesamten Codebasis und einem Index darauf kann man nicht vorhersagen, was eine gegebene Java Codebase tun wird, wenn man sie startet. Es braucht auch noch Konfigurationsdateien. Diese sind ein weiterer Haufen, Properties-Dateien, in einem vorsintflutlichen Vorl&#228;ufer von YAML geschrieben: XML.</p><p>Oder jedenfalls ist das, was wir denken sollen: Mit den Properties und der Codebasis k&#246;nnen wir endlich versuchen zu verstehen, was Java tut. Und das w&#228;re auch beinahe so, aber JNDI ist genau angetreten, dieses Problem zu beheben: Directory Lookups!</p><p>Statt also die Anwendung und ihre Konfiguration zu paketieren und dann die Pakete in Produktion zu installieren, k&#246;nnen wir nun mit JNDI die Konfiguration vom Netz lesen. Das hei&#223;t, die eigentlichen Konfigurationsdateien, die uns sagen, was die Anwendung tut, sind… nicht mehr da. Fortschritt!</p><p>Das stellt sicher, dass uns niemand mehr hacken kann, weil niemand den Code mehr versteht: Wichtige, zum Verst&#228;ndnis der Codebasis notwendige Informationen sind versteckt in einem Verzeichnisdienst, und wir wissen nicht mal welcher. Aber wir k&#246;nnen das noch einen Schritt weiterspielen: Der Code, der den Directory Lookup vornimmt, ist auch nicht da, nur ein Bootstrap: <a href=„https://docs.oracle.com/javase/tutorial/jndi/overview/event.html“ rel=„external noopener“ target=„_blank“><strong>Event and Service Provider Packages [2]</strong></a>.</p><figure class=„a-inline-image a-u-inline“><div></div></figure><p>Dank JDNI SPI k&#246;nnen wir also Java Classfiles von einem LDAP-Server ausliefern lassen, die angeblich ein Printer-Object generieren, wenn wir nach einem Printer fragen &#8211; dann aber stattdessen Doom installieren. Oder einen Kryptominer oder Verschl&#252;sselungstrojaner. So geht Enterprise Security.</p><p>Der Java-Slogan ist ja „Write Once, Run Everywhere“. Wir haben da viele Witze dr&#252;ber gemacht, weil Java so oft gecrashed ist &#8211; die meisten Java-Anwendungen liefern inzwischen ja die gesamte Ausf&#252;hrungsumgebung einschlie&#223;lich der JRE mit, damit &#252;berhaupt etwas funktioniert. Jetzt funktioniert endlich mal alles &#8211; und die Leute sind wieder ungl&#252;cklich.</p><h3 class=„subheading“ id=„nav_notabug_wontfix_1“>NOTABUG, WONTFIX</h3><p>Aber im Ernst: Viele behandeln den log4j-Exploit wie einen Bug, einen Programmierfehler, eine Verletzung einer Spezifikation. Genau das ist jedoch nicht der Fall: Es funktioniert &#8211; wortw&#246;rtlich &#8211; endlich einmal alles wie spezifiziert und dokumentiert: All die Modularit&#228;t und dynamische Erweiterbarkeit von Java hat ganz wunderbar und genau wie geplant zusammengearbeitet und funktioniert. Darauf haben wir dekadenlang hingearbeitet! „NOTABUG, WONTFIX“</p><p>Und das ist das eigentliche Problem hier. Viele rufen jetzt nach „Mehr Kontrolle!“, „Mehr Review!“, „Mehr Funding!“, „Mehr Augen auf den Code!“. Was wirklich helfen w&#252;rde w&#228;re weniger Code, weniger Indirektion und Boilerplate, und einfach mehr&#8230; Einfachheit.</p><p>Wieso brauche ich ein LogAppenderFactorySingleton, das XML liest, um den Namen der Klasse zu bekommen, die es instanziieren muss, damit ich meine Logzeile da einwerfen kann, um sie asynchron an einen LogStream anzuh&#228;ngen? Das ist nicht einfach. Was ist einfach? JSON nach stderr drucken. Das ist einfach. Aber Firmen stellen seit etwa einer Dekade Leute ein, die nicht wissen, was stdout und stderr sind und das ist irgendwie okay, <a href=„https://twitter.com/apenwarr/status/1469183890749558784“ rel=„external noopener“ target=„_blank“><strong>weil inzwischen ja sowieso alles ein Webservice ist [3]</strong></a>.</p><p>Softwareentwicklung ist viel moderner geworden: Wir haben Merge Requests mit Code Review, CI/CD-Pipelines, Infrastructure as Code und Immutable Infrastructure. Das n&#252;tzt nur nix, wenn meine Java Logging Library <a href=„https://twitter.com/TheASF/status/1400875147163279374“ rel=„external noopener“ target=„_blank“><strong>auf dem Mars Code von Directory-Servern auf der Erde nachl&#228;dt [4]</strong></a> und so das „Remote“ in RCE komplett neu definiert. Die Analyse von Dependencies hat nur dann Sinn, wenn die Liste dieser Abh&#228;ngigkeiten endlich und genau so immutable wie die Infrastruktur ist.</p><p>Java hatte einmal die notwendigen Kontrollkn&#246;pfe, mit denen wir erzwingen konnten, dass diese Liste von Abh&#228;ngigkeiten endlich und unver&#228;nderlich ist. Wenn man auf diese Art von Lebensstil steht, gibt es etwas, das sich SM nennt: <a href=„https://docs.oracle.com/javase/tutorial/essential/environment/security.html“><strong>Oracle SM [5]</strong></a>.</p><p>SM bringt die notwendigen Vertr&#228;ge und die Disziplin, die eine Codebase braucht. Aber die meisten Anwender stehen nicht auf SM, und lehnen die Idee ab. Also wird die Funktionalit&#228;t in Java 17 als deprecated (veraltet) gekennzeichnet und sp&#228;ter entfernt werden (<a href=„https://openjdk.java.net/jeps/411“ rel=„external noopener“ target=„_blank“><strong>JEP 411: Deprecate the Security Manager for Removal [6]</strong></a>).</p><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>(Bild:&#160;imgflip.com)</figcaption></div></figure><h3 class=„subheading“ id=„nav_wie_ein2“>Wie ein Dreij&#228;hriger</h3><p>Auch JNDI hat SM abgelehnt und hat ein promiskuitives Interface, das Code irgendwoher l&#228;dt und ausf&#252;hrt. Man muss sich das wie einen Dreij&#228;hrigen vorstellen, der sich jede Klasse in den Mund steckt, um herauszufinden, wie sie schmeckt und ob sie sich ausf&#252;hren l&#228;sst.</p><p>Das ist am Ende genau die Spezifikation: Hier ist ein Object, deserialisiere es. In Java bedeutet das, dass der Code f&#252;r die Klasse des Objektes irgendwo her kommen muss, deren Methoden dann ausgef&#252;hrt werden. Nat&#252;rlich w&#252;rde niemand das f&#252;r eine gute Idee halten, wenn man es so formuliert. Aber andererseits hat es die Person, die das vor acht Jahren implementiert hat, nicht gesehen, und auch die Hunderttausend, die log4j in ihre Codebasis importiert haben, sind nicht dar&#252;ber gestolpert.</p><p>Was sagt uns das &#252;ber den Dependency-Management-Prozess von Organisationen, die Software entwickeln? &#220;ber das Verst&#228;ndnis der Codebase, der Abh&#228;ngigkeiten, und der Prozesse, die Datenfluss und Releases planen? Ja, genau. „Wir verwenden eine modulare Architektur und agile Methoden, um die Entwicklungsgeschwindigkeit zu steigern.“</p><p>E = 1/2m*(v^2)</p><p>Mehr Entwicklungsgeschwindigkeit macht gr&#246;&#223;ere Krater.</p><h3 class=„subheading“ id=„nav_code_ist3“>Code. Ist. Nicht. Dein. Freund.</h3><p>Ganz besonders nicht dynamisch aus dem Internet nachgeladener Code.</p><p>Code. Ist. Nicht. Dein. Freund.</p><p>Ich wei&#223;, es klingt komisch, wenn man Entwickler ist und den eigenen Lebensunterhalt damit bestreitet, dass man glaubt, man sei mit dem Code befreundet.</p><p>Aber so ist es. Weniger Code ist besserer Code. Am besten so wenig Code, dass man ihn zur G&#228;nze und mit allen seinen Interaktionen verstehen kann. Und auch den Code, der notwendig ist, um den eigenen Code zu betreiben.</p><header class=„a-boxheader“ data-collapse-trigger=„“>Lesen Sie auch</header><div class=„a-boxtarget a-boxcontent“ data-collapse-target=„“><article class=„a-article-teaser a-article-teaser–horizontal-layout article-teaser–articlebox a-u-no-margin-bottom a-theme“ data-cid=„0“><a class=„a-article-teaserlink“ href=„https://www.heise.de/news/heise-Security-Webinar-Log4j-der-Praxis-Ratgeber-fuer-Admins-6294236.html“ name=„meldung.newsticker.inline.article-teaser.1“ title=„heise-Security-Webinar: Log4j &#8211; der Praxis-Ratgeber f&#252;r Admins“><figure class=„a-article-teaserimage-container“><div><strong><img alt=„“ height=„1079“ src=„https://static.wallabag.it/7862d1b7aff4c3b00f37212fefade4e0e2c4cf00/64656e6965643a646174613a696d6167652f7376672b786d6c2c253343737667253230786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672725323077696474683d273639367078272532306865696768743d2733393170782725323076696577426f783d2730253230302532303639362532303339312725334525334372656374253230783d273027253230793d27302725323077696474683d27363936272532306865696768743d273339312725323066696c6c3d27253233663266326632272533452533432f726563742533452533432f737667253345/“ class=„c2“ width=„1920“ referrerpolicy=„no-referrer“ /></strong></div></figure><div class=„a-article-teasercontent-container“><header><h1 class=„a-article-teasertitle a-u-mb-1“><strong>heise-Security-Webinar: Log4j &#8211; der Praxis-Ratgeber f&#252;r Admins</strong></h1></header></div>[7]</a></article></div><p>() </p><hr /><p><strong>URL dieses Artikels:</strong><br /><small><code>https://www.heise.de/-6294476</code></small></p><p><strong>Links in diesem Artikel:</strong><br /><small><code><strong>[1]</strong>&#160;https://docs.oracle.com/javase/tutorial/jndi/overview/index.html</code></small><br /><small><code><strong>[2]</strong>&#160;https://docs.oracle.com/javase/tutorial/jndi/overview/event.html</code></small><br /><small><code><strong>[3]</strong>&#160;https://twitter.com/apenwarr/status/1469183890749558784</code></small><br /><small><code><strong>[4]</strong>&#160;https://twitter.com/TheASF/status/1400875147163279374</code></small><br /><small><code><strong>[5]</strong>&#160;https://docs.oracle.com/javase/tutorial/essential/environment/security.html</code></small><br /><small><code><strong>[6]</strong>&#160;https://openjdk.java.net/jeps/411</code></small><br /><small><code><strong>[7]</strong>&#160;https://www.heise.de/news/heise-Security-Webinar-Log4j-der-Praxis-Ratgeber-fuer-Admins-6294236.html</code></small><br /><small><code><strong>[8]</strong>&#160;mailto:map@ix.de</code></small><br /></p><p class=„printversioncopyright“><em>Copyright &#169; 2021 Heise Medien</em></p> </html>

Cookies helfen bei der Bereitstellung von Inhalten. Diese Website verwendet Cookies. Mit der Nutzung der Website erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Computer gespeichert werden. Außerdem bestätigen Sie, dass Sie unsere Datenschutzerklärung gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information