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-4255 — Laboratório Docker de ponta a ponta reproduzindo o Apache log4j2 #4255 — bypass da allowlist do FilteredObjectInputStream via java.rmi.MarshalledObject (desserialização não filtrada → RCE) no Log4j 2.26.1 / JDK 17. | Kitploit
Ferramentas/GitHubGitHub/dinosn/log4j-4255
Análise de VulnerabilidadesExploraçãoSegurança WebAprendizado e EducaçãoExploração de Binários
GitHubdinosn/log4j-4255

log4j-4255

Laboratório Docker de ponta a ponta reproduzindo o Apache log4j2 #4255 — bypass da allowlist do FilteredObjectInputStream via java.rmi.MarshalledObject (desserialização não filtrada → RCE) no Log4j 2.26.1 / JDK 17.

Ver Repositório
1813há 1 diaAinda não revisado
Site

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 →
Compartilhar

log4j2 #4255 — Bypass da allowlist do FilteredObjectInputStream via java.rmi.MarshalledObject

Um laboratório autônomo e containerizado que reproduz o problema #4255 do Apache log4j2 #4255 de ponta a ponta usando os artefatos oficiais do Log4j 2.26.1 no JDK 17, com controles positivos, um oráculo endurecido e uma mitigação validada.

⚠️ Uso responsável

