InfraFenceInfraFence

Live Security Operations

Commencer

CVE-2021-44228 (Log4Shell) : vérifier et corriger

Dernière mise à jour:

Log4Shell est une faille d'exécution de code à distance dans Apache Log4j 2, la bibliothèque de journalisation présente dans une grande partie des applications Java. Quand une application journalise un texte contrôlé par un attaquant (une URL, un en-tête, un champ de formulaire) et que ce texte contient un lookup comme ${jndi:ldap://…}, Log4j récupère et exécute du code depuis le serveur de l'attaquant.

Elle a été exploitée dans les heures qui ont suivi sa divulgation en décembre 2021 et fait encore l'objet de scans tous les jours. La bibliothèque se cache dans d'autres logiciels : le travail consiste à trouver chaque copie sur le serveur, puis à mettre à jour.

En bref

CVE
CVE-2021-44228
Logiciel
Apache Log4j 2 (log4j-core)
Versions concernées
2.0-beta9 à 2.14.1, sauf les versions de sécurité 2.3.1 et 2.12.2 ou ultérieures
Corrigé dans
2.15.0 (Java 8), 2.12.2 (Java 7), 2.3.1 (Java 6) ; passez à 2.17.1, 2.12.4 ou 2.3.2 ou ultérieur
Score CVSS
10.0 Critique (NVD, CVSS 3.1) · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CISA Known Exploited Vulnerabilities
Oui, ajoutée le 10 décembre 2021
Publiée par le NVD
10 décembre 2021
Correctif virtuel InfraFence
vp-cve-2021-44228 (ModSecurity id 9920004)

Ce qui est concerné

