
Un banco di prova per sperimentare le mitigazioni della vulnerabilità Log4Shell (CVE-2021-44228)
Un parco giochi per sperimentare con le mitigazioni della vulnerabilità critica log4j (nota anche come Log4Shell) (CVE-2021-44228).
Questo particolare problema risiede nella funzionalità JndiLookup e nella capacità di log4j di interpretare TUTTI gli argomenti di una chiamata di logging.
Ci si aspetterebbe che interpreti solo il messaggio di formato (il primo argomento di una chiamata di logging), ad esempio il Hello {} in log.info("Hello {}", "${jndi:ldap://127.0.0.1:8081}"), ma invece li interpreta tutti.
Le mitigazioni impediscono a log4j di attivare i lookup jndi, ma consentono comunque altri lookup come ${java:version}.
NB: dalla versione log4j 2.16.0 (LOG4J2-3211; diff) il messaggio di formato non viene più interpretato.
Questa vulnerabilità può essere attivata da remoto quando l'applicazione di destinazione registra qualsiasi dato fornito dall'utente, ad esempio, da queste comuni intestazioni HTTP:
AcceptCookieLocationOriginRefererUser-AgentX-Api-VersionX-Forwarded-ForX-Forwarded-HostX-Requested-WithCompilazione:
sudo apt-get install -y openjdk-11-jdk-headless
wget https://archive.apache.org/dist/logging/log4j/2.10.0/apache-log4j-2.10.0-bin.tar.gz
wget https://archive.apache.org/dist/logging/log4j/2.16.0/apache-log4j-2.16.0-bin.tar.gz
tar xf apache-log4j-2.10.0-bin.tar.gz
tar xf apache-log4j-2.16.0-bin.tar.gz
javac -Werror -cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar Server.java
Prova una versione vulnerabile di log4j:
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
Prova a rimuovere la classe JndiLookup dal classpath come mitigazione:
cp apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar log4j-core-2.10.0-without-jndi-lookup.jar
zip -q -d log4j-core-2.10.0-without-jndi-lookup.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:log4j-core-2.10.0-without-jndi-lookup.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
Prova la mitigazione tramite variabile d'ambiente:
NB Dal 2021-12-15 (all'incirca la data di rilascio di log4j 2.16.0 / CVE-2021-45046) questa non è più consigliata.
LOG4J_FORMAT_MSG_NO_LOOKUPS=true \
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
Prova una versione di log4j non vulnerabile:
java \
-cp apache-log4j-2.16.0-bin/log4j-api-2.16.0.jar:apache-log4j-2.16.0-bin/log4j-core-2.16.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
Prova grype per vedere se rileva la vulnerabilità:
wget https://github.com/anchore/grype/releases/download/v0.27.2/grype_0.27.2_linux_amd64.tar.gz
tar xf grype_0.27.2_linux_amd64.tar.gz grype
./grype dir:.
Prova trivy per vedere se rileva la vulnerabilità:
wget https://github.com/aquasecurity/trivy/releases/download/v0.21.2/trivy_0.21.2_Linux-64bit.tar.gz
tar xf trivy_0.21.2_Linux-64bit.tar.gz trivy
./trivy fs --security-checks vuln .