Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
log4j-4255 — End-to-End-Docker-Lab, das Apache log4j2 #4255 reproduziert — FilteredObjectInputStream-Allowlist-Bypass über java.rmi.MarshalledObject (ungefilterte Deserialisierung → RCE) auf Log4j 2.26.1 / JDK 17. | Kitploit
Tools/GitHubGitHub/dinosn/log4j-4255
SchwachstellenanalyseExploitationWebsicherheitLernen & BildungBinary-Exploitation
GitHubdinosn/log4j-4255

log4j-4255

End-to-End-Docker-Lab, das Apache log4j2 #4255 reproduziert — FilteredObjectInputStream-Allowlist-Bypass über java.rmi.MarshalledObject (ungefilterte Deserialisierung → RCE) auf Log4j 2.26.1 / JDK 17.

Repository anzeigen
1813vor 1 TagNoch nicht geprüft
Webseite

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

log4j2 #4255 — FilteredObjectInputStream-Allowlist-Bypass über java.rmi.MarshalledObject

Ein in sich geschlossenes, containerisiertes Labor, das Apache log4j2 Issue #4255 Ende-zu-Ende gegen die offiziellen Log4j-2.26.1-Artefakte auf JDK 17 reproduziert – mit Positivkontrollen, einem gehärteten Orakel und einer validierten Gegenmaßnahme.

⚠️ Verantwortungsvolle Nutzung

