CVE-2021-44228 : Log4Shell

Impact

Tout ce qui utilise le framework de journalisation d’Apache nommé Log4J est susceptible d’être impacté. Les applications concernées sont généralement reconnaissables au fait qu’elles possèdent le fichier log4j-core.jar.

Les versions déclarées concernées comme faillibles de log4j-core sont :

  • De la version 2.0-beta9 à la version 2.12.1 (Java7)
  • De la version 2.13.0 à la version 2.15.0 (Java8)

Toutefois, je ne vous recommande pas de vous fier à ces valeurs, car la classe réellement en défaut (JndiLookup.class) est embarquée. J’ai constaté que certains éditeurs avaient repris une version de JndiLookup.class faillible dans un core non répertorié comme faillible.

Quelque soit la version de log4j-core que vous utilisez, je vous recommande de tester et de mitiger. De plus ne cherchez pas seulement si vous utilisez log4j-core mais aussi si vous utilisez directement JndiLookup.class.

Comment chercher si le fichier en défaut est présent sur votre système ?

Sur un système Linux, recherchez tous les .jar log4j-core et vérifiez la présence de JndiLookup.class. Cela ne vous dira pas si vous l’utilisez, mais si vous le possédez. Donc si vous êtes susceptible de l’utiliser.

find / -type f -name "log4j-core-*.jar" -exec unzip -l "{}" \; 2>/dev/null | grep -i JndiLookup.class

Vérifiez aussi les fichiers .ear, ils peuvent contenir le jar log4j-core.

find / -type f -name "*.ear" -exec unzip -l "{}" \; 2>/dev/null | grep -i log4j-core

Les fichiers .war, :

find / -type f -name "*.war" -exec unzip -l "{}" \; 2>/dev/null | grep -i log4j-core

Et enfin, vérifiez la présence directe de JndiLookup.class.

find / type f -name "JndiLookup.class"

log4shell.bash

Voici check_log4shell.bash, un script maison pour scanner vos serveurs Linux.

  • Inspecte les fichiers ear, war, class et jar
  • 3 modes : default / suspicious / paranoid pour inspecter log4j-core*.jar, *log4j*.jar ou *.jar
  • Inspecte les fichiers jar contenus dans les fichiers war
  • Inspecte les fichiers META-INF contenus dans les fichiers ear
  • Possibilité de changer le chemin de la recherche
  • Filtrage des évènements : infos, warnings, errors, statistiques
  • Statistiques

Produits impactés

Voici une liste non exhaustive de produits que l’on sait impactés par cette faille :

  • RedHat, par le biais d’Openshift et de certains JBoss
  • Jenkins, si vous utilisez le plugins Log4J
  • Apache SOLR
  • VMWare
  • Citrix
  • Atlassian
  • NetApp
  • SonarQube

Ce n’est pas parce que vous avec un fichier log4j que vous êtes concerné !!! Encore une fois, la faille est dans la classe JndiLookup.class.

Vérifiez dans le jar la présence du fichier JndiLookup.class avant de paniquer, un .jar est un .zip, utilisez votre décompresseur préféré.

Proof of Concept (POC)

Pour comprendre comment et pourquoi mitiger, il est nécessaire de comprendre le POC.

Celui qui me semble le plus facile à mettre en œuvre et à lire est celui-ci : nw_log4jcheck.py

Il vous faudra Python3 pour l’exécuter. Vous devez changer la valeur de HOSTNAME dans le script avant de vous en servir :

Vous devez aussi créer le répertoire, voire le fichier dans lequel le script écrira ses logs :

mkdir -p /var/log/named
> /var/log/named/query.log

Cherchez ensuite tout les ports WEB ouverts (Java, httpd, etc.) sur votre plateforme :

netstat -tulpn

Dans cet exemple, l’on peut voir différents ports qui méritent d’être vérifiés :

Les ports 8005 et 8081 (java) ainsi que le port 443 (httpd).

Utilisez le script sur chacun des ports :

python3 ./nw_log4jcheck.py https://siteperso.info:443
Résultat du scan sur le port 443

Le port 443 est délivré sur ce serveur par Apache (httpd). En regardant les logs générés par le test je peux voir ceci :

