Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
log4j-jndi-be-gone — Uma correção baseada no agente Java Byte Buddy para o CVE-2021-44228, a vulnerabilidade "JNDI LDAP" do log4j 2.x. | Kitploit
Ferramentas/GitHubGitHub/nccgroup/log4j-jndi-be-gone
Ferramentas DefensivasAnálise de VulnerabilidadesAnálise de CódigoExploraçãoSegurança da Cadeia de Suprimentos
GitHubnccgroup/log4j-jndi-be-gone

log4j-jndi-be-gone

Uma correção baseada no agente Java Byte Buddy para o CVE-2021-44228, a vulnerabilidade "JNDI LDAP" do log4j 2.x.

Ver Repositório
72165há 4 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Site
Compartilhar

log4j-jndi-be-gone

Um fix baseado em agente Java Byte Buddy para CVE-2021-44228, a vulnerabilidade "JNDI LDAP" do log4j 2.x.

Ele faz três coisas:

  • Desabilita o manipulador de método interno para strings de formato jndi: ("lookups").
  • Registra uma mensagem em System.err (ou seja, stderr) indicando que uma tentativa JNDI do log4j foi feita (incluindo a string de formato tentada, com quaisquer caracteres ${} sanitizados para evitar injeções transitivas).
  • Resolve a string de formato para "(log4j jndi disabled)" na mensagem de log (para evitar injeções transitivas).

Usage

Adicione -javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar aos seus comandos java.

Nota: Se você já tem Byte Buddy no classpath, tente usar log4j-jndi-be-gone-1.0.0.jar.

root@kitploit:~
$ java -javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar -jar path/to/some.jar

A partir da versão 1.1.0, log4j-jndi-be-gone padrão tenta lidar com versões reempacotadas (também chamadas de "shaded") do log4j que podem estar incorporadas em um JAR sob um nome de pacote alternativo para evitar colisões entre a versão de uma dependência da aplicação e a versão da mesma dependência de uma dependência. No entanto, deve-se notar que log4j parece não ser facilmente reempacotado sob nomes/prefixos de pacote alternativos devido ao uso de reflexão com nomes de classe estáticos e/ou nomes de classe de arquivos de configuração incorporados.

Esse comportamento pode ser desabilitado colocando =structureMatch=0 após o caminho do JAR do agente no argumento -javaagent:, por exemplo:

root@kitploit:~
-javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar=structureMatch=0

o que resultará no mesmo comportamento de correspondência do 1.0.0, uma simples comparação exata de string contra o nome da classe.

Obtendo log4j-jndi-be-gone

Você pode construir o JAR com ./gradlew (build/libs/log4j-jndi-be-gone-1.0.0(-standalone).jar) ou obtê-lo na página de releases.

Compatibilidade

O JAR do agente log4j-jndi-be-gone suporta Java 6-17+.

Correspondência de Classes

A implementação começa por corresponder classes com sufixos que correspondem aos sub-pacotes mais internos e ao nome de classe de org.apache.logging.log4j.core.lookup.JndiLookup, lookup.JndiLookup, já que org.apache.logging.log4j.core pode razoavelmente ser esperado ter sido distorcido por regras de reempacotamento que não buscaram preservar nomes de pacotes. Além disso, em vez de apenas realizar verificações similares para todos os outros tipos esperados do log4j, garante que eles também existam sob o mesmo pacote base.

A implementação então percorre a estrutura de qualquer classe log4j lookup.JndiLookup potencial identificada, tentando validar contra:

  • os modificadores na própria classe
  • a classe pai e/ou interfaces implementadas da classe (estas diferem entre versões do log4j)
  • a anotação org.apache.logging.log4j.core.config.plugins.Plugin esperada em todas as versões 2.x, incluindo parâmetros da anotação e seus valores
  • o método lookup(), correspondendo seus modificadores e assinatura de tipo (e ignorando a versão de 1 argumento do 2.0)
  • o método convertJndiName(), correspondendo seus modificadores e assinatura de tipo
  • o campo CONTAINER_JNDI_RESOURCE_PATH_PREFIX, correspondendo seus modificadores