Dieses Labor enthält eine funktionierende Deserialisierungs-RCE gegen ein derzeit nicht gepatchtes Log4j-Problem (#4255 ist OPEN / waiting-for-maintainer zum Zeitpunkt der Erstellung; keine CVE zugewiesen). Es läuft vollständig in wegwerfbaren Docker-Containern auf Ihrem eigenen Rechner und verbindet sich mit nichts Externem außer Maven Central (zum Herunterladen der offiziellen JARs) – es wird kein Ziel kontaktiert.

  • Der ursprüngliche Melder (U-Sec / Wujie Security) hält seinen PoC bis zu einem Fix zurück. Dies ist eine unabhängige Reproduktion, die für die Validierung durch Verteidiger und Erkennungsentwicklung erstellt wurde.
  • Führen Sie dies nicht gegen Systeme aus, die Sie nicht besitzen oder für die Sie nicht ausdrücklich autorisiert sind.
  • Dies demonstriert eine anwendungsbedingte RCE, keine universelle Log4j-RCE (siehe Umfang).

  • TL;DR

    Der FilteredObjectInputStream (FOIS) von Log4j ist eine auf resolveClass basierende Deserialisierungs-Allowlist. Seine Allowlist enthält java.rmi.MarshalledObject. Ein MarshalledObject speichert seine Nutzlast als undurchsichtiges byte[], und MarshalledObject.get() deserialisiert diese Nutzlast auf einem frischen, ungefilterten ObjectInputStream – die Allowlist inspiziert den inneren Graphen also nie.

    Log4j löst dies selbst aus: Log4jLogEvent$LogEventProxy (die serialisierte Drahtform eines LogEvent, seit 2.8) trägt die Ereignis-Message in einem MarshalledObject und ruft .get() automatisch während der Deserialisierung auf (readResolve() → message()). Jede Anwendung, die ein serialisiertes LogEvent über FOIS liest, führt daher eine ungefilterte Deserialisierung von Angreifer-Bytes durch – und da message() die resultierende Ausnahme verschluckt und auf SimpleMessage zurückfällt, protokolliert der Empfänger ein harmloses Ereignis und läuft weiter. Der Exploit ist still.

    Grundursache (verifiziert gegen rel/2.26.1)

    #OrtDefekt
    1log4j-api …/util/internal/SerializationUtil.javaREQUIRED_JAVA_CLASSES enthält java.rmi.MarshalledObject
    2log4j-api …/util/FilteredObjectInputStream.javaüberschreibt nur resolveClass(); die MarshalledObject-objBytes-Nutzlast ist für ihn unsichtbar
    3log4j-core …/impl/Log4jLogEvent.javaLogEventProxy.marshalledMessage ist ein MarshalledObject<Message>
    4log4j-core …/impl/Log4jLogEvent.javamessage() ruft marshalledMessage.get() (filterlos) auf und verschluckt alle Ausnahmen

    Was das Labor ausführt

    Ein getreuer Stellvertreter für die veraltete log4j-samples-ObjectInputStreamLogEventBridge: ein nicht authentifizierter TCP-Empfänger, der ein serialisiertes LogEvent pro Verbindung über FOIS liest. Der Angreifer sendet ein einzelnes serialisiertes Objekt; das Orakel ist eine Beweisdatei, die in ein Verzeichnis geschrieben wird, das nur in den Empfänger-Container bind-gemountet ist, sodass ihr Erscheinen beweist, dass Code im Empfänger über Deserialisierung ausgeführt wurde.

    #SzenarioVictim-Classpathjdk.serialFilterErwartet
    S1nicht erlaubtes Gadget top-level gesendet+ Gadgetkeineablehnen — FOIS erzwingt seine Allowlist
    S2dasselbe Gadget eingewickelt in ein LogEvent+ Gadgetkeinerce — automatischer Auslöser (benötigt die Gadget-Klasse auf dem Opfer)
    S3rohes CommonsCollections6 top-levellog4j + cc-3.2.1keineablehnen — FOIS blockiert CC
    S4CC6 in das MarshalledObject eingefügtlog4j + cc-3.2.1 nurkeinerce — keine Angreifer-Klasse auf dem Opfer
    S5S4-Nutzlastlog4j + cc-3.2.1!java.rmi.MarshalledObjectablehnen — Gegenmaßnahme
    S6S4-Nutzlastlog4j + cc-3.2.1maxdepth=5;maxbytes=1000000still — innerer Stream erbt den Filter; CC6 zu tief
    S7S4-Nutzlastlog4j + cc-3.2.2keinestill — 3.2.2 deaktiviert unsichere Functor-Deserialisierung

    rce = Code ausgeführt. reject = FOIS warf auf dem äußeren Stream. silent = äußeres Objekt verarbeitet, kein Code ausgeführt (tiefer blockiert, oder Gadget-Version ist sicher).

    Ausführen

    root@kitploit:~
    ./run.sh            # oder: make run
    

    Anforderungen: nur Docker (ein JDK wird als eclipse-temurin:17-jdk gezogen). Das Skript lädt die offiziellen JARs herunter und verifiziert sie vor der Verwendung gegen die SHA-1 von Maven Central. Eine andere Log4j-Version im verwundbaren Bereich festlegen mit LOG4J_VERSION=2.20.0 ./run.sh.

    Auswirkungen & Angriffsmethode

    • Zustellung: ein einzelner nicht authentifizierter ~2,8-KB-TCP-Write eines serialisierten LogEvent an einen FOIS-basierten Empfänger. Es ist nicht durch das Protokollieren eines Strings auslösbar (anders als Log4Shell) – es benötigt rohe serialisierte Bytes, die die Socket-Bridge erreichen.
    • Ergebnis: beliebige Befehlsausführung im Empfängerprozess, still.
    • Angriffspfad: ein LogEvent erstellen → writeReplace()/writeObject() von Log4j wickelt die Message in ein MarshalledObject → das Gadget versteckt sich in seinem undurchsichtigen byte[] → auf dem Empfänger: readResolve() → message() → MarshalledObject.get() öffnet einen frischen ungefilterten Stream → Gadget → Runtime.exec. src/attacker/Attacker.java (poc2) fügt einen reinen CommonsCollections6-Graphen in die objBytes des MarshalledObject ein, sodass keine Angreifer-Klasse auf dem Opfer benötigt wird.

    Gegenmaßnahmen

    • Zuverlässig: -Djdk.serialFilter='!java.rmi.MarshalledObject' auf der Empfänger-JVM (S5). Einschränkung: dies blockiert auch legitime serialisierte LogEventProxy-Objekte (sie verwenden ebenfalls MarshalledObject) – es ist wirksam, aber nicht transparent für serialisierten Log-Transport.
    • Unzuverlässig: generische maxdepth/maxbytes-Filter. Der prozessweite Filter pflanzt sich in den inneren MarshalledObject-Stream fort und die Tiefe startet dort neu, sodass maxdepth=5 CC6 blockiert (S6), aber ein flaches Gadget durchkommen würde. Ketten-Tiefen-abhängig, keine Grenze.
    • Strukturell: Java-serialisierten Log-Transport eliminieren (JSON / RFC 5424 über authentifiziertes TLS verwenden); bekannte Gadget-Abhängigkeiten entfernen; keine veralteten serialisierten Empfänger ungeschützten Netzwerken aussetzen. Upstream-Fix (laut Issue): MarshalledObject aus der Allowlist entfernen und die marshalled Message auf Log4js gefilterte writeWrappedObject/readWrappedObject umstellen.

    Umfang & ehrliche Einschränkungen

    • Anwendungsbedingt, keine allgemeine Log4j-RCE. Es erfordert eine App, die einen nicht authentifizierten FOIS-basierten serialisierten-LogEvent-Empfänger bereitstellt und eine nutzbare Gadget-Version auf ihrem Classpath hat. Gewöhnliche Log4j-Bereitstellungen führen keinen solchen Empfänger aus.
    • Der In-Core-serialisierte Socket-Server existierte nur bis 2.8.2 (net.server.TcpSocketServer wurde 2017 aus log4j-core entfernt; ab 2.9.0 nicht vorhanden). Moderne Empfänger sind Anwendungs-/Beispielcode, den dieses Labor modelliert.
    • Gadget-Versions-abhängig. commons-collections 3.2.1 → RCE; 3.2.2 blockiert es (S7). Jedes nutzbare Gadget genügt, aber „hat commons-collections" ist für sich genommen nicht ausreichend.
    • uid=0 im Labor ist Container-Root – es gibt keinen Docker-Escape; die RCE läuft als Empfängerprozess.
    • Das Primitive (MarshalledObject, das einen resolveClass-Filter aushebelt) ist bekannter Stand der Technik; siehe Apache-Diskussion #4168 („Log4j 2.x deserialization hardening"). Der Log4j-spezifische automatische Auslöser ist der Beitrag von #4255.

    Aufbau

    root@kitploit:~
    run.sh                     portabler Runner (prüfsummen-pinned, gehärtetes Orakel)
    Makefile                   make build | run | clean
    src/victim/Receiver.java   FOIS-Log-Empfänger (ObjectInputStreamLogEventBridge-Stellvertreter)
    src/attacker/Attacker.java Nutzlast-Ersteller: Kontrollen, PoC-1, PoC-2 (CC6 + Byte-Splice)
    src/attacker/EvilMessage.java  PoC-1 in sich geschlossenes Gadget
    docs/RESULTS.md            Evidenz-Matrix + Analyse
    

    Referenzen

    • Issue #4255 — https://github.com/apache/logging-log4j2/issues/4255
    • Diskussion #4168 (Deserialisierungs-Härtung) — https://github.com/apache/logging-log4j2/discussions/4168
    • Log4j CWE-502 FAQ — https://logging.apache.org/security/faq.html
    • Apache Commons Collections Sicherheitshinweis — https://commons.apache.org/proper/commons-collections/security.html

    Danksagungen

    Schwachstelle gemeldet von U-Sec (Wujie Security) in Apache log4j2 #4255. Dieses Repository ist ein unabhängiges Reproduktions-/Validierungslabor für defensive Forschung und Erkennungsentwicklung.

    Tool herunterladen