Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
log4j-jndi-be-gone — Una correzione basata su agente Java Byte Buddy per CVE-2021-44228, la vulnerabilità log4j 2.x "JNDI LDAP". | Kitploit
Strumenti/GitHubGitHub/nccgroup/log4j-jndi-be-gone
Strumenti DifensiviAnalisi delle VulnerabilitàAnalisi del CodiceExploitSicurezza della Supply Chain
GitHubnccgroup/log4j-jndi-be-gone

log4j-jndi-be-gone

Una correzione basata su agente Java Byte Buddy per CVE-2021-44228, la vulnerabilità log4j 2.x "JNDI LDAP".

Vedi Repository
721654 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Sito web
Condividi

log4j-jndi-be-gone

Un fix basato su un agente Java Byte Buddy per CVE-2021-44228, la vulnerabilità "JNDI LDAP" di log4j 2.x.

Fa tre cose:

  • Disabilita il gestore interno del metodo per le stringhe di formato jndi: ("lookups").
  • Registra un messaggio su System.err (cioè stderr) indicando che è stato effettuato un tentativo JNDI su log4j (inclusa la stringa di formato tentata, con eventuali caratteri ${} sanificati per prevenire iniezioni transitive).
  • Risolve la stringa di formato in "(log4j jndi disabled)" nel messaggio di log (per prevenire iniezioni transitive).

Utilizzo

Aggiungi -javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar ai tuoi comandi java.

Nota: Se hai già Byte Buddy nel classpath, prova a usare 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 partire dalla versione 1.1.0, log4j-jndi-be-gone tenta per impostazione predefinita di gestire le versioni ripacchettizzate (aka "shaded") di log4j che possono essere incorporate in un JAR sotto un nome di pacchetto alternativo per prevenire collisioni tra la versione di una dipendenza dell'applicazione e la versione della stessa dipendenza di un'altra dipendenza. Tuttavia, va notato che log4j non sembra essere facilmente ripacchettizzabile con nomi/prefix di pacchetto alternativi a causa dell'uso di riflessione con nomi di classe statici e/o nomi di classe da file di configurazione incorporati.

Questo comportamento può essere disabilitato inserendo =structureMatch=0 dopo il percorso del JAR dell'agente nell'argomento -javaagent:, ad esempio:

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

che comporterà lo stesso comportamento di corrispondenza della versione 1.0.0, un semplice confronto esatto di stringhe rispetto al nome della classe.

Ottenere log4j-jndi-be-gone

Puoi creare il JAR con ./gradlew (build/libs/log4j-jndi-be-gone-1.0.0(-standalone).jar) o prelevarlo dalla pagina delle release.

Compatibilità

Il JAR dell'agente log4j-jndi-be-gone supporta Java 6-17+.

Corrispondenza delle classi

L'implementazione inizia cercando classi con suffissi che corrispondono ai sotto-pacchetti più interni e al nome della classe di org.apache.logging.log4j.core.lookup.JndiLookup, lookup.JndiLookup, poiché ci si può ragionevolmente aspettare che org.apache.logging.log4j.core sia stato modificato da regole di ripacchettizzamento che non cercavano di preservare i nomi dei pacchetti. Inoltre, invece di eseguire semplicemente controlli simili per tutti gli altri tipi previsti di log4j, si assicura che esistano anche sotto lo stesso pacchetto di base.

L'implementazione poi esamina la struttura di qualsiasi classe potenziale lookup.JndiLookup di log4j identificata, tentando di convalidare rispetto a:

  • i modificatori sulla classe stessa
  • la classe genitore e/o le interfacce implementate (queste differiscono tra le versioni di log4j)
  • l'annotazione org.apache.logging.log4j.core.config.plugins.Plugin prevista in tutte le versioni 2.x, inclusi i parametri dell'annotazione e i loro valori
  • il metodo lookup(), verificando i suoi modificatori e la firma del tipo (e ignorando la versione a 1 argomento della 2.0)
  • il metodo convertJndiName(), verificando i suoi modificatori e la firma del tipo
  • il campo CONTAINER_JNDI_RESOURCE_PATH_PREFIX, verificando i suoi modificatori

Avvertenze

  • log4j-jndi-be-gone non funzionerà se la libreria log4j è stata offuscata o se i suoi pacchetti/nomi di classe sono stati modificati in modo diverso da un semplice ri-pacchettizzamento (cioè "shading").

    • A dire il vero, log4j 2.x è piuttosto inflessibile riguardo al ripacchettizzamento, quindi non è chiaro quanto siano comuni tali pratiche.
  • log4j-jndi-be-gone-1.0.0-standalone.jar include Byte Buddy al suo interno. Se usi già Byte Buddy, potresti incontrare problemi. Prova log4j-jndi-be-gone-1.0.0.jar invece, anche se nota che log4j-jndi-be-gone si aspetta Byte Buddy 1.12.x. A partire dalla versione 1.1.0, il JAR standalone di log4j-jndi-be-gone include una versione ripacchettizzata di Byte Buddy sotto il proprio prefisso di pacchetto. Questo dovrebbe prevenire qualsiasi collisione.

  • Se hai sostituito le tue classi JndiLookup con implementazioni che tentano di fare honeypotting o registrare chiamate lookup(), log4j-jndi-be-gone potrebbe potenzialmente disabilitare il loro metodo lookup, impedendone il funzionamento.

Esempio

La directory tests/jnditest contiene un semplice caso di test in cui una chiamata di log di log4j passa una stringa di formato JNDI LDAP. Imposta anche un proprio listener di porta per determinare se log4j ha effettuato un tentativo di connessione e fa fallire il test se è stata ricevuta una connessione.

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)

Licenza

Concesso in licenza secondo la licenza Apache 2.

Compatibilità

Versioni Java testate

log4j-jndi-be-gone è stato testato su OpenJDK 6, 8, 11 e 17, e sulle JVM HotSpot e OpenJ9.

Versioni log4j testate

  • 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
Scarica lo strumento