Advertências

  • log4j-jndi-be-gone não funcionará se a biblioteca log4j tiver sido ofuscada ou se seus pacotes/nomes de classe tiverem sido modificados além do reempacotamento básico (ou seja, "shading").

    • Para constar, log4j 2.x é bastante inflexível em relação a ser reempacotado, então não está claro quão comuns são tais práticas.
  • log4j-jndi-be-gone-1.0.0-standalone.jar empacota o Byte Buddy. Se você já usa Byte Buddy, pode encontrar problemas com ele. Tente usar log4j-jndi-be-gone-1.0.0.jar em vez disso, embora note que log4j-jndi-be-gone espera Byte Buddy 1.12.x. A partir da versão 1.1.0, o JAR standalone do log4j-jndi-be-gone empacota um Byte Buddy reempacotado sob seu próprio prefixo de pacote. Isso deve evitar quaisquer colisões.

  • Se você substituiu suas classes JndiLookup por implementações que tentam fazer honeypotting ou registrar chamadas lookup(), log4j-jndi-be-gone irá potencialmente desabilitar o método lookup delas, impedindo seu funcionamento.

Exemplo

O diretório tests/jnditest contém um caso de teste simples onde uma chamada de log do log4j passa uma string de formato JNDI LDAP. Ele também configura seu próprio ouvinte de porta para determinar se uma tentativa de conexão foi feita pelo log4j e falha no teste se uma conexão for recebida.

root@kitploit:~
$ ./tests/jnditest/test-uninstrumented.sh

BUILD SUCCESSFUL in 1s
6 actionable tasks: 5 executed, 1 up-to-date

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 up-to-date
JUnit version 4.12
.16:08:49.547 [main] ERROR trust.nccgroup.jnditest.test.JndiTest - Hello, _${jndi:ldap://127.0.0.1:8899/evil}_!
E
Time: 0.929
There was 1 failure:
1) logging(trust.nccgroup.jnditest.test.JndiTest)
java.lang.AssertionError: jndi ldap connection received
	at org.junit.Assert.fail(Assert.java:88)
	at trust.nccgroup.jnditest.test.JndiTest.logging(JndiTest.java:55)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
	at trust.nccgroup.jnditest.Main.main(Main.java:24)

FAILURES!!!
Tests run: 1,  Failures: 1

$ ./tests/jnditest/test-instrumented.sh

BUILD SUCCESSFUL in 1s
6 actionable tasks: 5 executed, 1 up-to-date

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 up-to-date
JUnit version 4.12
.log4j jndi lookup attempted: (sanitized) ldap://127.0.0.1:8899/evil
16:09:06.064 [main] ERROR trust.nccgroup.jnditest.test.JndiTest - Hello, _(log4j jndi disabled)_!

Time: 1.362

OK (1 test)

Licença

Licenciado sob a licença Apache 2.

Compatibilidade

Versões Java Testadas

log4j-jndi-be-gone foi testado no OpenJDK 6, 8, 11 e 17, e nas JVMs HotSpot e OpenJ9.

Versões do Log4j Testadas

  • 2.0
  • 2.0.1
  • 2.0.2
  • 2.1
  • 2.2
  • 2.3
  • 2.4
  • 2.4.1
  • 2.5
  • 2.6
  • 2.6.1
  • 2.6.2
  • 2.7
  • 2.8
  • 2.8.1
  • 2.8.2
  • 2.9.0
  • 2.9.1
  • 2.10.0
  • 2.11.0
  • 2.11.1
  • 2.11.2
  • 2.12.0
  • 2.12.1
  • 2.12.2
  • 2.13.0
  • 2.13.1
  • 2.13.2
  • 2.13.3
  • 2.14.0
  • 2.14.1
  • 2.15.0
  • 2.16.0
  • 2.17.0
Baixar ferramenta