
Dimostrazione pratica della vulnerabilità Log4Shell (CVE-2021-44228)
Questo repository è destinato esclusivamente a scopi educativi e dimostrativi nell'ambito di un lavoro seminariale sulla sicurezza. Non utilizzare questo codice in ambienti di produzione o contro sistemi senza autorizzazione esplicita. La configurazione ha lo scopo di promuovere la consapevolezza della sicurezza e mostrare come vulnerabilità complesse possano nascere quando funzionalità apparentemente innocue come logging, risoluzione dei nomi e caricamento dinamico di classi vengono combinate tra loro.
L'obiettivo di questo lavoro seminariale è fornire una comprensione approfondita della vulnerabilità Log4Shell (CVE-2021-44228), resa nota nel dicembre 2021 e classificata come una delle vulnerabilità di sicurezza più critiche degli ultimi anni. Il lavoro spiega sia le basi teoriche, sia presenta una dimostrazione pratica della vulnerabilità.
Per illustrare praticamente la vulnerabilità Log4Shell, in questo repository è stato allestito un ambiente isolato e containerizzato che riproduce l'intero flusso di attacco in modo riproducibile. La dimostrazione si basa su tre componenti centrali:
User-Agent dalla richiesta HTTP, che gli attaccanti possono manipolare per sfruttare la vulnerabilità.Exploit.class). Come il server LDAP, anche questo server è sotto il controllo dell'attaccante.Nota: Informazioni dettagliate sul setup e sull'esecuzione della dimostrazione si trovano nelle sezioni 4. Struttura del progetto e setup e 5. Demo del progetto.
Log4Shell è il nome di una vulnerabilità di sicurezza critica nella libreria Java Log4j identificata come CVE-2021-44228. Consente a un attaccante di eseguire codice arbitrario su un server remoto (Remote Code Execution, RCE) con il minimo sforzo.
La vulnerabilità riguarda Log4j nelle versioni 2.0 fino a 2.14.1 ed è così grave che è stata classificata con il livello di rischio più alto da molte autorità di sicurezza, incluso il BSI (Ufficio federale per la sicurezza informatica).
Log4Shell è particolarmente pericolosa perché...
La causa principale risiede in una funzionalità di Log4j che consente di caricare contenuti dinamici nei messaggi di log tramite i cosiddetti Lookup. In combinazione con JNDI (Java Naming and Directory Interface) e il protocollo LDAP (Lightweight Directory Access Protocol), ciò permette di caricare ed eseguire classi Java dannose remote.
La scoperta e la pubblicazione della vulnerabilità hanno scatenato un'ondata di sicurezza a livello mondiale. Molti sistemi hanno dovuto essere immediatamente patchati o spenti. Nel periodo successivo sono state scoperte ulteriori vulnerabilità correlate (ad es. CVE-2021-45046), dimostrando quanto profonda e pericolosa fosse la problematica.
Di seguito, le tecnologie coinvolte e la loro interazione vengono spiegate in dettaglio per sviluppare una comprensione più approfondita della vulnerabilità.
Log4j è una libreria creata da Apache per la registrazione di eventi in applicazioni Java. Il logging è uno strumento centrale nello sviluppo software per monitorare i sistemi o analizzare gli errori. Log4j è uno dei framework di logging più conosciuti e utilizzati nell'ecosistema Java, impiegato sia in piccole applicazioni che in grandi sistemi aziendali.
Mentre un programma è in esecuzione, si verificano ad esempio i seguenti eventi:
Questi eventi possono essere documentati con log, solitamente come output testuale nella console, in file o tramite protocolli di rete verso server di log centralizzati. Un logging appropriato consente di tracciare cosa ha fatto un'applicazione e quando.
Log4j fornisce un'infrastruttura flessibile e altamente configurabile per la generazione e l'elaborazione di messaggi di log. Tra le funzionalità principali:
DEBUG, INFO, WARN, ERROR) che permettono di controllare quanto dettagliato debba essere il logging.Ulteriori funzionalità rilevanti per il lavoro seminariale verranno trattate nelle sezioni successive, in particolare la funzionalità dei placeholder e la funzionalità di Lookup.
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
public class Example { private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("Starte Anwendung...");
}
}
In questo semplice esempio viene creata o recuperata un'istanza di Logger, se già esistente. Successivamente viene emesso un messaggio di log a livello `INFO`. Log4j gestisce la formattazione e l'output del messaggio in base alla configurazione. Una configurazione di esempio potrebbe essere la seguente:```xml
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Questa configurazione definisce un Appender che stampa i messaggi di log nel formato Datum Uhrzeit Log-Level Loggername - Nachricht sulla console. Questo Appender viene quindi assegnato al logger radice, che elabora tutti i messaggi di log a partire dal livello INFO.