flawopen.com/Incidents/log4shell-jndi-injection-december-2021
Log4Shell (CVE-2021-44228) : cause et correctif
CVE-2021-44228 permettait aux logs de déclencher lookups Log4j 2 et charger des classes via JNDI. Mettez Log4j à jour et inventoriez ses copies.[1], [2], [4]
Un bureau emploie un commis dont le seul travail est de noter ce que disent les visiteurs. Quelqu'un découvre que si un visiteur prononce une certaine formule, le commis arrête d'écrire, se rend à une adresse citée dans la formule, récupère une enveloppe scellée auprès d'un inconnu et suit les instructions qu'elle contient. Le commis n'était censé que prendre des notes.[1]
Concepts Clés et Termes
Lookups dans les messages- Une fonction de Log4j 2 qui remplaçait les expressions ${...} des messages de journal par des valeurs au moment de l'écriture. Avant la 2.15.0, cela s'appliquait aussi aux données du message, pas seulement au motif configuré.[1]
JNDI- Java Naming and Directory Interface, une API de recherche d'objets dans des annuaires comme LDAP. Un lookup JNDI vers un serveur distant pouvait renvoyer une classe que la JVM chargeait.[1]
Injection d'expression (CWE-917)- Des données non fiables atteignent un évaluateur d'expressions : un texte fourni comme donnée est exécuté comme instruction.[1]
Dépendance transitive- Une bibliothèque incluse dans l'application uniquement parce qu'une autre en dépend. Beaucoup d'expositions à Log4Shell venaient de copies de Log4j que personne n'avait recensées.[4]
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-20 CWE-502 CWE-917
- D3-OTF Filtrage du trafic sortant — La restriction du trafic sortant décrite dans ce guide limite les destinations accessibles au service ou à l’hôte.
- CISA KEV — ajouté le 2021-12-10 — CVE-2021-44228
Chronologie de l'Incident
Chen Zhaojun, d'Alibaba Cloud Security, signale la faille à Apache en privé.[1]
La CISA publie l'Emergency Directive 22-02, qui impose aux agences fédérales américaines de repérer et d'atténuer Log4j.[3]
Log4j 2.17.1 corrige CVE-2021-44832, la dernière des trois CVE apparues après la 2.15.0 (avec CVE-2021-45046 et CVE-2021-45105).[1]
Déroulement de l'Attaque Étape par Étape
Du texte d'attaquant atteint un appel de journalisation
Toute valeur journalisée par l'application, comme un nom d'utilisateur, un en-tête ou un terme de recherche, peut porter une expression de lookup choisie par l'attaquant.[1]
Code Source : Vulnérable vs Sécurisé
Configuration Maven illustrative. Importer log4j-bom fait résoudre tous les modules Log4j, y compris les copies amenées par d'autres bibliothèques, vers une seule version récente. La règle enforcer fait ensuite échouer la build si un log4j-core antérieur à 2.17.1 reste accessible, y compris de façon transitive, afin qu'une nouvelle dépendance ne réintroduise pas discrètement le code vulnérable. La mise à jour est le vrai correctif ; bloquer LDAP et RMI sortants depuis les serveurs d'application est la défense en profondeur qui a cassé l'exploitation même là où le correctif tardait.
<!-- pom.xml: a direct dependency pinned to a vulnerable release -->
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
<!-- Nothing stops another library from pulling in an older log4j-core transitively. -->
<!-- pom.xml: one version for every Log4j module, and a build that fails on old ones -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.24.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<id>ban-vulnerable-log4j</id>
<goals><goal>enforce</goal></goals>
<configuration>
<rules>
<bannedDependencies>
<searchTransitive>true</searchTransitive>
<excludes>
<exclude>org.apache.logging.log4j:log4j-core:[2.0-beta9,2.17.1)</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Mettez log4j-core à jour en 2.17.1 ou ultérieure (2.12.4 sous Java 7, 2.3.2 sous Java 6) et faites échouer les builds qui résolvent une version plus ancienne n'importe où dans l'arbre de dépendances.[1]
- ✓Générez une SBOM à chaque build et conservez-la avec l'artefact, pour rapprocher un futur avis des services concernés en quelques minutes.[4], [3]
- ✓Analysez les artefacts déployés, pas seulement les dépôts de code : des JAR « shaded » ou embarqués ont caché Log4j aux manifestes de dépendances dans de nombreux produits.[4]
- ✓Appliquez aux serveurs d'application une sortie refusée par défaut ; l'exploitation exigeait LDAP, RMI et DNS sortants vers des hôtes arbitraires.[4], [3]
- ✓Quand une faille structurelle est corrigée, attendez-vous à d'autres CVE et gardez l'incident ouvert jusqu'à ce que les correctifs de l'éditeur se stabilisent.[1]
Sources
- Apache Log4j — vulnérabilités de sécurité (CVE-2021-44228 et suivantes)
- CVE-2021-44228 — fiche CVE
- CISA — Emergency Directive 22-02 : atténuer la vulnérabilité d'Apache Log4j
- CISA — recommandations sur la vulnérabilité d'Apache Log4j
- ObjectInputStream de Java est-il sûr avec des données non fiables ?
- Injection de commandes — référence complète de la classe