Ich frage mich ja immer noch, wie es passieren kann, daß Benutzereingaben vom Rechner für ausführbaren Programcode gehalten werden können.
Wie würde ich das denn eigentlich machen, wenn ich das absichtlich machen wollte? Also einen String in Jave bekommen und den dann "ausführen"? Und würde das dann noch als Java-Bytecode ausgeführt, oder wäre das schon auf Maschinenebene?
Kombination von - im Einzelnen gut klingenden - aber im Gesamtkontext katastrophalen Entscheidungen.
Punkt 1: Strings in Log Meldungen sollen nicht statisch sein, sondern aus Performance-Gründen String-Ersetzungen können.
Punkt 2: Log Meldungen sollen mit Patterns formatierbar sein - es soll ja nicht einfach der String geloggt werden, sondern auch Meta-Informationen (Datum, Thread-ID, Severity, etc.)
Punkt 3: Diese Meta-Informationen sollen möglichst flexibel sein und erweiterbar sein - hier kommt dann ein Plugin-Mechanismus ins Spiel der es erlaubt das man bei Ersetzungen dynamisch bestimmte Java-Klassen ausführt und das Ergebnis dann in den String packt
Wirft man das ganze zusammen, so bringt log4j einen Mechanismus mit:
* Meta-Informationen über einen JNDI-Lookup zu machen
* Diesen JNDI-Lookup an LDAP zu delegieren
* Darüber Java-Klassen (Den JNDI macht einen Lookup auf Java-Klassen) zu bekommen
* Diese Java-Klassen wiederum werden ausgeführt um den zu ersetzenden String zu bekommen
Hinzu kommt, dass das Pattern-Matching, das greift was geloggt werden soll nicht nur auf den in der log4j Config definierten String angewendet wird, sondern auf den zu loggenden String (Ob das bewusst ist oder nicht weiß ich nicht, ich würde das als Bug sehen)
Wirft man das ganze zusammen, passiert genau das, was jetzt passiert ist. Bzgl. der Lookups steht (vermutlich seit Freitag) folgendes der Doku (
https://logging.apache.org/log4j/2.x/manual/lookups.html#JndiLookup):
When using LDAP Java classes that implement the Referenceable interface are not supported for security reasons. Only the Java primative classes are supported by default as well as any classes specified by the log4j2.allowedLdapClasses property