CVE-2021-44228 (Log4Shell): verifica e correzione
Ultimo aggiornamento:
Log4Shell è una falla di esecuzione di codice remoto in Apache Log4j 2, la libreria di logging contenuta in buona parte delle applicazioni Java. Quando un'applicazione registra un testo controllato da un attaccante (un URL, un header, un campo di un modulo) e il testo contiene un lookup come ${jndi:ldap://…}, Log4j scarica ed esegue codice dal server dell'attaccante.
È stata sfruttata poche ore dopo la sua divulgazione, a dicembre 2021, e viene ancora cercata ogni giorno. La libreria si nasconde dentro altri software, quindi il lavoro è trovarne ogni copia sul server, poi aggiornare.
In sintesi
- CVE
- CVE-2021-44228
- Software
- Apache Log4j 2 (log4j-core)
- Versioni colpite
- Da 2.0-beta9 a 2.14.1, escluse le release di sicurezza 2.3.1 e 2.12.2 o successive
- Corretta in
- 2.15.0 (Java 8), 2.12.2 (Java 7), 2.3.1 (Java 6); aggiorna a 2.17.1, 2.12.4 o 2.3.2 o successive
- Punteggio CVSS
- 10.0 Critica (NVD, CVSS 3.1) ·
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H - CISA Known Exploited Vulnerabilities
- Sì, aggiunta il 10 dicembre 2021
- Pubblicata da NVD
- 10 dicembre 2021
- Patch virtuale InfraFence
vp-cve-2021-44228(ModSecurity id 9920004)
Cosa è colpito
È colpito solo log4j-core di Log4j 2, e solo da 2.0-beta9 fino alla correzione. Log4j 1.x non è colpito da questa CVE, ma è a fine vita dal 2015 e ha falle sue. Le applicazioni Java basate su Log4j 2 (application server, motori di ricerca, applicazioni su misura) portano la libreria nelle proprie cartelle, spesso dentro un .war o un .jar fat, non come pacchetto di sistema.
La prima correzione, 2.15.0, era incompleta in alcune configurazioni (CVE-2021-45046), e sono seguiti altri due problemi (CVE-2021-45105 e CVE-2021-44832). Per questo oggi l'obiettivo è 2.17.1 o successiva su Java 8, 2.12.4 su Java 7 e 2.3.2 su Java 6.
Verificare se un server ce l'ha
Cerca i file log4j-core, poi gli archivi che lo includono. La versione è nel nome del file:
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'log4j-core-*.jar' 2>/dev/nullsudo nice -n 19 ionice -c3 find / -xdev -type f \( -name '*.jar' -o -name '*.war' -o -name '*.ear' \) 2>/dev/null \
| while read -r f; do
unzip -l "$f" 2>/dev/null \
| grep -qE 'log4j/core/lookup/JndiLookup\.class|log4j-core-[0-9][^/]*\.jar' && echo "$f"
doneNota: -xdev limita la ricerca al file system radice. Ripetila per ogni altro mount dove stanno applicazioni (/opt, /srv) e controlla a parte le immagini dei container: un file dentro un'immagine non è sul disco dell'host.
Per un'applicazione che compili tu, chiedi allo strumento di build quale versione include davvero:
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-corePer vedere se qualcuno ci ha provato, cerca i lookup nei log di accesso del web server (gli attaccanti li mettono anche negli header, che questi log non registrano):
sudo grep -rhiE '\$\{jndi|%24%7Bjndi|\$\{\$\{' --include='*access*' --exclude='*.gz' /var/log/apache2 /var/log/httpd 2>/dev/null | tail -20Correggere
- Software di un fornitore: installa la release del fornitore che include Log4j 2.17.1 o successiva.
- La tua applicazione: porta
log4j-core(elog4j-api) a 2.17.1 o successiva, oppure 2.12.4 su Java 7 e 2.3.2 su Java 6, ricompila e ripubblica. Controlla con lo strumento di build che nessun'altra dipendenza riporti dentro una copia più vecchia. - Riavvia l'applicazione: una JVM in esecuzione tiene le vecchie classi fino ad allora.
- Ripeti la ricerca qui sopra: non deve restare nessun
log4j-corevecchio, anche nei backup di applicazioni pubblicate che potrebbero essere ripubblicate.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>Attenzione: Impostare log4j2.formatMsgNoLookups o rimuovere classi a mano erano rimedi provvisori di dicembre 2021, e il primo non copre tutti i casi. Considerali temporanei e aggiorna.
Come InfraFence la blocca mentre aggiorni
La patch virtuale per CVE-2021-44228 è una regola ModSecurity che esamina l'URL, gli header della richiesta, i cookie e i loro nomi, e i parametri e i loro nomi, dopo la decodifica URL. Blocca una richiesta con un ${ seguito entro pochi caratteri da jndi, o dai lookup annidati usati per nasconderlo (${lower:, ${upper:, ${env:, ${sys:, ${date:, ${::-).
Nota: La patch vede solo le richieste HTTP che passano da Apache con ModSecurity su quel server. Un'applicazione Java raggiunta sulla propria porta, o un payload che arriva per un'altra strada (un'email, una coda di messaggi), non è coperta: la correzione è l'aggiornamento.
Come viene applicata la patch
- L'agente annota quali porte SSH e quali siti rispondono.
- Scrive la regola (id ModSecurity 9920004) tra i propri marcatori nel suo file ModSecurity, esegue
apachectl configteste ricarica Apache in modo graceful. Se il test fallisce, rimette il file precedente. - Controlla che SSH e i siti rispondano ancora e, se non è così, rimuove la patch.
- Controlla che ModSecurity blocchi davvero con la regola, con una richiesta di prova locale innocua. Un ModSecurity in
DetectionOnlysi limita a registrare: la patch viene allora rimossa e segnalata come inefficace, mai come applicata.
Ogni richiesta bloccata dalla patch viene segnalata con CVE-2021-44228 (agente 1.0.37 o successivo): vedi i tentativi nell'attività del server e nella pagina Sfruttamento della dashboard, quindi sai che qualcuno sta provando la vulnerabilità contro di te.
Attenzione: Una patch virtuale blocca la forma nota dell'attacco nelle richieste che passano da Apache su quel server. Non sostituisce l'aggiornamento: installa la versione corretta, poi rimuovi la patch da Attività con Annulla se non ti serve più.
Le patch virtuali richiedono Apache con ModSecurity, l'impostazione Consenti modifiche alla configurazione del web server e nessun pannello di hosting o strumento di configuration management che gestisca il web server; fanno parte del piano Pro e di AutoMode. Le applica una persona a partire dall'analisi AI, oppure AutoMode. Vedi Patch virtuali.
Fonti
I dati di questa pagina vengono da queste fonti; controllale per eventuali aggiornamenti.
Provalo gratis su 1 server
Starter è gratuito per un server, con protezione completa e blocco automatico. Senza carta di credito.
Installa l'agent come root, con il tuo token al posto di <TOKEN>:
curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>Il token si crea nella dashboard, in Server › Aggiungi server.