Seul log4j-core de Log4j 2 est concerné, et seulement de 2.0-beta9 jusqu'au correctif. Log4j 1.x n'est pas concerné par cette CVE, mais il est en fin de vie depuis 2015 et a ses propres failles. Les applications Java construites sur Log4j 2 (serveurs d'applications, moteurs de recherche, applications maison) embarquent la bibliothèque dans leurs propres dossiers, souvent dans un .war ou un .jar autonome, pas comme paquet système.

Le premier correctif, 2.15.0, était incomplet dans certaines configurations (CVE-2021-45046), et deux autres problèmes ont suivi (CVE-2021-45105 et CVE-2021-44832). C'est pourquoi la cible aujourd'hui est 2.17.1 ou ultérieur sur Java 8, 2.12.4 sur Java 7 et 2.3.2 sur Java 6.

Vérifier si un serveur l'a

Cherchez les fichiers log4j-core, puis les archives qui l'embarquent. La version figure dans le nom du fichier :

Toute distribution Linux
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'log4j-core-*.jar' 2>/dev/null
Toute distribution Linux (nécessite unzip)
sudo nice -n 19 ionice -c3 find / -xdev -type f \( -name '*.jar' -o -name '*.war' -o -name '*.ear' \) 2>/dev/null \
  | while read -r f; do
      unzip -l "$f" 2>/dev/null \
        | grep -qE 'log4j/core/lookup/JndiLookup\.class|log4j-core-[0-9][^/]*\.jar' && echo "$f"
    done

Remarque: -xdev limite la recherche au système de fichiers racine. Relancez-la pour chaque autre point de montage où se trouvent des applications (/opt, /srv), et vérifiez les images de conteneurs à part : un fichier dans une image n'est pas sur le disque de l'hôte.

Pour une application que vous construisez vous-même, demandez à l'outil de build quelle version il embarque réellement :

Projet Maven
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-core

Pour voir si quelqu'un a essayé, cherchez les lookups dans les journaux d'accès du serveur web (les attaquants en mettent aussi dans les en-têtes, que ces journaux n'enregistrent pas) :

Journaux d'accès Apache
sudo grep -rhiE '\$\{jndi|%24%7Bjndi|\$\{\$\{' --include='*access*' --exclude='*.gz' /var/log/apache2 /var/log/httpd 2>/dev/null | tail -20

Corriger

  1. Logiciel d'un éditeur : installez la version de l'éditeur qui embarque Log4j 2.17.1 ou ultérieur.
  2. Votre propre application : passez log4j-core (et log4j-api) à 2.17.1 ou ultérieur, ou 2.12.4 sur Java 7, 2.3.2 sur Java 6, reconstruisez et redéployez. Vérifiez avec l'outil de build qu'aucune autre dépendance ne ramène une copie plus ancienne.
  3. Redémarrez l'application : une JVM en cours d'exécution garde les anciennes classes jusque-là.
  4. Relancez la recherche ci-dessus : il ne doit rester aucun ancien log4j-core, y compris dans les sauvegardes d'applications déployées qui pourraient être redéployées.
Maven : fixer la version corrigée
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.17.1</version>
</dependency>

Attention: Définir log4j2.formatMsgNoLookups ou supprimer des classes à la main étaient des solutions d'urgence de décembre 2021, et la première ne couvre pas tous les cas. Considérez-les comme temporaires et mettez à jour.

Comment InfraFence la bloque pendant que vous mettez à jour

Le correctif virtuel pour CVE-2021-44228 est une règle ModSecurity qui examine l'URL, les en-têtes de la requête, les cookies et leurs noms, ainsi que les paramètres et leurs noms, après décodage d'URL. Il bloque une requête contenant ${ suivi à quelques caractères près de jndi, ou des lookups imbriqués utilisés pour le masquer (${lower:, ${upper:, ${env:, ${sys:, ${date:, ${::-).

Remarque: Le correctif ne voit que les requêtes HTTP qui passent par Apache avec ModSecurity sur ce serveur. Une application Java jointe sur son propre port, ou une charge utile qui arrive par une autre voie (un e-mail, une file de messages), n'est pas couverte : la mise à jour est la correction.

Comment le correctif est appliqué

  1. L'agent note quels ports SSH et quels sites répondent.
  2. Il écrit la règle (identifiant ModSecurity 9920004) entre ses propres marqueurs dans son fichier ModSecurity, lance apachectl configtest et recharge Apache en douceur. Un test en échec remet le fichier précédent en place.
  3. Il vérifie que SSH et les sites répondent toujours, et retire le correctif sinon.
  4. Il vérifie que ModSecurity bloque réellement avec la règle, au moyen d'une requête de sonde locale inoffensive. Un ModSecurity en DetectionOnly se contente de journaliser : le correctif est alors retiré et signalé comme inefficace, jamais comme appliqué.

Chaque requête bloquée par le correctif est signalée avec CVE-2021-44228 (agent 1.0.37 ou ultérieur) : vous voyez les tentatives dans l'activité du serveur et sur la page Exploitation du tableau de bord, et vous savez ainsi que la vulnérabilité est tentée contre vous.

Attention: Un correctif virtuel bloque la forme connue de l'attaque sur les requêtes qui passent par Apache sur ce serveur. Il ne remplace pas la mise à jour : installez la version corrigée, puis retirez le correctif depuis Activité avec Annuler si vous n'en avez plus besoin.

Les correctifs virtuels nécessitent Apache avec ModSecurity, le réglage Autoriser les modifications de la configuration du serveur web, et aucun panneau d'hébergement ni outil de gestion de configuration aux commandes du serveur web ; ils font partie du plan Pro et d'AutoMode. Une personne les applique depuis l'analyse IA, ou AutoMode le fait. Voir Correctifs virtuels.

Sources

Les faits de cette page viennent de ces sources ; consultez-les pour les mises à jour.

Essayez gratuitement sur 1 serveur

Starter est gratuit pour un serveur, avec la protection complète et le blocage automatique. Sans carte bancaire.

Installez l'agent en root, avec votre jeton à la place de <TOKEN> :

curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>

Le jeton se crée dans le tableau de bord, dans Serveurs › Ajouter un serveur.