"[16/Dec/2021:10:46:29 +0100]" "7499" "HTTP/1.1" "-" "python-requests/2.26.0" "/${jndi:ldap:/56549fb9-f720-455f-a0c0-c40b55693bec.siteperso.info/test.class}" "15.188.192.249" "+" "403" "1147" "GET /$%7Bjndi:ldap://56549fb9-f720-455f-a0c0-c40b55693bec.siteperso.info/test.class%7D HTTP/1.1" "siteperso.info:443" "GET" "-" "-" "-" "-" "TLSv1.3" "TLS_AES_256_GCM_SHA384" "-"

En rouge, l’on peut voir l’URL appelée par le POC, il essaie de contacter le service jndi:ldap. On peut observer que le serveur a répondu avec un code HTTP 403 : Forbidden.

Commencez à sérieusement vous inquiéter si vous avez un code HTTP 200.

Les URLS attaquables ne commencent pas uniquement par $jndi:ldap, le POC est focalisé sur ceci mais en voici la liste complète :

  • ${jndi:ldap:/}
  • ${jndi:ldaps:/}
  • ${jndi:rmi:/}
  • ${jndi:dns:/}
  • ${jndi:iiop:/}

Evidement, selon la technologie du port ouvert, vous devrez aller dans les logs adéquats pour voir ce résultat.

Comment se protéger

L’action prioritaire est de mettre à jour Log4J vers la version 2.16.0, via les gestionnaires de paquets habituels ou via un téléchargement direct depuis https://logging.apache.org/log4j/2.x/download.html.

Il est aussi possible de réduire le degré d’exploitabilité de la vulnérabilité en mettant la variable d’environnement LOG4J_FORMAT_MSG_NO_LOOKUPS à true. Cette contremesure ne fonctionne cependant que pour les versions de Log4J supérieures ou égales à 2.10.

Vous pouvez aussi complètement supprimer la classe du fichier .jar :

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

Il n’y a pas de solution propre à ce jour pour corriger si vous êtes en Java7. Supprimez la classe comme ci-dessus, mitigez avec l’option JAVA, protégez les URLS…

La faille expliquée au grand complet

https://nakedsecurity.sophos.com/2021/12/13/log4shell-explained-how-it-works-why-you-need-to-know-and-how-to-fix-it/

Vous aimez NordVPN ? Vous détesterez NordPass.

Tous les Youtubeurs à la mode nous font la promotion du gestionnaire de mots de passe NordPass après nous avoir bien vendu NordVPN auparavant. On ne tire pas sur une vache à lait. J’imagine qu’ils ne l’ont pas essayé avant de nous dire que c’est « super-génial ».

Voici un florilège de ce que j’ai pu constater en 2 jours d’utilisation.

Les authentifications de type HTTP Basic Authentication ne sont pas prises en charge. Elles ne sont pas détectées par le plugins NordPass. Alors si comme moi, vous aimez mettre ceinture et bretelles, vous serez bien déçus. Cela vous empêchera aussi de capturer des mots de passe de FTP via votre navigateur.

Si vous synchronisez les plugins de différents navigateurs Chrome, le plugins s’arrêtera de fonctionner sur l’ensemble de vos postes, il vous faudra redémarrer complètement les différentes bécanes pour que cela refonctionne. Youpi !

Les bugs d’affichage et d’interface vous rendront fou. Pour l’exemple, vous n’aurez pas accès au menu contextuel du dernier item de votre liste, sauf à redimensionner la fenêtre de NordPass vers le bas lorsque le menu est déjà ouvert. Faites des petites fenêtres vers le haut de votre écran !

Vous pouvez vous dire qu’il serait possible de contourner simplement le problème en utilisant les actions par groupe, mais non, car vous n’avez pas accès à toutes les fonctions des menus contextuels. 3 fonctions sont tout simplement indisponibles.

Si jamais vous vous dites avec courage, qu’à cela ne tienne, je vais trier mes mots de passe par nom de dossier, ainsi celui tout en bas sans catégorie arrivera bien tout en haut et j’aurais tout le menu. Encore perdu ! Les items sans dossier se retrouvent toujours en bas. Quel que soit l’ordre de tri. Encore youpi !

Vous n’avez qu’un seul niveau hiérarchique de dossiers, bonne chance pour vous y retrouver si vous avez beaucoup de mots de passe.

