Jenkins ClassFilter Deserialization Bypass → Arbitrary File Read — CVE-2026-53435
by AmesianX (built interactively with Claude Code / Anthropic models per repo README) · 2026-07-05
- Severity
- High (advisory also describes user impersonation and Script Console RCE via the same primitive; this PoC demonstrates file-read impact only)
- CVE
- CVE-2026-53435 (Jenkins SECURITY-3707)
- Category
- web
- Affected product
- Jenkins (core), View configuration (config.xml) deserialization path
- Affected versions
- Jenkins weekly ≤ 2.567, LTS ≤ 2.555.2. Fixed in weekly 2.568 / LTS 2.555.3.
- Disclosed
- 2026-07-05
- Patch status
- patched
Tags
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-06 |
| Author / Researcher | AmesianX (built interactively with Claude Code / Anthropic models per repo README) |
| CVE / Advisory | CVE-2026-53435 (Jenkins SECURITY-3707) |
| Category | web |
| Severity | High (advisory also describes user impersonation and Script Console RCE via the same primitive; this PoC demonstrates file-read impact only) |
| CVSS Score | Not disclosed in source (repo references “CVSS 9.1/8.8” as talking points but does not cite the authoritative advisory score) |
| Status | PoC |
| Tags | jenkins, deserialization, classfilter-bypass, xstream, config-xml, stapler, arbitrary-file-read, docker-lab, cwe-502 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Jenkins (core), View configuration (config.xml) deserialization path |
| Versions Affected | Jenkins weekly ≤ 2.567, LTS ≤ 2.555.2. Fixed in weekly 2.568 / LTS 2.555.3. |
| Language / Platform | Python 3 (requests) exploit; Docker/Groovy lab running Jenkins LTS |
| Authentication Required | Yes — low-privilege account with View/Configure (or Item/Configure) permission plus Overall/Read |
| Network Access Required | Yes |
Summary
Jenkins restricts deserialization via a custom ClassFilter that only allows types defined in Jenkins core or installed plugins. CVE-2026-53435 shows this whitelist is insufficient: an attacker who can POST a view’s config.xml can get Jenkins to deserialize a legitimate core type (hudson.Plugin$DummyImpl) into a context that never expected it — specifically into a ListView’s <properties> list, a DescribableList<ViewProperty> that, pre-patch, does not enforce its element type. The planted object carries baseResourceURL=file:/, and routing an HTTP request to it via Stapler then serves arbitrary files straight from the controller’s filesystem. The included Python exploit automates creating (or overwriting) a view with the malicious XML and then requesting the planted gadget’s route to read a target file such as /etc/passwd.
Vulnerability Details
Root Cause
Insufficient type enforcement in DescribableList<ViewProperty> (used by hudson.model.ListView) prior to the patch: XStream2 deserializes any Jenkins-core/plugin-resident type accepted by ClassFilter into the properties list without verifying it actually implements ViewProperty. Because hudson.Plugin$DummyImpl is a core type, it passes the class-location whitelist, then becomes reachable over HTTP via Stapler’s doDynamic/property-index routing, which serves files from the object’s attacker-controlled baseResourceURL (CWE-502: Deserialization of Untrusted Data).
Attack Vector
- Authenticate as a low-privileged Jenkins user with
View/Configure(create) or the ability to POST a view’sconfig.xml, plusOverall/Read. - POST a crafted
config.xml(via/createView?name=...or/view/<name>/config.xml) containing ahudson.model.ListViewwhose<properties>element embeds<hudson.Plugin_-DummyImpl>with<wrapper><baseResourceURL>file:/</baseResourceURL></wrapper>. - Jenkins deserializes and stores the planted
Plugin$DummyImplobject as a view property, bypassing the intended type constraint. - Send
GET /view/<name>/properties/0/<path-to-file>— Stapler routes the request into the planted object’sdoDynamichandler, which serves the requested file relative tofile:/. - Read the HTTP response body, which contains the contents of the requested file (e.g.
/etc/passwd).
Impact
Any authenticated user meeting a very common permission bar (View/Configure or Item/Configure + Overall/Read) can read arbitrary files from the Jenkins controller’s filesystem. The upstream advisory additionally documents user-impersonation and Script Console RCE reachable via the same deserialization primitive; those chains are intentionally withheld from this PoC by the original author.
Environment / Lab Setup
Target: Jenkins LTS 2.555.2 (vulnerable) — docker/jenkins-lts image, matrix-auth plugin,
low-priv user "lowpriv" (Overall/Read + Item Create/Configure/Read) via init.groovy.d
Attacker: Python 3 + requests, against http://<jenkins-host>:8080
Negative control: Jenkins LTS 2.555.3 (patched) on a second container for before/after comparison
Proof of Concept
PoC Script
See
exploit_cve_2026_53435_v2.pyin this folder. Thelab/subdirectory contains a Docker Compose lab (vulnerable + patched Jenkins containers, an OOB listener, and Groovy user provisioning) used to reproduce and demonstrate the bug, andtranscript/contains the original author’s full working session logs (English and Korean) documenting how the exploit chain was derived.
| |
The script authenticates, fetches a CSRF crumb, attempts to create a new ListView (or falls back to overwriting an existing writable view) carrying the hudson.Plugin$DummyImpl gadget with baseResourceURL=file:/, then issues a GET against the planted view’s properties/0/<file> route and prints the returned file contents.
To stand up the companion lab:
| |
Detection & IOCs
Signs of compromise:
- View
config.xmlsubmissions containing unexpected core-type elements (e.g.hudson.Plugin_-DummyImpl, or other core/plugin classes) inside<properties> - Requests to
/view/<name>/properties/0/...returning filesystem content instead of expected view-property data - New or modified views created by non-administrative accounts shortly before anomalous file-path GET requests
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade to Jenkins weekly ≥ 2.568 or LTS ≥ 2.555.3, which tightens the deserialization type filter so planted objects are rejected before being stored |
| Interim mitigation | Restrict View/Configure, Item/Configure, and Agent/Configure permissions to trusted administrators only; disable anonymous read; network-isolate the Jenkins controller from untrusted users until patched |
References
- Source repository
- Jenkins advisory: https://www.jenkins.io/security/advisory/2026-06-10/
Notes
Mirrored from https://github.com/AmesianX/CVE-2026-53435 on 2026-07-05. The upstream lab/README.md references a differently-named script (poc_cve_2026_53435.py with triage/canary/discover subcommands) that is not present in the repository as cloned — only exploit_cve_2026_53435_v2.py (the direct create-view/overwrite-view file-read exploit) exists in the mirrored source; this discrepancy is preserved as-is from upstream rather than corrected. The poc.png screenshot and both session transcripts (transcript/session_en.txt, transcript/session_ko.txt) are included as supplied by the author to document the exploit-development process.
| |