InfraFenceInfraFence

Live Security Operations

Inizia

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:

Qualsiasi distribuzione Linux
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'log4j-core-*.jar' 2>/dev/null
Qualsiasi distribuzione Linux (serve unzip)
sudo 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"
    done

Nota: -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:

Progetto Maven
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-core

Per 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):

Log di accesso di Apache
sudo grep -rhiE '\$\{jndi|%24%7Bjndi|\$\{\$\{' --include='*access*' --exclude='*.gz' /var/log/apache2 /var/log/httpd 2>/dev/null | tail -20

Correggere

  1. Software di un fornitore: installa la release del fornitore che include Log4j 2.17.1 o successiva.
  2. La tua applicazione: porta log4j-core (e log4j-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.
  3. Riavvia l'applicazione: una JVM in esecuzione tiene le vecchie classi fino ad allora.
  4. Ripeti la ricerca qui sopra: non deve restare nessun log4j-core vecchio, anche nei backup di applicazioni pubblicate che potrebbero essere ripubblicate.
Maven: fissare la versione corretta
<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

  1. L'agente annota quali porte SSH e quali siti rispondono.
  2. Scrive la regola (id ModSecurity 9920004) tra i propri marcatori nel suo file ModSecurity, esegue apachectl configtest e ricarica Apache in modo graceful. Se il test fallisce, rimette il file precedente.
  3. Controlla che SSH e i siti rispondano ancora e, se non è così, rimuove la patch.
  4. Controlla che ModSecurity blocchi davvero con la regola, con una richiesta di prova locale innocua. Un ModSecurity in DetectionOnly si 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.