Toujours à propos des dossiers, si vous créez un dossier sur l’un de vos ordinateurs simplement pour vous organiser, et que vous laissez vide, celui-ci ne sera jamais synchronisé.

Vous n’avez pas la possibilité de changer les icônes, ni pour les dossiers, ni pour les mots de passes stockés. C’est le seul gestionnaire de mots de passe ne possédant pas cette fonctionnalité à ma connaissance.

Si pendant l’édition d’une note sécurisée, vous utilisez CTRL+HOME pour revenir au début de celle-ci, vous ne serez pas sur la première ligne, mais la seconde. Seule solution, cliquer sur la deuxième ligne puis remonter avec la flèche haute. Dans l’exemple, AAA n’apparaît pas. Si vous êtes sur la deuxième ligne en ayant fait CTRL+HOME, alors vous écrirez à la fin de la première ligne, sans pouvoir visualiser ce que vous tapez. Logique !

Vous n’aurez pas la possibilité d’utiliser le bouton droit de la souris pour copier une partie de note, et si vous utilisez le bouton « Copier » en ayant sélectionné une partie de la note, vous aurez la totalité de la note dans le presse papier. Ils ne souhaitent vraiment pas que l’on stocke autre chose que des mots de passe web ou des cartes bleues.

C’est bien dommage, car en réalité, même ce qui est mots de passe web fonctionne beaucoup moins bien qu’attendu. Allez sur le site des impôts et vous verrez que celui-ci stocke vraiment n’importe quoi comme Login/Password. Pourtant, le gestionnaire intégré de Google Chrome y parvient parfaitement. J’ai eu le problème avec plein de sites.

Pour les sites qui utilisent un encodage un peu exotique, comme un pavé numérique aléatoire, vous pourrez exclure le site complet de NordPass afin qu’il ne vous propose pas de changer le mot de passe à chaque fois que vous vous connectez. Mais attention, c’est le site tout entier qui sera exclu, pas seulement la page ou vous vous trouvez.

Dans un autre registre, si vous avez des mots de passe sur du matériel de votre réseau local sans nom de domaine, par exemple : https://mon-nas/, à nouveau, cela ne sera pas détecté par le plugins. Mieux, si toujours plein de courage vous le rentrez à la main, vous n’aurez pas le bouton pour y accéder.

Il est impossible d’ouvrir autre chose qu’un navigateur web via ce gestionnaire de mots de passe. Pas de SSH, pas de FTP, rien. Après, il est déjà difficile de stocker des mots de passe web…

Lorsque NordPass détecte une entrée de mot de passe, il ouvre une popup. Lorsque vous la fermez, il ne vous remet pas sur votre navigateur mais sur une fenêtre ouverte au hasard.

La synchronisation entre vos différents matériels peut prendre jusqu’à 1/4 d’heure. buvez un café avant de passer de votre poste fixe à votre portable.

Côté sécurité, on touche le fond. Tout d’abord, le client NordPass dialogue pour stocker vos mots de passe avec… LEUR SERVER WEB !

Ensuite il utilise du TLS1.2 en place de TLS1.3, que l’on pourrait espérer d’une société qui à fait sa notoriété en vendant des VPN. Cela utilise une clef Diffie Hellman de 256 bits, alors que la recommandation actuelle est d’utiliser des clefs de 2048 bits ou plus.

Un test via Qualys SSL Labs vous donnera un aperçu du manque de sérieux, avec par exemple, le support de TLS1.1 et de TLS1.0, oui, nous sommes bien en 2021, et tout un tas de ciphers bien dégueulasses.

Voilà ce que Mozilla appelle un chiffrement moderne :

Alors pour finir, j’ai trouvé ceci tellement nul, que j’ai essayé de couper la route de leur serveur, en réalité un node d’une grappe de deux, pour déterminer si la fonction « Password Health » envoyait directement mes mots de passe à https://haveibeenpwned.com/ via REST, mais non, cela a bien empêché le test. Sauf que là, j’ai pu me rendre compte que leur redondance ne fonctionnait absolument pas.

Pour finir la désinstallation est à la hauteur du reste. Sur un PC j’ai ce résultat :

Sur l’autre, il a bien voulu se désinstaller mais en laissant la moitié de ses fichiers et un bordel sans nom dans la base de registre.