Este laboratório contém um RCE funcional por desserialização contra um problema do Log4j atualmente sem correção (#4255 está ABERTO / aguardando-mantenedor no momento da escrita; nenhum CVE atribuído). Ele roda inteiramente dentro de contêineres Docker descartáveis na sua própria máquina e não se conecta a nada externo, exceto ao Maven Central (para baixar os jars oficiais) — nenhum alvo é contatado.

  • O relator original (U-Sec / Wujie Security) está retendo seu PoC até que uma correção seja publicada. Esta é uma reprodução independente construída para validação de defensores e engenharia de detecção.
  • Não execute isso contra sistemas que você não possui ou para os quais não está explicitamente autorizado a testar.
  • Isso demonstra um RCE condicional à aplicação, não um RCE universal do Log4j (consulte Escopo).

  • Resumo

    O FilteredObjectInputStream (FOIS) do Log4j é uma allowlist de desserialização baseada em resolveClass. Sua allowlist inclui java.rmi.MarshalledObject. Um MarshalledObject armazena seu payload como um byte[] opaco, e MarshalledObject.get() desserializa esse payload em um ObjectInputStream novo e sem filtro — portanto, a allowlist nunca inspeciona o grafo interno.

    O próprio Log4j aciona isso: Log4jLogEvent$LogEventProxy (a forma serializada em fio de um LogEvent, desde a versão 2.8) carrega o Message do evento dentro de um MarshalledObject e chama .get() automaticamente durante a desserialização (readResolve() → message()). Qualquer aplicação que leia um LogEvent serializado por meio do FOIS realiza, portanto, desserialização sem filtro de bytes do atacante — e como message() engole a exceção resultante e recai para SimpleMessage, o receptor registra um evento benigno e continua em execução. O exploit é silencioso.

    Causa raiz (verificada em rel/2.26.1)

    #LocalDefeito
    1log4j-api …/util/internal/SerializationUtil.javaREQUIRED_JAVA_CLASSES contém java.rmi.MarshalledObject
    2log4j-api …/util/FilteredObjectInputStream.javasobrescreve apenas resolveClass(); o payload objBytes do MarshalledObject é invisível para ele
    3log4j-core …/impl/Log4jLogEvent.javaLogEventProxy.marshalledMessage é um MarshalledObject<Message>
    4log4j-core …/impl/Log4jLogEvent.javamessage() chama marshalledMessage.get() (sem filtro) e engole todas as exceções

    O que o laboratório executa

    Um substituto fiel do descontinuado ObjectInputStreamLogEventBridge do log4j-samples: um receptor TCP não autenticado que lê um LogEvent serializado por conexão por meio do FOIS. O atacante envia um único objeto serializado; o oráculo é um arquivo de prova gravado em um diretório montado por bind apenas no contêiner do receptor, de modo que seu aparecimento prova que o código foi executado dentro do receptor via desserialização.

    #CenárioClasspath da vítimajdk.serialFilterEsperado
    S1gadget não permitido enviado no nível superior+ gadgetnenhumrejeitar — o FOIS aplica sua allowlist
    S2mesmo gadget envolvido em um LogEvent+ gadgetnenhumrce — acionamento automático (precisa da classe do gadget na vítima)
    S3CommonsCollections6 bruto no nível superiorlog4j + cc-3.2.1nenhumrejeitar — o FOIS bloqueia CC
    S4CC6 inserido no MarshalledObjectlog4j + cc-3.2.1 apenasnenhumrce — nenhuma classe do atacante na vítima
    S5payload do S4log4j + cc-3.2.1!java.rmi.MarshalledObjectrejeitar — mitigação
    S6payload do S4log4j + cc-3.2.1maxdepth=5;maxbytes=1000000silencioso — o fluxo interno herda o filtro; CC6 é profundo demais
    S7payload do S4log4j + cc-3.2.2nenhumsilencioso — a 3.2.2 desativa a desserialização de functor insegura

    rce = código executado. rejeitar = o FOIS lançou exceção no fluxo externo. silencioso = objeto externo processado, nenhum código executado (bloqueado mais profundamente, ou a versão do gadget é segura).

    Como executar

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

    Requisitos: apenas Docker (um JDK é baixado como eclipse-temurin:17-jdk). O script baixa os jars oficiais e os verifica contra o SHA-1 do Maven Central antes do uso. Fixe uma versão diferente do Log4j na faixa vulnerável com LOG4J_VERSION=2.20.0 ./run.sh.

    Impacto e método de ataque

    • Entrega: uma única gravação TCP não autenticada de ~2,8 KB de um LogEvent serializado para um receptor baseado em FOIS. Não é acionável ao fazer com que uma string seja registrada (diferente do Log4Shell) — é necessário que bytes serializados brutos cheguem à ponte de soquete.
    • Resultado: execução arbitrária de comandos no processo do receptor, silenciosamente.
    • Caminho do ataque: construir um LogEvent → o writeReplace()/writeObject() do Log4j envolve o Message em um MarshalledObject → o gadget se esconde dentro de seu byte[] opaco → no receptor, readResolve() → message() → MarshalledObject.get() abre um fluxo novo sem filtro → gadget → Runtime.exec. src/attacker/Attacker.java (poc2) insere um grafo puro de CommonsCollections6 no objBytes do MarshalledObject, portanto nenhuma classe do atacante é necessária na vítima.

    Mitigação

    • Confiável: -Djdk.serialFilter='!java.rmi.MarshalledObject' na JVM do receptor (S5). Ressalva: isso também bloqueia objetos legítimos de LogEventProxy serializados (eles usam MarshalledObject também) — é eficaz, mas não é transparente para o transporte de logs serializados.
    • Não confiável: filtros genéricos de maxdepth/maxbytes. O filtro de todo o processo se propaga para o fluxo interno do MarshalledObject e a profundidade recomeça ali, portanto maxdepth=5 bloqueia CC6 (S6), mas um gadget raso passaria. Depende da profundidade da cadeia, não é um limite.
    • Estrutural: elimine o transporte de logs serializados em Java (use JSON / RFC 5424 sobre TLS autenticado); remova dependências de gadgets conhecidos; não exponha receptores serializados legados a redes não confiáveis. Correção a montante (conforme o problema): remover MarshalledObject da allowlist e mover a mensagem serializada para os writeWrappedObject/readWrappedObject filtrados do Log4j.

    Escopo e limitações honestas

    • Condicional à aplicação, não um RCE geral do Log4j. Requer um aplicativo que exponha um receptor de LogEvent serializado não autenticado baseado em FOIS e tenha uma versão de gadget utilizável em seu classpath. Implantações comuns do Log4j não executam tal receptor.
    • O servidor de soquete serializado no núcleo existiu apenas até a 2.8.2 (net.server.TcpSocketServer foi movido para fora do log4j-core em 2017; ausente desde a 2.9.0). Receptores modernos são código de aplicação/exemplo, que este laboratório modela.
    • Depende da versão do gadget. commons-collections 3.2.1 → RCE; 3.2.2 o bloqueia (S7). Qualquer gadget utilizável é suficiente, mas "ter commons-collections" por si só não é suficiente.
    • uid=0 no laboratório é root do contêiner — não há escape do Docker; o RCE é executado como o processo do receptor.
    • A primitiva (MarshalledObject derrotando um filtro resolveClass) é arte anterior conhecida; consulte a discussão do Apache #4168 ("Endurecimento de desserialização do Log4j 2.x"). O acionamento automático específico do Log4j é a contribuição do #4255.

    Estrutura

    root@kitploit:~
    run.sh                     executor portátil (com checksum fixado, oráculo endurecido)
    Makefile                   make build | run | clean
    src/victim/Receiver.java   receptor de log FOIS (substituto do ObjectInputStreamLogEventBridge)
    src/attacker/Attacker.java construtor de payload: controles, PoC-1, PoC-2 (CC6 + inserção de bytes)
    src/attacker/EvilMessage.java  gadget autônomo do PoC-1
    docs/RESULTS.md            matriz de evidências + análise
    

    Referências

    • Problema #4255 — https://github.com/apache/logging-log4j2/issues/4255
    • Discussão #4168 (endurecimento de desserialização) — https://github.com/apache/logging-log4j2/discussions/4168
    • FAQ do Log4j sobre CWE-502 — https://logging.apache.org/security/faq.html
    • Aviso de segurança do Apache Commons Collections — https://commons.apache.org/proper/commons-collections/security.html

    Créditos

    Vulnerabilidade relatada por U-Sec (Wujie Security) no Apache log4j2 #4255. Este repositório é um laboratório independente de reprodução/validação para pesquisa defensiva e engenharia de detecção.

    Baixar ferramenta